ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary avatar

ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary

Pricing

from $0.69 / 1,000 results

Go to Apify Store
ZipRecruiter Scraper | US, UK & Ireland Jobs with Salary

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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;DRkeyword + location + (optional) country and you're scraping. Defaults to the US market with residential proxy on. Outputs ~25 jobs per request page, walks pagination automatically, and stops at your maxRecords cap.


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):

FieldTypeWhat
jobIdstringNumeric ZipRecruiter ID, stable per posting
slugstringURL slug — {id}-{job-title}-at-{company}
titlestringJob title
companystringHiring company name
companyUrlstringCompany website / profile URL when JSON-LD has it
locationstringFull human-readable location string
citystringParsed city
statestringParsed state, region or county
postcodestringPostcode / ZIP / Eircode when present
countrystringCountry name ("United States", "Ireland", …)
latitudenumberGeo coordinate from JSON-LD
longitudenumberGeo coordinate from JSON-LD
isRemotebooleanTrue when the title / location / description marks the role remote
salaryMinnumberLower salary value
salaryMaxnumberUpper salary value (= min when single value)
salaryCurrencystringUSD / GBP / EUR / CAD
salaryPeriodstringhour / day / week / month / year
salaryRawstringOriginal salary string as published
employmentTypestringFull Time / Part Time / Contract / Temporary / Intern
quickApplybooleantrue when ZipRecruiter offers in-platform apply (directApply)
postedDatestringISO YYYY-MM-DD
validThroughstringISO date the listing expires
postedDateDisplaystringShort label shown on the card ("3d ago", "20 May")
descriptionTextstringPlain-text job description
descriptionHtmlstringOriginal HTML description (for LLMs)
descriptionSnippetstringShort snippet from the listing card
applyUrlstringCanonical apply entry point
listingUrlstringCanonical job detail URL
searchKeywordstringEcho of the input keyword
searchLocationstringEcho of the input location
searchUrlstringSearch URL the row came from
marketstring"US" / "UK" / "IE" / "CA"
scrapedAtstringISO timestamp

Markets

MarketSiteCloudflare?Recommended proxy
United Statesziprecruiter.comYes (strict JS challenge)RESIDENTIAL + country US
United Kingdomziprecruiter.co.ukNoDatacenter or Residential — either works
Irelandziprecruiter.ieNoDatacenter or Residential — either works
Canadaziprecruiter.caYesRESIDENTIAL + 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, country rows 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 isRemote adoption per geo or industry.

AI / ML pipelines

  • Skill-graph extraction — descriptionHtml straight 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 / longitude drives 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) — Adds remote=remote_only to the search.
  • datePosted (select)any, 1 (last 24 h), 5, 10, 20 days.
  • 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 (default 100).
  • maxPages (integer) — Hard cap on listing pages (default unlimited within maxRecords).
  • requestDelay (integer) — Milliseconds between requests; 800–1500 is a good range.
  • proxyConfiguration (proxy) — Apify Proxy. Defaults to useApifyProxy: true with 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)

  1. Search URL build — picks the right host (.com / .co.uk / .ie / .ca) and parameter names (search / location on .com, q / l everywhere else), then walks ?page=N.
  2. Listing parse — Cheerio iterates every <li class="job-listing"> and pulls jobId, title, company, location, posted-date display and the description snippet.
  3. 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 the directApply (Quick Apply) flag.
  4. Salary parsingbaseSalary / estimatedSalary from JSON-LD first; if missing, a regex pass over the first 2 kB of description text extracts ranges in $ / £ / € with k suffix, range or single-value variants.
  5. Dedup — by numeric jobId. Same posting surfaced on multiple pages is only emitted once.
  6. Backoff — retries on 429, 403 or 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.


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 country between us / uk / ie / ca without changing actor.
  • Salary parsing built insalaryMin, salaryMax, salaryCurrency, salaryPeriod come 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.