ZipRecruiter logo

Job boards & ATS · Coming soon

ZipRecruiter Scraper: US Jobs, Pay and Employers

Get public ZipRecruiter jobs in the United States by job title and location. Each row has the title, company, location, pay, job type, posting date, full job text and link.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

jobIdbd4991f117d2c90d
titleHospice Registered Nurse, RN
companyResidential Home Health and Hospice

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: nurse in Job title or keyword. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

This Actor searches ZipRecruiter by job title and US location and saves each job as a row with pay, full job text and employer details.

Good for

  • You recruit in the US and want open jobs by title and city in a spreadsheet.
  • You compare pay for one role across cities.
  • You look for employers that hire now, with company website and size.
  • You need remote, hybrid or on-site jobs from one source, updated on a schedule.

Who uses it

Recruiters

Get open jobs by title and city in a spreadsheet.

Pay researchers

Compare pay for one role across cities.

Hiring trackers

Find employers that hire now, with company website and size.

Price

Prices will be shown after release.

Questions

Do I need a ZipRecruiter account or a login?

No. The Actor reads public job pages. You need only an Apify account.

Why is salary sometimes null?

ZipRecruiter does not show that value for this job. The Actor does not guess it.

Does it return all jobs on ZipRecruiter?

No. It returns what the site shows for your searches. Results change between runs.

How can I get more than 60 jobs from one search?

Keep deepSearch on. The Actor repeats the search with narrower filters and removes duplicates. In our tests one search returned 633 jobs. For more, add values in additionalQueries or additionalLocations. Our largest test run saved 1400 jobs with 4 titles.

How fresh is the data?

Each row has fetchedAt: the time the Actor read the job. postedAt is the first posting date and refreshedAt is the last update of the listing. A job can close soon after the run.

Details

Step by step on Apify
  1. Open the Input tab. Keep nurse in query (box 1 in the picture).
  2. Keep Chicago, IL in location (box 2).
  3. Keep 20 in maxItems (box 3). This value is the form prefill. If you leave the field out in an API call, the default is 100.
  4. Click Start.
  5. Open the Output tab and check pay in the salary column (box 5).
  6. Read the full job text in the description column (box 6).
Use cases
TaskInputYou getKey fieldsNext step
Find open roles for a clientquery, location, postedWithinDaysJobtitle, company, postedAt, urlCSV or Excel export
Compare pay across citiesquery, additionalLocations, minSalaryJobsalaryMin, salaryMax, salaryInterval, stateAPI or Dataset export
Find employers that hire nowquery, location, includeCompanyDetailsJob with company datacompany, companyDetails, companyUrlCSV export to your own list
Watch remote jobsquery, remote, employmentTypesJobtitle, remote, locationType, refreshedAtSchedule, then Slack or Notion summary
Re-read jobs you saved earlierstartUrlsJobjobId, isActive, salary, descriptionAPI
Tips for better results
  • ZipRecruiter shows at most 60 jobs for one search. Keep deepSearch on to get more.
  • Add values in additionalQueries or additionalLocations to reach your maxItems.
  • Allow about 1 second per job above 200 when you set the run timeout.
Limits and good to know
  • United States only
  • maxItems is 1 to 1400 per run. Our runs of 1000 to 1400 jobs with job text took 556 to 1046 seconds. The longest one ran while the source was blocking job pages. Our latest large run saved 921 jobs in 426 seconds
  • query and form filters work on ZipRecruiter search pages. The source decides which jobs a filter returns
  • One search does not always reach your maxItems. In our tests one search stopped at 633 jobs when new jobs ran out, and runs of 1400 jobs with 5 and 8 broad titles ended at 1221 and 1350 jobs. Add titles or locations to get more
  • With deepSearch off, one search returns at most 60 jobs
  • One run can have up to 500 searches. additionalQueries and additionalLocations accept up to 50 values each. startUrls accepts up to 500 links
  • startUrls accepts only https://www.ziprecruiter.com links of three kinds: /jobs-search, /Jobs/ and /c/.../Job/...?jid=...
  • The Run timeout must be at least 60 seconds. Above 200 jobs, allow about 1 second per job. The Actor's own time limit is 240 seconds plus 1 second per job above 200. At that limit, or at the Run timeout, the run stops and keeps saved rows. It also stops with DEADLINE after 240 seconds with no usable page from the source, at any maxItems. With no saved rows, that run ends as FAILED

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "jobId": "bd4991f117d2c90d",
  "title": "Hospice Registered Nurse, RN",
  "company": "Residential Home Health and Hospice",
  "location": "Chicago, IL",
  "salary": "$70K - $85K/yr",
  "employmentType": "FULL_TIME",
  "remote": null,
  "postedAt": "2026-10-20T09:28:00.000Z",
  "description": "**Job Title **\n\nHospice Registered Nurse, RN\n\n**Location**...",
  "url": "https://www.ziprecruiter.com/c/Residential-Home-Health-and-Hospice/Job/Hospice-Registered-Nurse,-RN/-in-Chicago,IL?jid=bd4991f117d2c90d",
  "source": "ziprecruiter",
  "fetchedAt": "2026-11-05T02:58:37.837Z",
  "city": "Chicago",
  "state": "IL",
  "postalCode": "60695",
  "country": "US",
  "salaryMin": 70000,
  "salaryMax": 85000,
  "salaryInterval": "YEAR",
  "salaryCurrency": "USD",
  "salaryIsEstimated": false,
  "employmentTypes": ["FULL_TIME"],
  "benefits": ["Medical", "Dental", "Vision", "Life", "Retirement", "PTO"],
  "seniority": "junior",
  "experienceMonths": 24,
  "directApply": false,
  "isActive": true,
  "searchQuery": "nurse",
  "searchLocation": "Chicago, IL",
  "companyDetails": null,
  "skills": null,
  "category": null
}
Data fields (40)
FieldTypeMeaning
jobIdstringZipRecruiter job ID (jid), stable between runs. Use for dedupe.
titlestringJob title.
companystringHiring company name.
locationstringLocation as shown on the listing.
salarystringPay as shown on the listing. Null when not shown.
employmentTypestringPrimary employment type, for example FULL_TIME.
remotebooleanTrue for remote jobs, false for hybrid or on-site, null when the source does not say.
postedAtstringPosting date, ISO 8601.
descriptionstringFull job description as text. Null when not requested or not available.
urlstringJob page on ZipRecruiter.
sourcestringAlways ziprecruiter.
fetchedAtstringWhen this row was read, ISO 8601.
listingKeystringSource listing key, present on rows from search pages.
citystringCity.
statestringState code.
postalCodestringPostal code.
countrystringCountry code.
companyUrlstringCompany page on ZipRecruiter.
companyLogostringCompany logo URL.
salaryMinnumberMinimum pay in salaryInterval units.
salaryMaxnumberMaximum pay in salaryInterval units.
salaryMinAnnualnumberMinimum pay converted to a year by the source.
salaryMaxAnnualnumberMaximum pay converted to a year by the source.
salaryIntervalstringHOUR, DAY, WEEK, MONTH or YEAR.
salaryCurrencystringPay currency, for example USD.
salaryIsEstimatedbooleanTrue when the source estimated the pay instead of the employer stating it.
employmentTypesarrayAll employment types.
benefitsarrayBenefits listed by the source.
locationTypestringIN_PERSON, REMOTE, HYBRID or REMOTE_OPTIONAL.
refreshedAtstringWhen the source last refreshed the listing, in ISO 8601. The source's date filter and age follow this date.
postedRelativestringAge as shown, for example 3 days ago.
validThroughstringListing end date. Needs company details.
senioritystringno_experience, junior, mid or senior.
experienceMonthsnumberMonths of experience asked for.
educationstringEducation asked for. Needs company details.
applyUrlstringExternal apply link through ZipRecruiter. Null for direct apply.
directApplybooleanTrue when applying happens on ZipRecruiter.
isActivebooleanWhether the listing is active.
searchQuerystringSearch that found this job. Null for direct job links.
searchLocationstringLocation of that search.
Input settings (19)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Job title or keywordquerystring"nurse"
Locationlocationstring"Chicago, IL"
Maximum jobsmaxItemsinteger20
Search radiusradiusMilesinteger25
Posted within (days)postedWithinDaysinteger
Workplaceremotestring"any"
Employment typesemploymentTypesarray
Experience levelsexperienceLevelsarray
Minimum annual salary (USD)minSalaryinteger
Maximum annual salary (USD)maxSalaryinteger
Company name containscompanyNamestring
Include job descriptionsincludeDescriptionbooleantrue
Include company detailsincludeCompanyDetailsbooleanfalse
Go past the 60-job limitdeepSearchbooleantrue
Additional job titlesadditionalQueriesarray
Additional locationsadditionalLocationsarray
ZipRecruiter URLsstartUrlsarray
Send results to (optional)deliveryConnectorstring
Notion page or channel (optional)deliveryTargetstring

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure