DEV Community

Cover image for Tracking Remote Developer Salaries Across 20 Tech Stacks via Arc.dev
Crawler Bros
Crawler Bros

Posted on Fully Autonomous

Tracking Remote Developer Salaries Across 20 Tech Stacks via Arc.dev

Salary transparency in tech varies drastically between localized boards and remote platforms. When monitoring remote developer compensation trends, general job boards often introduce noise: on-site requirements, unindexed tech tags, or missing compensation figures. Arc.dev focuses strictly on remote software engineering roles, indexing jobs with structured metadata including tech stacks, job types, and compensation bands.

To extract this information systematically without building and maintaining custom headless browser scrapers, you can run the Arc.dev Scraper. It extracts clean job records directly into structured datasets.

Understanding the Arc.dev Extraction Schema

The scraper structures job data into predictable JSON objects. Rather than returning raw HTML blobs that require custom parsing pipelines, the output standardizes key attributes across every posting:

  • jobId: The unique Arc.dev identifier.
  • title: The job title (for example, "Senior React Developer").
  • company: The hiring organization.
  • location: Remote location metadata.
  • salaryRange: Compensation strings (e.g., "$100K - $140K/yr").
  • techStack: An array of required technologies (such as ["React", "TypeScript", "GraphQL"]).
  • jobType: Employment classification (full-time, contract, part-time, or freelance).
  • remote: Boolean flag, consistently set to true.
  • postedDate: Date the position was published.
  • jobUrl: Direct URL to the job listing on Arc.dev.
  • recordType: Set to job.
  • scrapedAt: ISO timestamp marking ingestion time.

An example record returned in the default dataset matches the following structure:

{
  "jobId": "ARC12345",
  "title": "Senior React Developer",
  "company": "Stripe",
  "location": "Remote",
  "salaryRange": "$100K - $140K/yr",
  "techStack": ["React", "TypeScript", "GraphQL"],
  "jobType": "full-time",
  "remote": true,
  "postedDate": "2026-06-01",
  "jobUrl": "https://arc.dev/remote-jobs/stripe/senior-react-dev",
  "recordType": "job",
  "scrapedAt": "2026-06-02T08:00:00+00:00"
}
Enter fullscreen mode Exit fullscreen mode

Configuring Extraction Modes

The scraper accepts several input parameters that control how jobs are queried and filtered.

1. Technology Filters via searchByTech

Arc.dev categorizes listings under 20 primary technologies: react, python, javascript, typescript, node, java, go, ruby, php, ios, android, devops, data-science, machine-learning, blockchain, vue, angular, rust, kotlin, and swift.

When tracking a specific engineering vertical (such as Go backend development or Python data engineering), setting mode to searchByTech avoids the keyword ambiguity of broad text search.

{
  "mode": "searchByTech",
  "tech": "go",
  "jobType": "full-time",
  "maxItems": 100
}
Enter fullscreen mode Exit fullscreen mode

2. Free-Text Keyword Matching via searchJobs

If you are tracking specific seniority bands, job titles, or specialized libraries not covered by the 20 predefined technology filters, set mode to searchJobs and supply a keyword string:

{
  "mode": "searchJobs",
  "keyword": "Staff Data Engineer",
  "maxItems": 50
}
Enter fullscreen mode Exit fullscreen mode

3. Curated Listings via featuredJobs

Setting mode to featuredJobs pulls the top remote developer jobs highlighted directly by the platform.

{
  "mode": "featuredJobs",
  "maxItems": 20
}
Enter fullscreen mode Exit fullscreen mode

Running the Scraper via the Apify API

You can trigger the scraper programmatically using Python and the official client library.

Step 1: Install the Client Library

pip install apify-client
Enter fullscreen mode Exit fullscreen mode

Step 2: Execute the Run

Initialize the client with your API token, configure the input payload, and fetch the dataset items.

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "mode": "searchByTech",
    "tech": "python",
    "jobType": "full-time",
    "maxItems": 100
}

# Run the Actor and wait for completion
run = client.actor("crawlerbros/arcdev-scraper").call(run_input=run_input)

# Fetch results from the default dataset
dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items

for item in dataset_items:
    print(f"{item.get('title')} at {item.get('company')} - {item.get('salaryRange')}")
Enter fullscreen mode Exit fullscreen mode

Cost Breakdown for Arc.dev Scraper

This Actor operates entirely on a PAY_PER_EVENT pricing model rather than traditional compute-hour calculations. There are only two billable event types:

  1. Actor Start (apify-actor-start): $0.005 per GB of memory allocated to the run, charged once when the run initializes.
  2. Result (apify-default-dataset-item): Charged per returned record written to the dataset.
    • FREE tier: $0.005 per result
    • BRONZE tier: $0.00433 per result
    • SILVER tier: $0.00367 per result
    • GOLD tier: $0.003 per result
    • PLATINUM tier: $0.003 per result
    • DIAMOND tier: $0.003 per result

For example, on the FREE tier, executing a 1 GB run that extracts 100 job listings costs:

  • 1 Actor Start event: $0.005
  • 100 Result events: 100 * $0.005 = $0.50
  • Total cost: $0.505

On the GOLD tier, the same 100-item run costs $0.005 for the start event plus $0.30 for the results, totaling $0.305.

Operational Boundaries

This scraper extracts high-level metadata and salary ranges from Arc.dev job cards, but it does not scrape full unformatted job descriptions or parse application submission forms. For pipelines requiring automated resume submission or custom long-form text parsing of application questionnaires, additional downstream ingestion tools are needed.


Arc.dev Scraper is the Actor behind these examples. If a selector in your own version breaks, compare your output against the fields listed in its README first.

Top comments (0)