ZipRecruiter Scraper | $1 / 1k | Fast & Reliable avatar

ZipRecruiter Scraper | $1 / 1k | Fast & Reliable

Pricing

from $1.99 / 1,000 results

Go to Apify Store
ZipRecruiter Scraper | $1 / 1k | Fast & Reliable

ZipRecruiter Scraper | $1 / 1k | Fast & Reliable

ZipRecruiter scraper extracts publicly available job listings, company names, job titles, locations, salaries (when available), posting dates, and job details 💼📊 Perfect for recruitment, talent sourcing, job market research, and employment trend analysis.

Pricing

from $1.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Hub

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

ZipRecruiter Search Scraper (Actor)

Scrapes ZipRecruiter job-search results into structured job objects. Built with requests → curl_cffi fallback, parsel (CSS selectors), regex, and an optional proxy path for Cloudflare.

Input

{
"queries": ["software engineer", "data analyst"],
"location": "New York, NY",
"radius": 25,
"location_remote": true,
"days": "10",
"refineByApplyType": true,
"limit": 1500,
"proxy_url": null,
"max_pages_per_query": 40
}
FieldMeaning
queriesOne ZipRecruiter search per term.
location / radiusBase location and search radius (miles).
location_remotetruerefine_by_location_type=remote.
daysOnly jobs posted in the last N days ("" = any time).
refineByApplyTypeEnables ZipRecruiter's apply-type refinement.
limitMax jobs across all queries (deduped by listing key).
proxy_urlResidential/unblocker proxy — required in production (see below).

Output

One object per job, matching the reference schema:

{ job, source, company, location, compensation, employment, descriptions, application }
  • application.apply_url carries a base64 match_token; the scraper decodes it to recover listing_key, match_id, bid_tracking_data, and the external apply URL.
  • source records the search URL, page index, scrape time, and seed.

How it fetches (requests → curl_cffi → proxy)

  1. Plain requests GET (cheapest).
  2. On a block signature (403/429/503 or a Cloudflare interstitial), retry with curl_cffi impersonating real Chrome/Safari TLS fingerprints, cycling profiles.
  3. All requests can route through proxy_url.

Extraction is layered so it survives markup changes: embedded application-state JSON → application/ld+json JobPosting → parsel CSS job cards.

⚠️ Cloudflare note

ZipRecruiter is behind a Cloudflare managed challenge (

cf-mitigated: challenge
) on both the web search page and the mobile API. TLS impersonation alone (curl_cffi) does not solve an active JS challenge — verified live, it returns the "Just a moment…" page. To collect real data you must supply a proxy_url that clears the challenge (residential proxy or a Cloudflare-solving unblocker/scraping API). Without it the actor runs cleanly and returns an empty dataset instead of crashing.

Run

pip install -r requirements.txt
# Standalone (reads ./INPUT.json, writes ./output/dataset.json)
python main.py
python main.py path/to/input.json
# As an Apify Actor
apify run