ZipRecruiter Jobs Scraper — URL or Keywords, Emails avatar

ZipRecruiter Jobs Scraper — URL or Keywords, Emails

Pricing

$29.00/month + usage

Go to Apify Store
ZipRecruiter Jobs Scraper — URL or Keywords, Emails

ZipRecruiter Jobs Scraper — URL or Keywords, Emails

Scrape public ZipRecruiter job listings in the US, Canada, the UK and Ireland: title, company, salary, benefits, workplace type and apply links. Many keywords and cities per run, only-new-jobs mode, Slack, Discord and Telegram alerts. JSON/CSV.

Pricing

$29.00/month + usage

Rating

2.7

(10)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

12

Bookmarked

381

Total users

3

Monthly active users

2.1 hours

Issues response

2 hours ago

Last modified

Share

Disclaimer: This is an independent, unofficial tool. It is not affiliated with, endorsed by, or sponsored by ZipRecruiter, Inc. or any of its subsidiaries. "ZipRecruiter" and all related names, marks, and logos are trademarks of their respective owners and are used here for descriptive (nominative) purposes only. This Actor accesses only publicly available data.

Pricing

This actor is a $29/month rental until 29 September 2026. From 29 September 2026 it is pay per event, with no monthly fee:

EventPriceWhen charged
Actor start$0.005Once per run (per GB of run memory)
Job result$0.0025Per job pushed to the dataset
Employer email found$0.02Only when opt-in enrichment finds a verified contact email

Example: 1,000 jobs ≈ $2.50. With email enrichment on and a ~30% hit rate: 1,000 jobs + 300 emails ≈ $8.50. Emails are billed only when found, and in incremental mode jobs skipped as unchanged cost nothing.

Why Scrape ZipRecruiter?

ZipRecruiter is one of the largest job posting platforms in the United States, aggregating millions of job listings from various sources. Scraping ZipRecruiter offers invaluable data for:

  1. Labor Market Analysis: Track job trends, salary ranges, and in-demand skills across industries and locations.
  2. Competitive Intelligence: Monitor hiring patterns of competitors and identify emerging industry trends.
  3. Recruitment Strategies: Gain insights into job descriptions, required qualifications, and benefits to optimize your own job postings.
  4. Career Research: Analyze job requirements and salaries for specific roles to guide career decisions or negotiations.
  5. Economic Research: Use job posting data as a leading indicator of economic health and industry growth.
  6. AI and Machine Learning: Build robust datasets for training job matching algorithms or predictive models for career progression.

What Can You Scrape?

Every job becomes one flat row, ready for JSON, CSV or Excel:

  • Job: title, full description (text, HTML or Markdown), employment type, workplace type (remote, hybrid or on-site), posting date and expiry date
  • Pay: salary range, currency and period (hourly, yearly…), plus a readable salary string
  • Benefits listed on the job, such as medical, dental or paid time off
  • Employer: company name, company page and logo; industry, size, founding year and headquarters when the job page carries a company profile
  • Location: city, state or region, postal code when listed, country code, and a remote flag
  • Apply: an apply link on every row, and the employer's own application (ATS) link for jobs that apply off-site
  • Tracking: job id, the search the job came from, when it was scraped and, in incremental mode, whether it is new, updated or a repost
  • Employer contact email (opt-in, see below)

How it works

This actor scrapes ZipRecruiter search and job pages over HTTP (Cheerio / Impit). Paste search or job URLs, or fill in keywords and locations. It reads the search results page by page up to your limits, then opens each job's page for the full description (or skips that step in listing-only mode).

Features

  • Many searches in one run. Give several keywords and several locations: every keyword is searched in every location (up to 100 searches). A job listed by more than one search is saved once. maxItemsPerSearch gives every search its share of maxItems.
  • Four countries. United States and Canada (ziprecruiter.com), United Kingdom (ziprecruiter.co.uk) and Ireland (ziprecruiter.ie).
  • Listing-only mode. Turn off scrapeJobDetails and rows come straight from the search results: title, company, location, pay, workplace type, employment type, benefits, posting date, a description snippet and the apply link. Many times faster, since no job page is opened.
  • Filters: keyword, location, radius, posted within N days, company, employment type, salary range, workplace (remote / hybrid / on-site), experience level (no experience / junior / mid / senior), 1-Click Apply only, external apply only.
  • Only new jobs (incremental mode) for scheduled runs: jobs unchanged since earlier runs are skipped before their page is fetched. Rows are tagged new, updated or repost.
  • Notifications when the run ends: any webhook (n8n, Make, Zapier, your backend), Slack, Discord or Telegram.
  • Output for AI agents and pipelines: description as text, HTML and/or Markdown, a length cap, compact rows, empty fields left out.
  • Employer contact emails (opt-in), see below.

Countries

CountrySiteWhat you get
United Statesziprecruiter.comEverything, every filter
Canadaziprecruiter.comEverything, every filter. Use a Canadian location (Toronto, ON) or leave it empty for all of Canada.
United Kingdomziprecruiter.co.ukSearch cards: title, company, location, date, snippet, apply link. UK jobs open on the source site, so there is no full description.
Irelandziprecruiter.ieFull job pages: full description, dates, employer apply link

The UK and Irish sites have fewer filters than ziprecruiter.com: keyword, location, company, job type, on-site, and Newest first (searchSortBy: "date"). There is no radius, salary, experience or apply-type filter there, and "posted within N days" is applied by the actor to the cards' dates. ziprecruiter.com has no sort order of its own: use searchPostedWithinDays for recent jobs.

Only new jobs (incremental mode)

Set "incrementalMode": true on a scheduled task. The first run saves every job. Every later run compares each search result with what earlier runs saw and saves only jobs that are new, changed (title, location, pay or employment type) or reposted under a new id. Rows get changeType and firstSeenAt. Unchanged jobs are skipped before their page is fetched. The state lives in the key-value store ziprecruiter-incremental in your account, one record per search; set incrementalStateKey to name it yourself. skipReposts drops reposted jobs.

Notifications

When the run ends, the actor can send its job count, a dataset link and the first jobs (notifyMaxJobs, default 10) to:

  • a webhook (notifyWebhookSecretUrl, optional notifyWebhookSecretHeaders): a JSON POST with the jobs as rows,
  • Slack (notifySlackSecretUrl, an incoming webhook),
  • Discord (notifyDiscordSecretUrl, a channel webhook),
  • Telegram (notifyTelegramBotToken + notifyTelegramChatId).

The URLs, the webhook headers and the token are stored encrypted and are never written to the run log. notifyOnlyWhenJobsFound skips the message when the run saved nothing (with incremental mode: nothing new).

How to Use

  1. Set Up: Ensure you have an Apify account and access to the Apify platform.
  2. Configure Input: paste search or job URLs, or fill in keywords, locations and the country.
  3. Proxy: nothing to set on a paid Apify plan, the actor uses its own US residential proxy. On the free plan, use Apify RESIDENTIAL proxies with country US.
  4. (Optional) Set Max Items (parameter: maxItems) to limit the number of job listings to scrape.
  5. (Optional) Enable externalApplyOnly to keep only jobs that redirect candidates to an external apply flow.
  6. Run the actor and obtain the extracted data in your preferred format.
  7. Data Collection: The scraper will output data in your chosen format, which can include JSON, CSV, Excel, or others as supported by Apify.

Input Configuration

Several keywords in several cities, the last 7 days, listing-only, only new jobs on each scheduled run, posted to Slack:

{
"searchKeywords": ["data analyst", "data scientist"],
"searchLocations": ["New York, NY", "Austin, TX"],
"searchPostedWithinDays": 7,
"searchWorkplace": "hybrid",
"searchExperienceLevels": ["mid", "senior"],
"scrapeJobDetails": false,
"maxItems": 200,
"maxItemsPerSearch": 50,
"incrementalMode": true,
"notifySlackSecretUrl": "https://hooks.slack.com/services/…"
}

Newest software engineer jobs in London:

{
"searchCountry": "UK",
"searchJobKeyword": "software engineer",
"searchLocation": "London",
"searchSortBy": "date",
"maxItems": 100
}

Pasted URLs work as before:

{
"startUrls": [
{
"url": "https://www.ziprecruiter.ie/jobs/search?q=backend&l=&lat=&long="
},
{
"url": "https://www.ziprecruiter.com/jobs-search?form=jobs-landing&search=fire+alarm+technician&location=New+York%2C+NY"
}
],
"maxItems": 1000,
"maxConcurrency": 10,
"minConcurrency": 1,
"maxRequestRetries": 10,
"externalApplyOnly": false,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
],
"apifyProxyCountry": "US"
}
}

Output Structure

Each row is flat (CSV-friendly). applyUrl is always set — the employer apply link when ZipRecruiter exposes one, otherwise the job page. inputUrl is the search URL that produced the row.

When externalApplyOnly is enabled, only items with isExternalApply: true are emitted.

{
"title": "Senior AI Engineer, Banking Technology",
"company": "Citi",
"companyUrl": "https://www.citigroup.com/",
"companyLogo": "https://www.ziprecruiter.com/svc/fotomat/public-nosensitive-ziprecruiter-logos/company/citi.png",
"city": "Jersey City",
"state": "NJ",
"country": "US",
"postalCode": null,
"location": "Jersey City, NJ",
"isRemote": false,
"workplaceType": "hybrid",
"employmentType": "FULL_TIME",
"salaryMin": 142320,
"salaryMax": 213480,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salary": "$142,320 - $213,480 / YEAR",
"benefits": ["Medical", "Dental", "Paid time off", "Retirement"],
"description": "Role Overview: Citi's Banking Technology organization is seeking...",
"descriptionHtml": "<p>Role Overview: ...</p>",
"datePosted": "2026-09-12T05:23:32Z",
"validThrough": "2026-10-12",
"id": "3bf1f2f8b6318d6c",
"url": "https://www.ziprecruiter.com/c/Citi/Job/Senior-AI-Engineer/-in-Jersey-City,NJ?jid=3bf1f2f8b6318d6c",
"applyUrl": "https://www.ziprecruiter.com/c/Citi/Job/Senior-AI-Engineer/-in-Jersey-City,NJ?jid=3bf1f2f8b6318d6c",
"isExternalApply": false,
"externalApplyUrl": "",
"inputUrl": "https://www.ziprecruiter.com/jobs-search?search=software+engineer&location=New+York%2C+NY",
"directApply": false,
"scrapedAt": "2026-09-14T00:00:00.000Z",
"source": "schema.org/JobPosting",
"descriptionIncomplete": false,
"detailsFetched": true
}

Field descriptions

  • title / company / companyUrl / companyLogo — job and employer
  • city / state / country / postalCode / location — parsed place; location is "City, ST", country a code (US, CA, GB, IE)
  • isRemote — true when the listing is remote
  • workplaceType — remote, hybrid, on-site or remote-optional
  • employmentType — e.g. FULL_TIME, CONTRACTOR, PART_TIME
  • salaryMin / salaryMax / salaryCurrency / salaryPeriod / salary — numeric range plus a display string
  • benefits — e.g. ["Medical", "Dental", "Paid time off"]
  • description — full plain text (Open Graph teasers are skipped; descriptionIncomplete is true if only a teaser was available). In listing-only mode and for UK jobs, the search result's snippet.
  • descriptionHtml — original HTML when present
  • descriptionMarkdown — only when descriptionFormats includes markdown
  • datePosted / validThrough
  • id — ZipRecruiter job id (jid; uk-… / ie-… for UK and Irish jobs)
  • url — job page
  • applyUrl — apply link (never empty)
  • isExternalApply / externalApplyUrl — employer ATS URL when ZipRecruiter exposes one
  • inputUrl — the search URL for this run
  • source — where the row was read: schema.org/JobPosting / page-dom (job page), search card (listing-only), ziprecruiter.co.uk (UK card)
  • detailsFetched — false when the row comes from the search results alone
  • companyIndustry / companySize / companyFoundedYear / companyHeadquarters / companyWebsite — only when the job page carries ZipRecruiter's company profile
  • changeType / firstSeenAt — only in incremental mode
  • contactEmail / contactWebsite — only when enrichEmails is on and a contact is found

The older nested card dump (Title, OrgName, jobDetails, …) is no longer written.

External Apply Notes

  • externalApplyOnly works best on search result URLs because the SERP payload contains the strongest apply metadata.
  • Some individual job pages still expose directApply in their structured data even when the originating SERP card was external. The actor preserves the stronger SERP signal so external jobs are not dropped.
  • externalApplyUrl may still point to a ZipRecruiter redirect URL. The final third-party destination is usually embedded behind that redirect token.

Employer Contact Emails (opt-in)

Set "enrichEmails": true and every job record gains three extra fields:

  • contactEmail — best verified email for the hiring company
  • contactWebsite — the company website the email was found on
  • emailEnrichment — full enrichment detail (all emails found, source, confidence)

Discovery uses the company name + location with a business-domain guard (no residential or junk domains) and on-site contact-page scraping. From 29 September 2026 it is charged only on success: $0.02 per email actually found.

Support

Additional Services