# ZipRecruiter Jobs Scraper - Salary, Company, Full Details (`scrapersdelight/ziprecruiter-jobs-scraper`) Actor

ZipRecruiter job search: title, company, pay with its source (employer, parsed or estimate), employment type, remote/hybrid, benefits, 1-click apply, reposts. Every site filter, past the ~800-job limit, monitor mode. Full description + employer profile add-on. US, Canada, UK, IE, DE, FR, IN, AU

- **URL**: https://apify.com/scrapersdelight/ziprecruiter-jobs-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.44 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does ZipRecruiter Jobs Scraper do?

**ZipRecruiter Jobs Scraper** exports job listings from ZipRecruiter search: one row per job with the title, company, location, pay (and where that pay figure came from), employment type, remote / hybrid / on-site, benefits, 1-click-apply flag, repost flag, post dates and links. Recruiters, staffing agencies, sales teams selling to hiring companies, labor-market analysts and job-board builders use it to track who is hiring, where, and for how much.

ZipRecruiter scraper · ZipRecruiter job scraper · ZipRecruiter API alternative · ziprecruiter.com job data export

- **Every ZipRecruiter search filter**: keywords, any US or Canadian location, distance, posted within (days or any number of hours), employment type, experience level, remote / hybrid / on-site, 1-click apply, minimum and maximum pay.
- **Past the ~800-job limit**: ZipRecruiter stops every search at about 800 jobs, and each request returns a slightly different sample. **Deep search** splits a capped search into narrower ones and re-walks it while that still finds new jobs, merging everything without duplicates (measured: 2,500 unique nurse jobs from one US search ZipRecruiter caps at ~800; 774 driver jobs where a plain walk finds 363).
- **Honest pay**: each pay figure says whether the employer published it, ZipRecruiter parsed it from the text, or ZipRecruiter estimated it. Hidden estimates are never shipped as pay.
- **Full job details (add-on)**: the complete description (text, HTML or Markdown), education and experience asked for, and the employer's profile: website, industry, size, headquarters, founded year, social links and Breakroom worker rating.
- **Monitor mode**: schedule it and get only the jobs posted since the last run.
- **ZipRecruiter's other countries**: the UK, Ireland, Germany, France, India and Australia boards too.
- **No login, no cookies, no browser.**

### What data can you get from ZipRecruiter?

| | | |
|---|---|---|
| 💼 Job title `title` | 🏢 Company `company` | 📍 Location, city, state, ZIP, county |
| 💵 Pay text, min / max, interval `salaryText` | 📅 Yearly pay `salaryMinAnnual` / `salaryMaxAnnual` | 🔎 Pay source `salarySource` (employer / parsed / estimate) |
| 🕒 Full-time, part-time, contract… `employmentType` | 🏠 On-site / remote / hybrid `workplaceType` | 🩺 Benefits (medical, dental, PTO…) `benefits` |
| ⚡ 1-click apply `isQuickApply` | 🔁 Reposted `isRepost` + `firstPostedDate` | 🗓️ Posted date `datePosted` + "3 days ago" |
| ⭐ Employer highlights ("Respectful managers") | 🏷️ Badges (Urgently hiring, Signing bonus) | 📝 Search-result summary `descriptionSnippet` |
| 🔗 Job page, apply link, share link | 🖼️ Company logo, company page | 🆔 Job id, company id, opening id |
| 📄 Full description (details) | 🎓 Education, months of experience (details) | 🌐 Employer website, industry, size, HQ (details) |
| 📣 Employer social links (details) | 📊 Breakroom rating + responses (details) | ✉️ Emails / phones / links in the text (optional) |

### How to scrape ZipRecruiter with ZipRecruiter Jobs Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) (it comes with monthly free credit).
2. Open **ZipRecruiter Jobs Scraper** and type one or more job titles and locations, or paste ZipRecruiter search URLs.
3. Pick filters: distance, posted within, employment type, experience, workplace, pay.
4. Turn on **Full job details** if you need descriptions and employer profiles.
5. Click **Start**. A 20-job search finishes in a few seconds.
6. Download the jobs as JSON, CSV, Excel or HTML, or send them to Google Sheets, a webhook or your app.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| `searchQueries` | array | Job titles or keywords; each runs in every location. Default: none (an example search runs). |
| `locations` | array | "Austin, TX", a ZIP code, a state, "United States", or a Canadian place ("Toronto, ON"). Empty = the whole country. |
| `country` | string | `us` (ziprecruiter.com: US + Canada, every filter) or a country board: `uk`, `ie`, `de`, `fr`, `in`, `au`. Default `us`. |
| `startUrls` | array | ZipRecruiter search URLs (their filters are kept), listing pages (`/Jobs/Registered-Nurse/-in-Austin,TX`), company pages (`/co/<Company>/Jobs`), job pages, country-board searches and jobs. |
| `companyName` | string | Only this employer's jobs. Matched to ZipRecruiter's company record and searched with its company filter. |
| `radius` | string | 5, 10, 25, 50, 100 miles or any distance. Default: ZipRecruiter's 25 miles. |
| `postedWithin` / `postedWithinHours` | string / integer | Last 1, 3, 5, 7, 10, 14 or 30 days, or any number of hours (e.g. 6). |
| `employmentTypes` | array | full_time, part_time, contract, contract_to_hire, temporary, per_diem, internship, other. |
| `experienceLevels` | array | no_experience, junior, mid, senior. |
| `workplaceTypes` | array | on_site, remote, hybrid. |
| `applyType` | string | any, quick_apply (1-click apply on ZipRecruiter), external (apply on the employer's site). |
| `salaryMin` / `salaryMax` | integer | Yearly pay bounds, ZipRecruiter's own pay filter. |
| `salarySource` | string | any, shown (only jobs that show pay), employer (only employer-published pay). |
| `includeKeywords` / `excludeKeywords` / `excludeCompanies` | array | Keep or drop jobs by words in the title and summary, or by company. |
| `skipReposts` | boolean | Drop reposted jobs. |
| `includeDetails` | boolean | Full description + education / experience + employer profile. Charged per job that gets a description. |
| `descriptionFormat` / `descriptionMaxLength` | string / integer | text, html, markdown or all; optional length cut. |
| `extractContacts` | boolean | Emails, phone numbers and links the employer wrote in the description (turns on details). |
| `deepSearch` | boolean | Go past ZipRecruiter's ~800-job limit: split capped searches and re-walk them while they still add new jobs. |
| `maxItems` / `maxItemsPerSearch` | integer | Total cap (default 100) and cap per search. You pay only for jobs delivered. |
| `monitorMode` / `monitorStoreName` | boolean / string | Deliver only jobs not delivered by earlier runs with the same settings. |
| `compact` | boolean | Core fields only. |
| `useUnblocker` | boolean | Last-resort route when ZipRecruiter refuses every other one (default on). |
| `proxyConfiguration` | object | Optional. By default the actor goes direct and switches to residential proxies only when needed. |

#### Input JSON

```json
{
  "searchQueries": ["registered nurse", "travel nurse"],
  "locations": ["Austin, TX", "Dallas, TX"],
  "postedWithin": "7",
  "employmentTypes": ["full_time"],
  "salarySource": "shown",
  "includeDetails": true,
  "maxItems": 500
}
```

#### Put the job title in the query and the place in the location

`"nurse Austin"` as a query searches for those words everywhere; `"registered nurse"` + `"Austin, TX"` uses ZipRecruiter's location and distance filter. A blank query with a location returns every job in that place.

#### Use ZipRecruiter's filters before your own

Employment type, experience, workplace, 1-click apply, pay range, distance and posted-within are applied by ZipRecruiter itself, so a filtered search is fast and fully counted. Keyword, company-exclusion, pay-source and repost filters are checked on each row afterwards.

#### Paste a search URL to copy its filters

Set up a search on ziprecruiter.com, copy the URL from the address bar and paste it into **ZipRecruiter URLs**: query, location, distance, days, employment type, remote, experience, pay and 1-click apply are all read from it.

### ⬆️ Output

One row per job. A real row from the prefilled search (registered nurse, Austin, TX), shortened:

```json
{
  "jobId": "3iYJqr_TXBJKKWqCCEyfNA",
  "title": "RN Registered Nurse (Homecare)",
  "company": "Care Options for Kids",
  "location": "Austin, TX",
  "postalCode": "78701",
  "workplaceType": "On-site",
  "employmentType": "Full-time",
  "salaryText": "$32 - $39/hr",
  "salaryMin": 32,
  "salaryMax": 39,
  "salaryInterval": "hour",
  "salaryMinAnnual": 64000,
  "salaryMaxAnnual": 78000,
  "salarySource": "employer",
  "benefits": ["Medical", "Vision", "Dental", "Paid time off", "Retirement"],
  "datePosted": "2026-09-25T13:41:47Z",
  "isRepost": false,
  "postedAgo": "18 days ago",
  "applyType": "apply on employer site",
  "isQuickApply": false,
  "url": "https://www.ziprecruiter.com/c/Care-Options-for-Kids/Job/RN-Registered-Nurse-(Homecare)/-in-Austin,TX?jid=8f51e375d5aca5b8",
  "searchQuery": "registered nurse",
  "position": 1
}
```

With **Full job details**, the same row also carries `description`, `educationRequired`, `experienceMonths`, `companyWebsite`, `companyIndustry`, `companySize`, `companyFounded`, `companyHeadquarters`, `companySocialLinks`, `breakroomRating` and more.

#### Fields and how often they are filled

Measured on 2,500 jobs (deep search "nurse", United States) and 61 jobs with details, 2026-10-14. A field is empty when ZipRecruiter does not publish it for that job.

| Field | Filled | Field (details) | Filled |
|---|---|---|---|
| title, company, employmentType, workplaceType, datePosted, applyUrl, descriptionSnippet | 100% | description | 100% |
| location, city | 99% | companyWebsite, companySize | 77% |
| postalCode | 80% | companyHeadquarters | 75% |
| benefits | 54% | companyIndustry | 72% |
| salaryText / salaryMin / salaryMax / salarySource | 52% | companySocialLinks | 69% |
| companyLogo | 55% | educationRequired | 59% |
| employerHighlights | 22% | companyAddress | 46% |
| isRepost = true | 20% of jobs | companyFounded, companyDescription | 41-43% |
| 1-click apply | 40% of jobs | experienceMonths | 39% |
| jobBadges | under 3% | breakroomRating | 36% |

Pay sources on those 2,500 jobs: employer-published 816, parsed from the description 409, ZipRecruiter estimate 70, no pay shown 1,205.

### How can I use ZipRecruiter job data?

- 🧲 **Staffing and recruiting agencies**: find employers hiring for the roles you place, with pay and urgency badges.
- 📈 **Sales teams**: companies that post many jobs are growing; the employer website and size come with details.
- 💵 **Compensation analysts**: pay ranges by title and city, with the pay source so estimates can be excluded.
- 🗺️ **Labor-market research**: remote vs on-site, contract vs full-time, reposts as a sign of hard-to-fill roles.
- 🔔 **Job alerts and job boards**: monitor mode on a schedule delivers only new postings.
- 🤖 **AI agents**: compact rows through the API or MCP.

### How much does it cost to scrape ZipRecruiter?

Pay per result, no start fee:

| Event | Price | When |
|---|---|---|
| Job | $0.00044 per job ($0.44 per 1,000) | every job row |
| Job details | $0.00002 per job ($0.02 per 1,000) | each job that gets its full description (Full job details on) |

| Run | Cost |
|---|---|
| 20 jobs (the prefilled demo) | $0.0088 |
| 100 jobs | $0.044 |
| 100 jobs with full details | $0.046 |
| 1,000 jobs | $0.44 |

Duplicates, filtered-out jobs and jobs a monitor run already delivered are not charged. Apify's free monthly credit covers thousands of jobs.

### Integrations, API, scheduling and MCP

Run it on a **schedule** with **monitor mode** to receive only new jobs. Send results to **Google Sheets, Slack, Make, Zapier or n8n**, or trigger **webhooks** when a run finishes. Call it from code with the [Python](https://apify.com/scrapersdelight/ziprecruiter-jobs-scraper/api/python) or [JavaScript](https://apify.com/scrapersdelight/ziprecruiter-jobs-scraper/api/javascript) client, or let AI assistants use it through the [MCP server](https://apify.com/scrapersdelight/ziprecruiter-jobs-scraper/api/mcp).

### More job scrapers

- 🏢 [Glassdoor Jobs Scraper](https://apify.com/scrapersdelight/glassdoor-jobs-scraper) — jobs with company ratings
- 💼 [LinkedIn Jobs Scraper](https://apify.com/scrapersdelight/linkedin-jobs-scraper) — LinkedIn job postings
- 🧩 [ATS Jobs Scraper](https://apify.com/scrapersdelight/ats-jobs-scraper) — jobs straight from company career pages
- 🇬🇧 [Reed Jobs Scraper](https://apify.com/scrapersdelight/reed-jobs-scraper) — UK jobs from reed.co.uk
- 🇦🇺 [SEEK Jobs Scraper](https://apify.com/scrapersdelight/seek-jobs-scraper) — Australia and New Zealand jobs

All our actors: [apify.com/scrapersdelight](https://apify.com/scrapersdelight).

### Limits and empty runs

- ZipRecruiter returns at most ~800 jobs per search (offset 780 gave 22 jobs, 1,200 gave none). Use **deep search**, more locations or narrower filters for more.
- ZipRecruiter answers each request from a slightly different sample, and the total it reports moves with it (one "driver" search reported 346 to 462 across consecutive pages). A plain walk reads to the largest total seen; deep search re-walks the search and keeps the new jobs. Duplicates are never delivered twice.
- Speed on a direct connection: 20 jobs in about 3 seconds, 2,500 with deep search in about a minute. Details are read about one per 1.6 seconds, because ZipRecruiter rate-limits that request (100 jobs with details: 163 seconds); after ~150 in a row ZipRecruiter pauses the connection for ~2.5 minutes and the actor continues through a residential proxy or waits.
- When ZipRecruiter refuses direct requests, the actor switches to residential proxies, and as a last resort to Apify's Unblocker, which reads search pages of 20 jobs (about a minute each). Employer highlights are not on those pages.
- Country boards list title, company, place, date and a snippet (France: no snippet); details add the description, expiry date and coordinates. They have no pay, employment or experience filters.
- An empty run costs nothing. `RUN_SUMMARY` lists, per search, ZipRecruiter's own total, jobs delivered, duplicates and filtered counts, and the route used.

### ❓ FAQ

#### How much does ZipRecruiter Jobs Scraper cost?

$0.44 per 1,000 jobs, plus $0.02 per 1,000 jobs when you turn on full details. No start fee; an empty run costs nothing.

#### How many jobs can ZipRecruiter Jobs Scraper get?

ZipRecruiter shows up to ~800 jobs per search. With **deep search** the actor splits a capped search and re-walks it, merging the results: one "nurse" search across the United States returned 2,500 unique jobs, and "driver" 774 where a single walk returns 363.

#### Can ZipRecruiter Jobs Scraper get the full job description?

Yes. Turn on **Full job details**: the full description (text, HTML or Markdown) plus education, experience, and the employer's website, industry, size, headquarters, social links and Breakroom rating.

#### Does ZipRecruiter Jobs Scraper show where the salary comes from?

Yes. `salarySource` says employer, job description (parsed by ZipRecruiter) or ZipRecruiter estimate, and **Pay shown** can keep only employer-published pay.

#### Can ZipRecruiter Jobs Scraper monitor new jobs?

Yes. Turn on **Only new jobs (monitor)** and schedule the run; each run delivers only jobs earlier runs with the same settings did not deliver.

#### Does ZipRecruiter Jobs Scraper work for Canada, the UK and other countries?

Canada works through ziprecruiter.com with a Canadian location. Set **Country** for ZipRecruiter's UK, Ireland, Germany, France, India and Australia boards.

#### Does ZipRecruiter Jobs Scraper need a login, cookies or an API key?

No. It reads the same public job search a visitor sees, without an account.

#### Can I use ZipRecruiter Jobs Scraper with the Apify API?

Yes. Start runs and read results with the Apify API or its Python and JavaScript clients; every input above is a JSON key.

#### Can AI agents use ZipRecruiter Jobs Scraper through MCP?

Yes. Add it to the Apify MCP server; the `compact` option keeps rows short.

#### Why did ZipRecruiter Jobs Scraper return no results?

Usually the filters exclude everything or the location was not recognised. Open `RUN_SUMMARY`: it shows ZipRecruiter's own total for each search and why jobs were filtered.

#### Your feedback

Found a bug or need a field? Open an issue on the [Issues tab](https://apify.com/scrapersdelight/ziprecruiter-jobs-scraper/issues/open); we read every one.

# Actor input Schema

## `searchQueries` (type: `array`):

One search per entry, e.g. "registered nurse" or "warehouse associate". Each is run in every location below. Leave empty with a location set to get every job there.

## `locations` (type: `array`):

City and state ("Austin, TX"), a ZIP code, a state ("Texas") or "United States". Canadian places work too ("Toronto, ON"). Empty = the whole country. On the country boards (see Country) use that country's towns.

## `country` (type: `string`):

us = ziprecruiter.com (United States and Canada, every filter below). The others are ZipRecruiter's separate country boards: they list title, company, place, date and a snippet, with full details as the add-on, and offer no pay / employment / experience filters.

## `startUrls` (type: `array`):

Optional. Paste search URLs (ziprecruiter.com/jobs-search?search=...\&location=..., with their filters), listing pages (/Jobs/Registered-Nurse/-in-Austin,TX), company pages (/co/<Company>/Jobs), job pages (/c/<Company>/Job/...?jid=...), or country-board searches and jobs (ziprecruiter.co.uk/jobs/search?q=..., /jobs/<id>).

## `companyName` (type: `string`):

Only jobs from this employer, e.g. "CVS Health". On ziprecruiter.com the name is matched to ZipRecruiter's company record and searched with its company filter; otherwise jobs whose company name contains it are kept.

## `radius` (type: `string`):

How far from each location to search. Empty = ZipRecruiter's default (25 miles). On the country boards it is sent as the nearest kilometre option.

## `postedWithin` (type: `string`):

Only jobs posted (or reposted) in the last N days.

## `postedWithinHours` (type: `integer`):

Any window in hours, e.g. 6 for jobs posted in the last 6 hours. Overrides "Posted within" when set. 0 = off.

## `employmentTypes` (type: `array`):

Keep jobs of any of these types (ziprecruiter.com).

## `experienceLevels` (type: `array`):

ZipRecruiter's experience-level filter (ziprecruiter.com).

## `workplaceTypes` (type: `array`):

On-site, remote or hybrid jobs (ziprecruiter.com). Remote also returns "remote optional" jobs, as on the site.

## `applyType` (type: `string`):

1-click apply = jobs you apply to on ZipRecruiter (ZipApply); employer site = jobs that send you to the employer's own page.

## `salaryMin` (type: `integer`):

ZipRecruiter's own pay filter, as yearly pay (e.g. 60000). Jobs without pay are not returned when it is set. 0 = off.

## `salaryMax` (type: `integer`):

Upper bound of the yearly pay, e.g. 90000. 0 = off.

## `salarySource` (type: `string`):

Keep only jobs that show pay, or only jobs whose pay the employer published (drops figures ZipRecruiter parsed from the text or estimated).

## `includeKeywords` (type: `array`):

Keep a job only when its title, company or summary contains at least one of these words (case-insensitive).

## `excludeKeywords` (type: `array`):

Drop a job when its title or summary contains any of these words, e.g. "travel", "per diem".

## `excludeCompanies` (type: `array`):

Drop jobs whose company name contains any of these (e.g. staffing agencies).

## `skipReposts` (type: `boolean`):

Drop jobs ZipRecruiter shows as reposted (first posted earlier than their current post date).

## `includeDetails` (type: `boolean`):

Fetch each job's full description plus education and experience requirements and the employer's profile (website, industry, size, HQ, founded, social links, Breakroom rating). One extra request per job; charged per job that gets a description.

## `descriptionFormat` (type: `string`):

Plain text, the original HTML, Markdown, or all three (with details).

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters. 0 = full length.

## `extractContacts` (type: `boolean`):

Copy the email addresses, phone numbers and links the employer wrote in the job description into emails / phones / urls. Turns on full details (and its charge).

## `deepSearch` (type: `boolean`):

ZipRecruiter shows at most ~800 jobs per search. When a search hits that limit, it is re-run split by employment type, experience level and workplace, and the results are merged without duplicates.

## `maxItems` (type: `integer`):

Stop after this many jobs in total. You pay only for jobs delivered.

## `maxItemsPerSearch` (type: `integer`):

Cap for each query + location (or URL). 0 = no per-search cap.

## `monitorMode` (type: `boolean`):

Remember the jobs delivered by earlier runs with the same search settings and deliver only jobs not seen before. Schedule the actor to get a feed of new postings.

## `monitorStoreName` (type: `string`):

Named key-value store that keeps the monitor memory. Use different names to keep separate feeds.

## `compact` (type: `boolean`):

Only the core fields: id, title, company, location, workplace, employment type, pay, date, apply type, links (plus the description when details are on).

## `useUnblocker` (type: `boolean`):

When ZipRecruiter refuses every other route, load its search pages through Apify's Unblocker (slower, under a per-run budget). Turn off to stop at the residential proxy.

## `proxyConfiguration` (type: `object`):

Optional. By default requests go out directly and switch to Apify's residential proxy (under a per-run budget) only when ZipRecruiter refuses them. Set your own proxy URLs or a proxy group to use them first.

## Actor input object example

```json
{
  "searchQueries": [
    "registered nurse"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "us",
  "radius": "",
  "postedWithin": "any",
  "postedWithinHours": 0,
  "employmentTypes": [],
  "experienceLevels": [],
  "workplaceTypes": [],
  "applyType": "any",
  "salaryMin": 0,
  "salaryMax": 0,
  "salarySource": "any",
  "includeKeywords": [],
  "excludeKeywords": [],
  "excludeCompanies": [],
  "skipReposts": false,
  "includeDetails": false,
  "descriptionFormat": "text",
  "descriptionMaxLength": 0,
  "extractContacts": false,
  "deepSearch": false,
  "maxItems": 20,
  "maxItemsPerSearch": 0,
  "monitorMode": false,
  "monitorStoreName": "ziprecruiter-jobs-monitor",
  "compact": false,
  "useUnblocker": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per job.

## `summary` (type: `string`):

Per search: ZipRecruiter's own total, pages read, jobs delivered, duplicates and filtered counts, errors, and the route used.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "registered nurse"
    ],
    "locations": [
        "Austin, TX"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/ziprecruiter-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["registered nurse"],
    "locations": ["Austin, TX"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/ziprecruiter-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "registered nurse"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxItems": 20
}' |
apify call scrapersdelight/ziprecruiter-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/ziprecruiter-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/AI2qtgLFj8SOcuOMO/builds/faj7RREfFh56VnmG0/openapi.json
