ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary
Pricing
from $0.69 / 1,000 results
ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary
Scrape ZipRecruiter job listings across ziprecruiter.com (US), ziprecruiter.co.uk and ziprecruiter.ie. Per-job salary range, employment type, posted date, geo coordinates, Quick Apply flag, full HTML description, hiring company and apply URL — straight from each job's schema.org JobPosting block.
Pricing
from $0.69 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary, Quick Apply & Geo
Pull millions of fresh ZipRecruiter listings into a clean structured dataset — job title, hiring company, full HTML description, salary range, posted date, geo coordinates, employment type and the Quick Apply flag — across the US, United Kingdom, Ireland and Canada markets.
No browser. No login. No CSV exports. Just point it at a search and get a normalised JSON / Excel / CSV stream that drops straight into your CRM, BI dashboard, vector database, lead-gen workflow or AI pipeline.
TL;DR —
keyword+location+ (optional)countryand you're scraping. Defaults to the US market with residential proxy on. Outputs ~25 jobs per request page, walks pagination automatically, and stops at yourmaxRecordscap.
Why this scraper
ZipRecruiter is one of the largest job boards in the US, with active country sites in the UK (ziprecruiter.co.uk), Ireland (ziprecruiter.ie) and Canada (ziprecruiter.ca). Every listing carries data that recruiters, sales teams, analysts, and AI builders pay good money to compile by hand:
- Salary ranges — most other free scrapers skip salary. We parse min, max, currency and pay period (hour / day / week / month / year) out of the job's structured data, with regex fallback on the description when the employer didn't publish it formally.
- Quick Apply (
directApply) — the in-platform apply flag tells you whether a candidate stays on ZipRecruiter or gets bounced to the employer's ATS. Critical signal for hiring funnel benchmarking and ad-spend optimisation. - Geo coordinates — every detail page exposes the lat/lon, so you can map the entire dataset, cluster jobs into commuting catchments, or filter by radius without geocoding bills.
- Posted & valid-through dates — actual ISO dates, not "5 days ago" strings. Track listing freshness, calculate time-to-fill, build velocity dashboards.
- Full HTML description — preserved for LLM ingestion, plus a clean plain-text version for keyword search.
- Hiring company + URL — the company name, profile link and (when present) logo, so you can pivot from job search to company intelligence.
What's inside the output
Each row contains the following fields (full schema in dataset_schema.json):
| Field | Type | What |
|---|---|---|
jobId | string | Numeric ZipRecruiter ID, stable per posting |
slug | string | URL slug — {id}-{job-title}-at-{company} |
title | string | Job title |
company | string | Hiring company name |
companyUrl | string | Company website / profile URL when JSON-LD has it |
location | string | Full human-readable location string |
city | string | Parsed city |
state | string | Parsed state, region or county |
postcode | string | Postcode / ZIP / Eircode when present |
country | string | Country name ("United States", "Ireland", …) |
latitude | number | Geo coordinate from JSON-LD |
longitude | number | Geo coordinate from JSON-LD |
isRemote | boolean | True when the title / location / description marks the role remote |
salaryMin | number | Lower salary value |
salaryMax | number | Upper salary value (= min when single value) |
salaryCurrency | string | USD / GBP / EUR / CAD |
salaryPeriod | string | hour / day / week / month / year |
salaryRaw | string | Original salary string as published |
employmentType | string | Full Time / Part Time / Contract / Temporary / Intern |
quickApply | boolean | true when ZipRecruiter offers in-platform apply (directApply) |
postedDate | string | ISO YYYY-MM-DD |
validThrough | string | ISO date the listing expires |
postedDateDisplay | string | Short label shown on the card ("3d ago", "20 May") |
descriptionText | string | Plain-text job description |
descriptionHtml | string | Original HTML description (for LLMs) |
descriptionSnippet | string | Short snippet from the listing card |
applyUrl | string | Canonical apply entry point |
listingUrl | string | Canonical job detail URL |
searchKeyword | string | Echo of the input keyword |
searchLocation | string | Echo of the input location |
searchUrl | string | Search URL the row came from |
market | string | "US" / "UK" / "IE" / "CA" |
scrapedAt | string | ISO timestamp |
Markets
| Market | Site | Cloudflare? | Recommended proxy |
|---|---|---|---|
| United States | ziprecruiter.com | Yes (strict JS challenge) | RESIDENTIAL + country US |
| United Kingdom | ziprecruiter.co.uk | No | Datacenter or Residential — either works |
| Ireland | ziprecruiter.ie | No | Datacenter or Residential — either works |
| Canada | ziprecruiter.ca | Yes | RESIDENTIAL + country CA |
The actor defaults to RESIDENTIAL proxy so the US (largest market) works out of the box. If you only care about UK / IE, switch the group to Apify Datacenter for a small cost saving.
Use cases
Recruiters & staffing agencies
- Pipeline scouts — discover open roles in your specialism across the US / UK / IE.
- Compensation benchmarks — pull a city × role × salary slice into Google Sheets, refresh weekly.
- Quick-Apply share tracking — measure which of your competitors have invested in ATS integration vs. forcing redirect.
Sales / lead gen
- Hiring intent signal — companies posting senior data, ML or platform roles are usually scaling; perfect outbound trigger for SaaS, consulting, IT services.
- Hot-list builder — feed the resulting
company,location,countryrows into Apollo / Lusha / Clay enrichment. - Multi-market expansion — IE / UK markets surface companies you'd never see on indeed.com.
Market research & analyst teams
- Wage inflation tracking — weekly snapshot of median posted salary by city, industry, role.
- Employment-type mix — Contract vs. Full Time vs. Temp ratios are a leading indicator for hiring confidence.
- Remote share index — quantify
isRemoteadoption per geo or industry.
AI / ML pipelines
- Skill-graph extraction —
descriptionHtmlstraight into your LLM for entity extraction and embedding. - Resume-matching corpus — feed paired (job, candidate-CV) records into a fine-tune set.
- Salary prediction models — train on the
(title, location, employmentType, salaryMin, salaryMax)tuples.
Job-board aggregators & vertical SaaS
- Source feed — rebrand the data on a niche vertical (healthcare jobs, remote-only, fintech) without negotiating a B2B feed deal.
- Geo-fence dashboards —
latitude/longitudedrives heat-maps directly in Tableau, Mapbox, Looker.
Inputs (full list)
See input_schema.json for the canonical definitions. The most-used fields:
country(select) —us(default),uk,ie,ca. Picks the matching ZipRecruiter site.keyword(string) — Free-text title / skill / company. Example:"senior software engineer","registered nurse","data analyst remote".location(string) — City, state, postcode or region. Example:"New York, NY","Manchester","Dublin".startUrls(array) — Paste any ZipRecruiter search URL directly. Overrides keyword / location / country.remoteOnly(boolean) — Addsremote=remote_onlyto the search.datePosted(select) —any,1(last 24 h),5,10,20days.scrapeDescription(boolean) — Visit each job's detail page for the full HTML description, salary, geo, Quick Apply flag. Disable to scrape ~5× faster, ~5× cheaper, with listing-card fields only.maxRecords(integer) — Hard cap on total rows (default100).maxPages(integer) — Hard cap on listing pages (default unlimited withinmaxRecords).requestDelay(integer) — Milliseconds between requests; 800–1500 is a good range.proxyConfiguration(proxy) — Apify Proxy. Defaults touseApifyProxy: truewith the RESIDENTIAL group.
Example inputs
1. US software engineering market (default)
{"country": "us","keyword": "software engineer","location": "New York, NY","maxRecords": 100,"scrapeDescription": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
2. UK remote-only data roles, last 24 h
{"country": "uk","keyword": "data engineer","remoteOnly": true,"datePosted": "1","maxRecords": 200}
3. Ireland — Dublin tech, fast list-only
{"country": "ie","keyword": "software engineer","location": "Dublin","scrapeDescription": false,"maxRecords": 500,"requestDelay": 800}
4. Direct search URL (any market)
{"startUrls": ["https://www.ziprecruiter.com/jobs-search?search=registered+nurse&location=Texas"],"maxRecords": 250}
5. Multi-page deep crawl
{"country": "us","keyword": "machine learning","location": "San Francisco, CA","maxRecords": 1000,"maxPages": 40,"requestDelay": 1200,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Output sample
{"jobId": "533612810","slug": "533612810-software-engineer-iii-at-guidewire-software","title": "Software Engineer III","company": "Guidewire Software","companyUrl": null,"location": "Dublin, Leinster, Ireland","city": "Dublin","state": "Leinster","postcode": null,"country": "Ireland","latitude": 53.33306,"longitude": -6.24889,"isRemote": null,"salaryMin": null,"salaryMax": null,"salaryCurrency": "EUR","salaryPeriod": null,"salaryRaw": null,"employmentType": "Full Time","quickApply": false,"postedDate": "2026-05-20","validThrough": "2026-06-19","postedDateDisplay": "20 May","descriptionText": "Summary Job Description About You — You are a smart, enthusiastic, and results-oriented software engineer …","descriptionHtml": "<b>Summary</b><br><br>Job Description<br>About You …","descriptionSnippet": "Summary Job Description About You You are a smart, enthusiastic, and results-oriented software engineer …","applyUrl": "https://www.ziprecruiter.ie/jobs/533612810-software-engineer-iii-at-guidewire-software","listingUrl": "https://www.ziprecruiter.ie/jobs/533612810-software-engineer-iii-at-guidewire-software","searchKeyword": "software engineer","searchLocation": null,"searchUrl": "https://www.ziprecruiter.ie/jobs/search?q=software+engineer","market": "IE","scrapedAt": "2026-05-31T17:32:11.401Z"}
Cost & throughput
This actor uses Apify's pay-per-event pricing — you pay a small start fee plus a per-result charge. There's no separate compute-unit cost. The pricing is set on the Apify Store listing; check the actor page for the exact tier breakdown.
Typical throughput on the default config (requestDelay: 1000, scrapeDescription: true):
- 100 jobs ≈ 3–4 minutes (detail pages dominate).
- 1,000 jobs ≈ 30–40 minutes.
- List-only (
scrapeDescription: false): 5–8× faster.
Skip scrapeDescription when you only need the listing-card data — that already gives you title, company, location, posted date, snippet and a salary slot when the employer published one.
How it works (under the hood, for the curious)
- Search URL build — picks the right host (
.com/.co.uk/.ie/.ca) and parameter names (search/locationon.com,q/leverywhere else), then walks?page=N. - Listing parse — Cheerio iterates every
<li class="job-listing">and pulls jobId, title, company, location, posted-date display and the description snippet. - Detail fetch (optional) — for each job we GET the canonical detail URL and read the
<script type="application/ld+json">block of@type: JobPosting. That gives us the full HTML description, ISO dates, geo coordinates, employment type, hiring organisation and thedirectApply(Quick Apply) flag. - Salary parsing —
baseSalary/estimatedSalaryfrom JSON-LD first; if missing, a regex pass over the first 2 kB of description text extracts ranges in $ / £ / € withksuffix, range or single-value variants. - Dedup — by numeric
jobId. Same posting surfaced on multiple pages is only emitted once. - Backoff — retries on
429,403or Cloudflare "Just a moment…" challenges with a fresh proxy session each attempt and exponential delay.
Built on got-scraping + cheerio (no Puppeteer / Playwright), so a 512 MB run is plenty for most jobs.
Tips & troubleshooting
Q: I'm getting No jobs scraped — ZipRecruiter blocked the requests.
A: The US and CA sites sit behind a Cloudflare JS challenge. Make sure the proxy is on and the group is RESIDENTIAL. If you set a country code, match it to the market (US → US, CA → CA). UK and IE never need this.
Q: My run says No jobs matched the search.
A: Your filter is too narrow. Try a broader keyword, drop the location, or set datePosted to any. remoteOnly: true also dramatically shrinks the result set.
Q: Why is salaryMin null on so many rows?
A: ZipRecruiter only publishes salary when the employer disclosed it. We parse every disclosed value, but most US listings simply don't carry one. The descriptionText often mentions a range in prose — we already run regex fallback on the first 2 kB of it.
Q: Can I scrape more than the cap I see in displayTotalCount?
A: ZipRecruiter caps deep pagination at ~25 results × ~423 pages. To go further, run the same keyword across multiple cities or split by datePosted (5d, 10d, 20d).
Q: Can I use my own proxy?
A: Yes — put the URLs in proxyConfiguration.proxyUrls and the actor will round-robin them.
Q: How fresh is the data? A: Real-time. Every run pulls the live HTML; there's no cache layer in this actor.
Q: How do I scrape just the description for jobs I already have?
A: Use startUrls with the direct detail URLs and the actor's listing pass will skip them (no card markup); but you can also keep scrapeDescription: true and pass the search URL — the detail visit fills in everything automatically.
Q: Can I run this on a schedule?
A: Yes — Apify Schedules picks this actor up natively. Daily / hourly cron is fine; lower maxRecords to keep cost predictable.
Legal & ethical use
This actor reads public, indexable ZipRecruiter HTML — the same pages Google sees. Use the output responsibly:
- Don't republish raw descriptions on a competing job-board without the employer's permission.
- Don't use the data to spam candidates with unsolicited outreach in jurisdictions that require opt-in (GDPR, CAN-SPAM).
- Respect ZipRecruiter's Terms of Service. If you plan to scrape at very high volume, contact them about an official partnership / feed.
The actor itself does not log into ZipRecruiter, bypass any paywall, or scrape pages flagged "private" in robots.txt (we honour the disallowed /apply/, /job-redirect/, /eclk/ etc. paths).
How this compares
There are a dozen ZipRecruiter scrapers in the Apify Store. Here's where this one positions:
- Multi-market — we don't lock you to a single country. Switch
countrybetweenus/uk/ie/cawithout changing actor. - Salary parsing built in —
salaryMin,salaryMax,salaryCurrency,salaryPeriodcome back as numbers, not strings — joinable directly with your BI database. - Quick Apply (
directApply) — most scrapers ignore this. It's a high-signal field for measuring candidate-experience quality across employers. - Geo coordinates — every detail page has lat/lon in its JSON-LD. We surface it, so you can map without geocoding bills.
- Cloudflare-resilient by default — the proxy prefill is RESIDENTIAL, which is what makes US runs survive the rate-limit instead of returning zero rows after 30 s of backoff.
- Healthy run semantics — a search that genuinely returns nothing exits cleanly with an actionable status message instead of being marked FAILED. Your scheduled runs stay green.
Advanced patterns
Salary intelligence across cities
Run the same keyword against a handful of cities, then aggregate salaryMin / salaryMax in your warehouse:
{ "country": "us", "keyword": "software engineer", "location": "New York, NY", "maxRecords": 200 }{ "country": "us", "keyword": "software engineer", "location": "San Francisco, CA", "maxRecords": 200 }{ "country": "us", "keyword": "software engineer", "location": "Austin, TX", "maxRecords": 200 }
Schedule these as three separate runs and union the datasets — you get a city × salary distribution in minutes.
Hiring-intent lead list
Filter the dataset to the last 24 hours of senior or director-level roles in your TAM, then dedup by company. Each row is a fresh outbound trigger.
{ "country": "us", "keyword": "director engineering", "datePosted": "1", "maxRecords": 500 }
Remote-only labour market snapshot
{ "country": "uk", "remoteOnly": true, "datePosted": "5", "maxRecords": 1000 }
Track the count by week and you have a real-time "share of new postings that are remote" index.
Resume-matching / LLM fine-tune corpus
Keep scrapeDescription: true, push to a feature store, and use descriptionText as the matching field. The HTML version (descriptionHtml) is retained so you can re-format on the consumer side.
More FAQ
Q: Can I get the contact email for the hiring manager? A: No — ZipRecruiter intentionally hides contact details. We only return what's published on the public detail page.
Q: Will it follow paginated apply / interview pages? A: No, only the canonical job page. Apply funnels are private flows behind login.
Q: Does the actor honour robots.txt?
A: Yes — we skip every Disallow path (/apply/, /job-redirect/, /eclk/, /pixel/ …). All the listing and detail URLs we hit are explicitly Allow-listed in ZipRecruiter's own robots.txt.
Q: Will it handle the EU cookie banner? A: Yes — we hit the underlying server-rendered HTML, which doesn't depend on JavaScript cookie consent. The data is the same whether you accept or decline.
Q: How do I keep cost low?
A: Three levers — (1) keep scrapeDescription: false for list-only runs, (2) set a tight maxRecords, (3) drop the proxy down to Apify Datacenter when you only need UK / IE.
Q: I'm getting salaryRaw filled but salaryMin is null.
A: That happens when the salary string is non-numeric (e.g. "Competitive", "DOE", "Negotiable"). We preserve the raw label so you can filter or LLM-extract it downstream.
Q: Does it work with Apify's Integrations? A: Yes — the dataset works with all standard Apify Integrations (webhook, Google Sheets, Slack, Make, Zapier, n8n).
Changelog
- 1.0 — Initial release. Markets: US / UK / IE / CA. Listing + detail enrichment. Salary parsing, Quick Apply flag, geo coordinates, employment type, ISO dates, remote detection.
Need a tweak?
Reviews and feature requests on the Apify Store page are read every week. Common requests we'll prioritise:
- Resume / candidate-side scraping
- Company-page deep scrape (company profile, all open roles, headcount)
- Salary-only mode that aggregates by city / role
- Webhook delivery on new postings
If you have a specific data field on ZipRecruiter that you need and it isn't in the output yet, leave a comment — most extensions take a day.