# ZipRecruiter Scraper: US Jobs, Pay and Employers

> ZipRecruiter scraper: enter a job title and a US location. Get pay, full job text, company and location for each job. No login.

URL: https://cliqtomedia.com/actors/ziprecruiter-scraper/

Category: Jobs & hiring · Status: coming soon · Apify profile: https://apify.com/cliqtomedia?fpr=cliqto

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.

## How to use it: 3 steps

1. **Follow us on Apify.** The 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 Start.** No 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 results.** When 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.

## 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.

## 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.

## Data fields

- `jobId` (string): ZipRecruiter job ID (jid), stable between runs. Use for dedupe.
- `title` (string): Job title.
- `company` (string): Hiring company name.
- `location` (string): Location as shown on the listing.
- `salary` (string): Pay as shown on the listing. Null when not shown.
- `employmentType` (string): Primary employment type, for example FULL_TIME.
- `remote` (boolean): True for remote jobs, false for hybrid or on-site, null when the source does not say.
- `postedAt` (string): Posting date, ISO 8601.
- `description` (string): Full job description as text. Null when not requested or not available.
- `url` (string): Job page on ZipRecruiter.
- `source` (string): Always ziprecruiter.
- `fetchedAt` (string): When this row was read, ISO 8601.
- `listingKey` (string): Source listing key, present on rows from search pages.
- `city` (string): City.
- `state` (string): State code.
- `postalCode` (string): Postal code.
- `country` (string): Country code.
- `companyUrl` (string): Company page on ZipRecruiter.
- `companyLogo` (string): Company logo URL.
- `salaryMin` (number): Minimum pay in salaryInterval units.
- `salaryMax` (number): Maximum pay in salaryInterval units.
- `salaryMinAnnual` (number): Minimum pay converted to a year by the source.
- `salaryMaxAnnual` (number): Maximum pay converted to a year by the source.
- `salaryInterval` (string): HOUR, DAY, WEEK, MONTH or YEAR.
- `salaryCurrency` (string): Pay currency, for example USD.
- `salaryIsEstimated` (boolean): True when the source estimated the pay instead of the employer stating it.
- `employmentTypes` (array): All employment types.
- `benefits` (array): Benefits listed by the source.
- `locationType` (string): IN_PERSON, REMOTE, HYBRID or REMOTE_OPTIONAL.
- `refreshedAt` (string): When the source last refreshed the listing, in ISO 8601. The source's date filter and age follow this date.
- `postedRelative` (string): Age as shown, for example 3 days ago.
- `validThrough` (string): Listing end date. Needs company details.
- `seniority` (string): no_experience, junior, mid or senior.
- `experienceMonths` (number): Months of experience asked for.
- `education` (string): Education asked for. Needs company details.
- `applyUrl` (string): External apply link through ZipRecruiter. Null for direct apply.
- `directApply` (boolean): True when applying happens on ZipRecruiter.
- `isActive` (boolean): Whether the listing is active.
- `searchQuery` (string): Search that found this job. Null for direct job links.
- `searchLocation` (string): Location of that search.

## Input settings

- `query` (string): What to search for, for example nurse or software engineer. Required unless you add additional queries or start URLs.
- `location` (string): US city and state, ZIP code or state, for example Chicago, IL. Leave empty to search the whole United States.
- `maxItems` (integer): Most jobs to save across all searches. Runs above 200 jobs need a Run timeout above 300 seconds: allow about 1 second per job.
- `radiusMiles` (integer): Miles around the location: 5, 10, 25, 50 or 100.
- `postedWithinDays` (integer): Only jobs posted in the last N days. Leave empty for any date.
- `remote` (string): Limit results to remote, hybrid or on-site jobs.
- `employmentTypes` (array): Keep only these types. Empty means all. Each selected type runs as its own search.
- `experienceLevels` (array): Keep only these levels. Empty means all. Each selected level runs as its own search.
- `minSalary` (integer): Only jobs paying at least this per year, as filtered by ZipRecruiter.
- `maxSalary` (integer): Only jobs paying at most this per year, as filtered by ZipRecruiter. Must not be below the minimum.
- `companyName` (string): Keep only jobs whose company contains this text. ZipRecruiter has no company filter, so the Actor reads search pages and filters them; every search page checked is charged, even with no match. Example: Acme.
- `includeDescription` (boolean): Open each job page for the full description, charged per description delivered. Turn off for faster, cheaper rows.
- `includeCompanyDetails` (boolean): Add company website, size, founding year, headquarters, skills and job category. Charged for every job whose full page was read, also when the page has no company data.
- `deepSearch` (boolean): ZipRecruiter shows at most 60 jobs per search. When on, the Actor repeats the search with narrower filters to reach more unique jobs.
- `additionalQueries` (array): More job titles to search, up to 50. Each is combined with every location. Every search after the first has a small fee, see Pricing. Example: registered nurse.
- `additionalLocations` (array): More locations to search, up to 50. Each is combined with every job title. Every search after the first has a small fee, see Pricing. Example: Austin, TX.
- `startUrls` (array): Search links (/jobs-search, /Jobs/) or job links (/c/.../Job/...?jid=...) from www.ziprecruiter.com, up to 500. The first removed job link is free, others have a small fee. The run stops when removed links outnumber saved rows by more than 9.
- `deliveryConnector` (string): Your Slack, Notion or other MCP connector. After the run the Actor posts a short summary there. Connect services once in Apify Console → MCP connectors.
- `deliveryTarget` (string): Where to post the summary: a Notion page link (each run is added on top of that page) or a Slack channel ID. Leave empty to let the connector decide.

## 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

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Find open roles for a client | `query`, `location`, `postedWithinDays` | Job | `title`, `company`, `postedAt`, `url` | CSV or Excel export |
| Compare pay across cities | `query`, `additionalLocations`, `minSalary` | Job | `salaryMin`, `salaryMax`, `salaryInterval`, `state` | API or Dataset export |
| Find employers that hire now | `query`, `location`, `includeCompanyDetails` | Job with company data | `company`, `companyDetails`, `companyUrl` | CSV export to your own list |
| Watch remote jobs | `query`, `remote`, `employmentTypes` | Job | `title`, `remote`, `locationType`, `refreshedAt` | Schedule, then Slack or Notion summary |
| Re-read jobs you saved earlier | `startUrls` | Job | `jobId`, `isActive`, `salary`, `description` | API |

## Tips

- 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



- 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`.

## Sample 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
}
```

## Similar tools

- [Google Jobs Scraper - Salary, Apply Links & Dates, No Login](https://cliqtomedia.com/actors/google-jobs-scraper/)
- [Glassdoor Jobs & Reviews Scraper](https://cliqtomedia.com/actors/glassdoor-scraper/)
- [Remote Jobs Aggregator - RemoteOK, WWR & Himalayas, No login](https://cliqtomedia.com/actors/remote-jobs-aggregator/)
- [Wellfound Jobs Scraper: Startup Jobs to CSV & JSON](https://cliqtomedia.com/actors/wellfound-jobs-scraper/)
- [Ashby Jobs Scraper: Public Job Board Export](https://cliqtomedia.com/actors/ashby-jobs-scraper/)
- [Lever Jobs Scraper: jobs.lever.co Postings Export](https://cliqtomedia.com/actors/lever-jobs-scraper/)
