ZipRecruiter Jobs & Salary Scraper
Pricing
from $0.37 / 1,000 job with descriptions
ZipRecruiter Jobs & Salary Scraper
Scrape ZipRecruiter job listings by keyword and location, or from any search URL. Get job title, company, location, salary, employment type, posting date and the full job description. Every detail page is opened, and incomplete rows are flagged instead of silently returned empty.
Pricing
from $0.37 / 1,000 job with descriptions
Rating
5.0
(1)
Developer
rainminer
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
ZipRecruiter Jobs Scraper

The ZipRecruiter Jobs Scraper extracts job listings from ZipRecruiter search result pages. Search by keyword and location or paste any ZipRecruiter search URL, then export structured job data — titles, companies, locations, salaries, posting dates, and the complete job description — to JSON, CSV, Excel, or via the Apify API.
Use it for job-market research, recruiting intelligence, salary benchmarking, aggregator feeds, or building a jobs dataset.
Why this scraper?
ZipRecruiter is protected by Cloudflare, and many scrapers succeed on the search page but return empty descriptions when the detail page is blocked — while still charging you for those broken rows. This Actor is built around a completeness guarantee:
- Every job's detail page is opened to extract the full description.
- If a description cannot be fetched, the row is still returned but clearly flagged with
descriptionFetchFailed: true. - You are only charged for complete records (jobs that include a real description). Flagged, partial rows are never billed.
What can the ZipRecruiter Jobs Scraper do?
- Scrape jobs from any ZipRecruiter search URL (keyword + location, filters, etc.).
- Follow pagination automatically until your
maxItemslimit is reached (per start URL). - Extract the full job description from each listing's detail page.
- Parse salary ranges, employment type, posting date, and remote status when available.
- Flag incomplete records instead of silently returning empty descriptions.
- Run on a schedule with Apify dataset exports, API access, webhooks, and proxy configuration.
How to use it
Enter a search keyword and optional location/filters, or paste existing
ZipRecruiter search URLs into startUrls. When startUrls is provided, it
takes precedence and all filters already present in those URLs are preserved.
Input
| Field | Type | Description |
|---|---|---|
startUrls | string[] | ZipRecruiter search URLs; takes precedence over keyword fields. |
search | string | Keyword, title, skill, or company. |
location | string | City, state, or ZIP code. |
jobType | string | any, full_time, part_time, contract, internship, or temporary. |
daysPosted | integer | Posted within N days; 0 means any date. |
radiusMiles | integer | Search radius; 0 uses ZipRecruiter's default. |
remoteOnly | boolean | Restrict keyword searches to remote-eligible jobs. |
maxItems | integer | Maximum jobs to return per start URL (default 50). |
fetchFullDescription | boolean | Extended option: fetch full descriptions (default true). |
proxyConfiguration | object | US residential proxy settings (the compatible default). |
Input example
{"search": "software engineer","location": "Austin, TX","jobType": "full_time","daysPosted": 7,"radiusMiles": 25,"remoteOnly": false,"maxItems": 25,"fetchFullDescription": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Output
| Field | Description |
|---|---|
type | Pro-compatible row type: job_ziprecruiter |
id | ZipRecruiter card-level job identifier |
jid | Job ID parsed from the jid URL parameter |
title | Job title |
company | Hiring company name |
companyUrl / companyLogo | Company profile and logo URLs when available |
location | Job location (city, region, country) |
city / state | Parsed city and two-letter state |
isRemote | true when the job is remote/telecommute, otherwise null |
isHybrid | true when the location is hybrid, otherwise null |
employmentType | Employment type (e.g. FULL_TIME) when available |
salary | Human-readable salary string when available |
salaryMin / salaryMax | Parsed salary bounds when available |
salaryCurrency / salaryPeriod | Salary currency and period (e.g. USD, year) |
datePosted | Posting date (ISO 8601) |
validThrough | Application deadline when available |
description | Full job description as plain text |
descriptionHtml | Original description HTML when available |
descriptionFetchFailed | true when the full description could not be fetched (not billed) |
url | Canonical job detail URL |
searchUrl | The search URL this job came from |
source | Always ziprecruiter |
scrapedAt | Timestamp of extraction (ISO 8601) |
If an entire search is blocked after all retries, the Actor emits the same
compatibility sentinel shape as the incumbent:
{"type":"job_ziprecruiter_blocked","message":"...","requestedUrls":[...]}.
Sentinel and incomplete rows are not billed.
Output example
{"type": "job_ziprecruiter","id": "TT2JIBaZ_bbThXFmHQVtWw","jid": "abc123def456","title": "Senior Software Engineer","company": "Acme Corp","companyUrl": "https://www.ziprecruiter.com/co/Acme-Corp/Jobs/-in-Austin,TX","companyLogo": "https://www.ziprecruiter.com/svc/fotomat/example.png","location": "Austin, TX, US","city": "Austin","state": "TX","isRemote": null,"isHybrid": null,"employmentType": "FULL_TIME","salary": "USD 120000 - 160000 / year","salaryMin": 120000,"salaryMax": 160000,"salaryCurrency": "USD","salaryPeriod": "year","datePosted": "2026-08-01","validThrough": "2026-09-01","description": "We are hiring a Senior Software Engineer...","descriptionFetchFailed": false,"url": "https://www.ziprecruiter.com/c/Acme-Corp/Job/Senior-Software-Engineer/-in-Austin,TX?jid=abc123def456","searchUrl": "https://www.ziprecruiter.com/jobs-search?search=software+engineer&location=Austin%2C+TX","source": "ziprecruiter","scrapedAt": "2026-08-08T06:40:00.000Z"}
How much does it cost?
This Actor uses pay-per-event pricing plus platform usage:
| Charge | Amount |
|---|---|
Complete job (job-with-description) | $0.49 per 1,000 on Free (down to $0.37 per 1,000 on higher plans) |
| Actor start | $0.00005 per GB of memory |
| Apify platform usage (compute + residential proxy) | Billed to your account at standard Apify rates |
Two things worth knowing before you run it:
- You are only charged for complete records. A job is billed when it includes
a real job description. Rows returned with
descriptionFetchFailed: trueare still delivered so you can see what happened, but they are never charged. - You pay the platform usage. ZipRecruiter is behind Cloudflare, so this
Actor drives a real browser through US residential proxies. In our
measurements that works out to roughly $18 of Apify usage per 1,000 jobs,
dominated by residential proxy traffic. The per-result fee above is a small
maintenance fee on top, not the full cost — budget accordingly, and use
maxItemsto keep test runs cheap.
Notes and limitations
- ZipRecruiter uses Cloudflare bot protection, so US residential proxies are strongly recommended (they are the default). Runs on datacenter IPs will typically be blocked.
- Job availability changes quickly — treat scraped data as a point-in-time snapshot.
- Only public search results are scraped. This Actor does not log in to any account.
Is it legal to scrape ZipRecruiter?
This Actor extracts publicly visible job listing information. Use it responsibly, respect ZipRecruiter's terms, and ensure your use case complies with applicable laws and regulations. If you are unsure whether your use case is allowed, consult a legal professional.
Image Credit
Image credit: ziprecruiter.com