# ZipRecruiter Jobs Scraper (`parsebird/ziprecruiter-jobs-scraper`) Actor

Scrape ZipRecruiter job listings by keyword and location or from URLs: titles, companies, salaries, benefits, workplace type, full descriptions, posting dates and employer apply links.

- **URL**: https://apify.com/parsebird/ziprecruiter-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.19 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### ZipRecruiter Jobs Scraper

**ZipRecruiter Jobs Scraper** extracts job listings from [ZipRecruiter](https://www.ziprecruiter.com) by keyword and location, or from ZipRecruiter search, category and job URLs. You get the job title, company, salary, benefits, location, workplace type, job type, posting date and apply link, plus optional full job details, as clean JSON, CSV or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search ZipRecruiter with its own filters (job type, date posted, remote or hybrid, experience level, salary range, distance and 1-Click Apply) and get 56 fields per job, including ZipRecruiter's pay estimates, the full description, company profile, and the employer's own apply link.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/ziprecruiter-jobs-scraper. Scrapes job listings from ZipRecruiter (ziprecruiter.com, US jobs). Call via ApifyClient: client.actor("parsebird/ziprecruiter-jobs-scraper").call(run_input={"searches": ["data analyst"], "location": "San Francisco, CA", "jobType": "full_time", "postedWithin": "week", "maxItems": 100, "includeDetails": false}). Inputs: searches (array of strings, job titles/skills/companies, one search each), location (string, city + state, ZIP code, state, "United States", or "Remote"; default United States), startUrls (array of {url}, ZipRecruiter /jobs-search URLs, /Jobs/<keyword>/-in-<City>,<ST> category pages, or job URLs with ?jid=), jobType (string: full_time | part_time | contract | contract_to_hire | temporary | as_needed | other), postedWithin (string: anytime | today | 3days | week | 2weeks | month, default anytime), remoteType (string: only_remote | hybrid | no_remote), experienceLevel (string: no_experience | junior | mid | senior), salaryRange (string, minimum annual USD, e.g. "50000"), salaryMax (string, maximum annual USD), radius (string miles: 5 | 10 | 25 | 50 | 100, default 25), easyApplyOnly (boolean, default false), maxItems (integer, total jobs, default 20), maxPages (integer, pages of 20 per search, default 25, ZipRecruiter shows about 25 pages max), includeDetails (boolean, default false; opens each job page for full description, industry, category, validThrough, company profile, employer apply URL; billed as an extra event). Output fields per job: id, url, title, company, companyWebsite, companyZipRecruiterUrl, companyLogo, companyDescription, companyIndustries, companySize, companyHeadquarters, companyRating, companyRatingCount, location, city, state, stateName, county, postalCode, country, workplaceType, isRemote, salaryMin, salaryMax, salaryInterval, salaryCurrency, salaryText, salaryIsEstimated, salaryMinAnnual, salaryMaxAnnual, benefits, employmentType, employmentTypes, industry, category, educationLevel, educationRequired, skills, experienceRequirements, highlights, shortDescription, description, descriptionText, postedDate, repostedDate, validThrough, postedHumanDate, isActive, directApply, applyUrl, employerJobId, detailsScraped, searchQuery, searchLocation, scrapedAt, dataType. Pricing: pay per job saved, plus a details event per job when includeDetails is on. Full API spec: https://apify.com/parsebird/ziprecruiter-jobs-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is ZipRecruiter Jobs Scraper?

[ZipRecruiter](https://www.ziprecruiter.com) is a US job marketplace where employers post jobs and candidates apply, often with "1-Click Apply". **ZipRecruiter Jobs Scraper** turns ZipRecruiter search results into a structured dataset, so you can collect thousands of jobs without copying them by hand. It's a simple **ZipRecruiter API alternative**: you don't need a ZipRecruiter account, an API key or any code.

Type a job title and a location, press Start, and download the jobs as JSON, CSV, Excel or HTML.

- 🔎 **Search by keyword and location.** City and state, ZIP code, state, the whole United States, or `Remote` for remote jobs nationwide.
- 🧰 **All of ZipRecruiter's filters.** Job type, date posted, remote/hybrid/on-site, experience level, minimum and maximum salary, distance, and 1-Click Apply only.
- 🔗 **Paste URLs.** ZipRecruiter search URLs (filters are kept), category pages like `/Jobs/Nurse/-in-Chicago,IL`, and single job URLs.
- 💵 **Salary data on almost every job.** Pay range, pay period, annual equivalent, and a flag that tells you whether the employer posted the pay or ZipRecruiter estimated it.
- 📄 **Optional full job details.** Turn on `includeDetails` to add the full description, industry, occupational category, expiry date, company profile and rating, and the employer's own apply link.
- 🧹 **No duplicates.** ZipRecruiter repeats some jobs across result pages; the scraper saves each job once per run.
- 📅 **Scheduling and monitoring.** Run daily or weekly with [Apify Schedules](https://docs.apify.com/platform/schedules) and use `postedWithin` to collect only new jobs.
- 🔌 **API and integrations.** Use the [Apify API](https://docs.apify.com/api/v2), or send jobs to Google Sheets, Zapier, Make, Slack, or webhooks with [Apify integrations](https://docs.apify.com/platform/integrations).

### What data can you extract from ZipRecruiter?

| Field | Description | Needs details |
|-------|-------------|:---:|
| `id` / `url` | ZipRecruiter job ID (`jid`) and job page URL | |
| `title` / `shortDescription` | Job title and the snippet shown in search results | |
| `company` / `companyLogo` / `companyZipRecruiterUrl` | Hiring company, logo, and its ZipRecruiter jobs page | |
| `location` / `city` / `state` / `postalCode` / `country` | Job location, split into parts | |
| `workplaceType` / `isRemote` | On-site, Remote, Hybrid, or a mix | |
| `salaryMin` / `salaryMax` / `salaryInterval` / `salaryCurrency` / `salaryText` | Pay range and period (hour, year and others) | |
| `salaryIsEstimated` / `salaryMinAnnual` / `salaryMaxAnnual` | Whether ZipRecruiter estimated the pay, and the yearly equivalent | |
| `benefits` | Benefits listed by the employer, such as Medical, Dental, 401(k) | |
| `employmentType` | FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, and others | |
| `postedDate` / `repostedDate` / `postedHumanDate` | When the job was posted or reposted | |
| `directApply` / `applyUrl` | Whether you can apply on ZipRecruiter (1-Click Apply), and the apply link | |
| `description` / `descriptionText` | Full job description as HTML and as plain text | ✅ |
| `industry` / `category` | Industry and occupational category (O\*NET code) | ✅ |
| `validThrough` / `employerJobId` | Listing expiry date and the employer's own requisition ID | ✅ |
| `companyWebsite` / `companyDescription` / `companyIndustries` / `companySize` / `companyHeadquarters` | Company profile | ✅ |
| `companyRating` / `companyRatingCount` | Employer rating (out of 10) and number of worker responses, shown on ZipRecruiter | ✅ |
| `educationLevel` / `educationRequired` / `skills` | Education requirement and skills, when ZipRecruiter lists them | ✅ |

Fields marked ✅ are filled when **`includeDetails`** is on (and for pasted job URLs). Fields stay empty when ZipRecruiter doesn't show that information for a job.

### How to scrape ZipRecruiter jobs

1. Open [ZipRecruiter Jobs Scraper](https://apify.com/parsebird/ziprecruiter-jobs-scraper) and click **Try for free**.
2. Enter one or more **search keywords**, such as `software engineer` or `registered nurse`.
3. Enter a **location**, such as `New York, NY`, a ZIP code, or `Remote`.
4. Optionally set **filters**: job type, date posted, remote/hybrid, experience level, salary or distance.
5. Set **Max jobs** and choose whether to **add full job details**.
6. Click **Start**. When the run finishes, download the jobs from the **Output** tab as JSON, CSV, Excel or HTML.

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

ZipRecruiter Jobs Scraper uses pay-per-event pricing. You pay for each job saved, and for job details only when you turn them on. Compute and proxy costs are included in these prices; there's nothing else to pay.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Job saved (`job-scraped`) | $2.49 / 1,000 | $2.39 / 1,000 | $2.29 / 1,000 | $2.19 / 1,000 |
| Job details added (`job-details`) | $3.99 / 1,000 | $3.89 / 1,000 | $3.79 / 1,000 | $3.69 / 1,000 |

For example, on the Free plan 1,000 jobs from search results cost **$2.49**, and 1,000 jobs with full details cost **$6.48** ($2.49 + $3.99). The details event is charged only for jobs whose job page was read; if a job page can't be loaded, that job is saved with search data and no details charge. Apify's free plan includes monthly platform credit you can use to try the scraper. Set a maximum cost per run in the run options and the scraper stops when it reaches it.

### Input

Search by keyword and location, or paste ZipRecruiter URLs. See the **Input** tab for every option.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searches` | array | — | Job titles, skills or company names; each runs as its own search |
| `location` | string | United States | City and state, ZIP code, state, `United States`, or `Remote` |
| `startUrls` | array | — | ZipRecruiter search URLs, `/Jobs/...` category pages, or job URLs (`?jid=`) |
| `jobType` | string | any | `full_time`, `part_time`, `contract`, `contract_to_hire`, `temporary`, `as_needed`, `other` |
| `postedWithin` | string | `anytime` | `today`, `3days`, `week`, `2weeks`, `month` |
| `remoteType` | string | any | `only_remote`, `hybrid`, `no_remote` |
| `experienceLevel` | string | any | `no_experience`, `junior`, `mid`, `senior` |
| `salaryRange` | string | — | Minimum annual salary in USD, e.g. `50000` |
| `salaryMax` | string | — | Maximum annual salary in USD |
| `radius` | string | `25` | Miles around the location: `5`, `10`, `25`, `50`, `100` |
| `easyApplyOnly` | boolean | `false` | Only jobs with 1-Click Apply on ZipRecruiter |
| `maxItems` | integer | `20` | Maximum jobs in total |
| `maxPages` | integer | `25` | Maximum result pages (20 jobs each) per search |
| `includeDetails` | boolean | `false` | Open each job page for full details (extra event) |

**Example: full-time data analyst jobs posted this week**

```json
{
    "searches": ["data analyst"],
    "location": "San Francisco, CA",
    "jobType": "full_time",
    "postedWithin": "week",
    "maxItems": 100
}
```

**Example: remote jobs paying $150K+**

```json
{
    "searches": ["machine learning engineer"],
    "location": "Remote",
    "salaryRange": "150000",
    "maxItems": 50
}
```

**Example: a ZipRecruiter search URL, with full details**

```json
{
    "startUrls": [
        { "url": "https://www.ziprecruiter.com/jobs-search?search=nurse&location=Chicago%2C+IL" }
    ],
    "maxItems": 100,
    "includeDetails": true
}
```

### Output example

One job with `includeDetails` on (description shortened):

```json
{
    "id": "16b95c937eed52e1",
    "url": "https://www.ziprecruiter.com/c/Capital-One/Job/Staff-AI-Engineer-role-(Remote-Eligible)/-in-Manhattan,NY?jid=16b95c937eed52e1",
    "title": "Staff AI Engineer role (Remote Eligible)",
    "company": "Capital One",
    "companyWebsite": "https://www.capitalone.com/",
    "companyZipRecruiterUrl": "https://www.ziprecruiter.com/co/Capital-One/Jobs",
    "companyLogo": "https://www.ziprecruiter.com/svc/fotomat/public-nosensitive-ziprecruiter-logos/company/60122984.png",
    "companyIndustries": ["Funds, Trusts and Financial Programs", "Real Estate"],
    "companySize": "10000+ Employees",
    "companyHeadquarters": "McLean, VA, US",
    "companyRating": 7.8,
    "companyRatingCount": 149,
    "location": "Manhattan, NY",
    "city": "Manhattan",
    "state": "NY",
    "postalCode": "10012",
    "country": "US",
    "workplaceType": "On-site, Remote",
    "isRemote": true,
    "salaryMin": 75700,
    "salaryMax": 137100,
    "salaryInterval": "YEAR",
    "salaryCurrency": "USD",
    "salaryText": "$75,700 - $137,100/yr",
    "salaryIsEstimated": true,
    "benefits": [],
    "employmentType": "FULL_TIME",
    "industry": "Engineering",
    "category": "17-2199.00: Engineers, All Other",
    "descriptionText": "Staff AI Engineer role (Remote Eligible)\n\nAt Capital One, we are creating responsible and reliable AI systems...",
    "postedDate": "2026-08-28T20:43:49Z",
    "repostedDate": "2026-09-27T20:43:49Z",
    "validThrough": "2026-11-08",
    "postedHumanDate": "12 days ago",
    "isActive": true,
    "directApply": false,
    "applyUrl": "https://capitalone.wd12.myworkdayjobs.com/Capital_One/job/Staff-AI-Engineer-role--Remote-Eligible-_R1002560-1/apply?utm_source=ziprecruiter",
    "employerJobId": "R1002560",
    "detailsScraped": true,
    "searchQuery": "software engineer",
    "searchLocation": "New York, NY",
    "scrapedAt": "2026-10-10T02:50:47Z",
    "dataType": "job"
}
```

Download the dataset in JSON, CSV, Excel, XML or HTML from the Output tab or through the API.

### Use the ZipRecruiter Jobs Scraper API

Start a run and read the results with the [Apify API client for Python](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/ziprecruiter-jobs-scraper").call(run_input={
    "searches": ["registered nurse"],
    "location": "Houston, TX",
    "jobType": "full_time",
    "maxItems": 100,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "|", job["company"], "|", job["salaryText"])
```

Or with the [Apify API client for JavaScript](https://docs.apify.com/api/client/js):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/ziprecruiter-jobs-scraper').call({
    searches: ['registered nurse'],
    location: 'Houston, TX',
    jobType: 'full_time',
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((job) => console.log(job.title, '|', job.company, '|', job.salaryText));
```

See the [API tab](https://apify.com/parsebird/ziprecruiter-jobs-scraper/api) for the HTTP endpoints, and the [Apify API docs](https://docs.apify.com/api/v2) for scheduling runs and fetching datasets.

### Use cases

- **Job market research.** Track how many jobs are posted for a role in each city, and how pay ranges compare.
- **Salary benchmarking.** Collect posted and estimated pay ranges by job title, location, and experience level.
- **Recruiting and lead generation.** Find companies that are hiring for a role in your area, with their websites and company size.
- **Job boards and aggregators.** Feed fresh ZipRecruiter jobs into your own job site or newsletter on a schedule.
- **Remote work tracking.** Monitor remote and hybrid jobs for a skill across the US.

### How it works

1. For each keyword, the scraper opens ZipRecruiter's search with your location and filters, page by page (20 jobs per page).
2. It reads the job data ZipRecruiter puts in each results page, skips jobs it has already saved, and stops at your `maxItems`, `maxPages`, or the end of the results.
3. With `includeDetails` on, it also opens each job page for the description, company profile, and the employer's apply link.
4. Every job is saved to the dataset as soon as its page is done, so you can watch results arrive.

### FAQ

**Do I need a ZipRecruiter account or API key?**
No. The scraper collects public job listings that anyone can see on ZipRecruiter without logging in.

**How many jobs can I get per search?**
ZipRecruiter shows about 25 pages (roughly 500 jobs) for one search. To collect more, split it into several searches by city, job type, date posted, or salary range. Results are combined and duplicates are skipped.

**What does `salaryIsEstimated` mean?**
When an employer doesn't post pay, ZipRecruiter shows its own estimate. `salaryIsEstimated` is `false` when the employer posted the pay and `true` for ZipRecruiter's estimate. Salaries are shown as entered, so an employer can occasionally post an hourly rate as yearly pay.

**Can I sort jobs by date?**
ZipRecruiter no longer offers sorting; results come in ZipRecruiter's relevance order. Use `postedWithin` (for example `today` or `3days`) to get only recent jobs. You can then sort the dataset by `postedDate`.

**Is there an internship filter?**
ZipRecruiter has no internship job type. Add "intern" or "internship" to your search keyword instead.

**Should I turn on `includeDetails`?**
Turn it on if you need the full description, industry, expiry date, company profile, or the employer's own apply link. It costs an extra event per job and runs slower, because every job page is opened separately. Search data alone already includes salary, benefits, location, job type, and a short description.

**How long does a run take?**
ZipRecruiter limits automated traffic, so requests go through an unblocking proxy, which takes several seconds each. A results page brings 20 jobs at once, so search-only runs are much faster than runs with details, where every job is an extra request.

**Does it work outside the US?**
The scraper works with jobs on ziprecruiter.com, which lists US jobs and some Canadian ones. ZipRecruiter's UK site (ziprecruiter.co.uk) isn't supported.

**Something isn't working. What should I do?**
Open an issue in the [Issues tab](https://apify.com/parsebird/ziprecruiter-jobs-scraper/issues) with your run link, and we'll take a look.

### Is it legal to scrape ZipRecruiter?

ZipRecruiter Jobs Scraper collects only public job listings that are visible without logging in. It doesn't collect personal data of job seekers. Job listings may still contain contact details of recruiters, so make sure your use complies with applicable laws such as GDPR and with ZipRecruiter's terms. If you're unsure, consult a lawyer. Read more in Apify's blog post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other job scrapers

| Actor | What it scrapes |
|-------|-----------------|
| [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) | Job listings from Indeed |
| [LinkedIn Jobs Scraper](https://apify.com/parsebird/linkedin-jobs-scraper) | Job postings from LinkedIn |
| [Dice Jobs Scraper](https://apify.com/parsebird/dice-jobs-scraper) | Tech jobs from Dice |
| [BuiltIn Jobs Scraper](https://apify.com/parsebird/builtin-jobs-scraper) | Tech and startup jobs from Built In |
| [Greenhouse Jobs Scraper](https://apify.com/parsebird/greenhouse-jobs-scraper) | Jobs from company Greenhouse job boards |
| [FlexJobs Jobs Scraper](https://apify.com/parsebird/flexjobs-jobs-scraper) | Remote and flexible jobs from FlexJobs |

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/ziprecruiter-jobs-scraper/changelog.md

# Actor input Schema

## `searches` (type: `array`):

Enter job titles, skills or company names, one per line. Each keyword runs as its own ZipRecruiter search.

## `location` (type: `string`):

Enter a city and state (<code>New York, NY</code>), a ZIP code, a state, or <code>United States</code>. Enter <code>Remote</code> to find remote jobs nationwide. Defaults to the whole United States.

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

Paste ZipRecruiter search URLs (<code>https://www.ziprecruiter.com/jobs-search?search=nurse\&location=Chicago%2C+IL</code>), category pages (<code>https://www.ziprecruiter.com/Jobs/Nurse/-in-Chicago,IL</code>) or job URLs (containing <code>?jid=</code>). Filters in a search URL are kept as pasted.

## `jobType` (type: `string`):

Show only one employment type. Applies to keyword searches.

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

Show only jobs posted within this period.

## `remoteType` (type: `string`):

Show only remote, hybrid or on-site jobs.

## `experienceLevel` (type: `string`):

Show only jobs for one seniority level.

## `salaryRange` (type: `string`):

Enter a minimum annual salary in US dollars, such as <code>50000</code> for $50K+.

## `salaryMax` (type: `string`):

Enter a maximum annual salary in US dollars, such as <code>120000</code>. Leave empty for no upper limit.

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

Search radius around the location. Ignored for state- and country-level locations.

## `easyApplyOnly` (type: `boolean`):

Show only jobs you can apply to directly on ZipRecruiter.

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

Stop after saving this many jobs in total, across all searches and URLs.

## `maxPages` (type: `integer`):

Read at most this many result pages per search (20 jobs per page). ZipRecruiter shows up to about 25 pages (~500 jobs) per search; split large searches by location or filters to get more.

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

Open each job page to add the full description, industry, category, expiry date, company profile and rating, and the employer's own apply link. Each job with details is charged an extra details event (see Pricing in the README). Off = faster, cheaper runs with search-card data: title, company, salary, benefits, location, workplace type, job type, short description and posting date. Job URLs pasted in 'ZipRecruiter URLs' always include details.

## `concurrency` (type: `integer`):

Number of job pages to load in parallel when job details are on.

## `requestTimeout` (type: `integer`):

Give up on a single request after this many seconds and retry.

## `debugMode` (type: `boolean`):

Log the filters sent to ZipRecruiter.

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

Leave empty. ZipRecruiter refuses Apify's own and proxy IPs, so the scraper connects through Apify's unblocking proxy automatically (included in the price). Set a proxy here only to force your own.

## Actor input object example

```json
{
  "searches": [
    "software engineer"
  ],
  "location": "New York, NY",
  "jobType": "",
  "postedWithin": "anytime",
  "remoteType": "",
  "experienceLevel": "",
  "salaryRange": "",
  "salaryMax": "",
  "radius": "25",
  "easyApplyOnly": false,
  "maxItems": 10,
  "maxPages": 25,
  "includeDetails": false,
  "concurrency": 10,
  "requestTimeout": 30,
  "debugMode": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "searches": [
        "software engineer"
    ],
    "location": "New York, NY",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "searches": ["software engineer"],
    "location": "New York, NY",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "searches": [
    "software engineer"
  ],
  "location": "New York, NY",
  "maxItems": 10
}' |
apify call parsebird/ziprecruiter-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/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/bJQAaz2twXZwo2aTJ/builds/C1xaYtXDgbREkJ9Yv/openapi.json
