ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits avatar

ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits

Under maintenance

Pricing

from $4.00 / 1,000 results

Go to Apify Store
ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits

ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits

Under maintenance

Scrape ZipRecruiter listings with numeric salary on every row, benefits, structured location, and an honest disclosed-vs-predicted salary flag.

Pricing

from $4.00 / 1,000 results

Rating

0.0

(0)

Developer

Axery

Axery

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

ZipRecruiter Jobs Scraper (US & Canada)

Scrapes job listings from ziprecruiter.com over plain HTTP — no browser, no login, no cookies.

What makes this different

Salary on every row — and an honest label on it. In a live test run, 10 of 10 listings carried a numeric salary range, against roughly 1 in 6 on SEEK. ZipRecruiter publishes pay as numbers, so nothing has to be parsed out of a display string.

The catch that other scrapers ignore: ZipRecruiter does not only republish salaries employers stated — it also predicts them, and does not make the difference obvious. In the same test run, 4 of the 10 figures were predictions. This Actor surfaces that distinction:

"salary": {
"min": 120700, "max": 159100, "currency": "USD", "period": "year",
"is_estimated": true, "salary_source": "SOURCE_PREDICTED",
"raw": "USD 120,700 - USD 159,100 per year"
}

Filter on is_estimated before building any pay benchmark. A dataset that mixes modelled bands with disclosed ones will read as authoritative and be wrong. The disclosedSalaryOnly dataset view exists for exactly this.

Benefits. Medical, dental, vision, PTO, retirement and more, parsed per listing — data most job boards do not expose at all.

Structured location, no parsing. City, state, country code and a remote flag come straight from the source.

Incremental mode. Only listings not seen before, and you are charged only for those rows.

One schema across boards. Same record shape as the SEEK, JobStreet and Himalayas Actors, with a source-prefixed job_id.

How it gets through

Two gates, documented because they are the whole difficulty of this target:

  1. TLS fingerprint. Every Chrome and Safari impersonation profile returns HTTP 403 from a clean IP; firefox133 returns 200 with the full document. The same headers under a Chrome fingerprint still fail, so this is a JA3-level check, not a header check. The client pins the Firefox profile deliberately.
  2. IP reputation. ZipRecruiter refuses datacenter ranges regardless of fingerprint. Apify Residential proxy is required, not optional. The input schema defaults to it.

There is no public JSON search endpoint — /api/jobs returns 403 — so the client decodes the Next.js React Server Component payload embedded in the results page, where the full records live under jobKeysMap.

Input

FieldTypeNotes
queriesarrayJob titles or keywords.
locationstringAustin, TX, United States, Canada.
radiusintegerMiles around the location.
daysenumPosted within N days.
refineBySalaryintegerMinimum annual figure — filters on ZipRecruiter's number, which may be its own prediction.
employmentTypeenumFull time / Part time / Contract / Internship.
maxItemsintegerPer query. 0 = unlimited, bounded by the ceiling below.
incrementalbooleanOnly listings not seen in previous runs.
proxyConfigurationobjectResidential required.

Known limits

  • Pagination ceiling around page 20. Past it ZipRecruiter repeats listings rather than returning new ones. The Actor detects an all-duplicate page and stops cleanly instead of paying for the same rows twice. Narrow by location, radius or salary floor to reach deeper.
  • Roughly 40% of salaries are predicted. Not a bug, and not hidden — see is_estimated.
  • No job category taxonomy. ZipRecruiter does not expose one in this payload, so category is null. benefits and structured location more than make up for it.
  • Layout coupling. Because the data comes from an RSC payload rather than a documented API, a front-end rewrite can break extraction. The client fails loudly with a specific message (no jobKeysMap) rather than silently returning zero rows.

Sister Actors

ActorCovers
SEEK Jobs ScraperAustralia, New Zealand
JobStreet & JobsDB Jobs ScraperIndonesia, Malaysia, Singapore, Philippines, Thailand, Hong Kong
Himalayas Remote Jobs Scraper100,000+ worldwide remote roles
Remote OK Jobs ScraperRemote OK's public feed — read its README first

Local development

pip install -r requirements.txt
python test_local.py "python developer" --max 20 --out sample_output.json
python test_local.py "data engineer" --location "Austin, TX" --radius 25 --max 10

sample_output.json in this folder is real output from a live run, kept so the schema can be reviewed without running anything.