ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits
Under maintenancePricing
from $4.00 / 1,000 results
ZipRecruiter Jobs Scraper — US & Canada, Salary & Benefits
Under maintenanceScrape 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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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:
- TLS fingerprint. Every Chrome and Safari impersonation profile returns HTTP 403 from a clean IP;
firefox133returns 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. - 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
| Field | Type | Notes |
|---|---|---|
queries | array | Job titles or keywords. |
location | string | Austin, TX, United States, Canada. |
radius | integer | Miles around the location. |
days | enum | Posted within N days. |
refineBySalary | integer | Minimum annual figure — filters on ZipRecruiter's number, which may be its own prediction. |
employmentType | enum | Full time / Part time / Contract / Internship. |
maxItems | integer | Per query. 0 = unlimited, bounded by the ceiling below. |
incremental | boolean | Only listings not seen in previous runs. |
proxyConfiguration | object | Residential 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
categoryis null.benefitsand structuredlocationmore 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
| Actor | Covers |
|---|---|
| SEEK Jobs Scraper | Australia, New Zealand |
| JobStreet & JobsDB Jobs Scraper | Indonesia, Malaysia, Singapore, Philippines, Thailand, Hong Kong |
| Himalayas Remote Jobs Scraper | 100,000+ worldwide remote roles |
| Remote OK Jobs Scraper | Remote OK's public feed — read its README first |
Local development
pip install -r requirements.txtpython test_local.py "python developer" --max 20 --out sample_output.jsonpython 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.