# ZipRecruiter Jobs Scraper | Salary & Company Data (`datascraperes/ziprecruiter-jobs-scraper`) Actor

Collect ZipRecruiter job listings from the US and Canada by keyword and location. Get titles, companies, salary ranges, descriptions and application links when available. Filter by date, job type, remote status or ZipApply, then export to JSON, CSV or Excel.

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

## Pricing

from $0.75 / 1,000 ziprecruiter job delivereds

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

Collect public ZipRecruiter jobs in the United States and Canada by keyword and location. Receive job titles, companies, locations, available compensation, descriptions and application links in a structured Dataset.

### What this Actor does

Collect public ZipRecruiter job listings from the United States and Canada for recruiting research, job-board feeds and labor-market analysis. Search by keyword and location and receive job titles, company details, compensation, descriptions and application links when available. Missing public information remains empty; values are not invented to fill the output.

### Use cases

- Research vacancies by role and city.
- Build a public job feed or a recruiting research spreadsheet.
- Compare advertised compensation and required roles across employers.
- Review full descriptions and public company information when available.

### How to use

Enter one or more keywords, select United States or Canada, and optionally supply a location. Start with three jobs to inspect coverage and output. Choose description format and enable public email extraction only if your use requires it. Click Start and open the Dataset to download JSON, CSV or Excel.

### Input

Complete input contract, including every public field:

```json
{
  "keywords": [
    "software engineer"
  ],
  "country": "usa",
  "location": "New York, NY",
  "distanceMiles": 50,
  "maxItemsPerQuery": 3,
  "maxTotalItems": 3,
  "offset": 0,
  "datePostedHours": 0,
  "jobType": "any",
  "remoteOnly": false,
  "easyApplyOnly": false,
  "descriptionFormat": "markdown",
  "includeEmails": false
}
```

| Field | What it controls |
|---|---|
| `keywords` | One job search phrase per item. Duplicate phrases are removed before the run. |
| `country` | Country used by ZipRecruiter. The public ZipRecruiter search endpoint supports the United States and Canada. |
| `location` | City, state, province, postal code, or other location text understood by ZipRecruiter. Leave empty for a country-wide search. |
| `distanceMiles` | Distance around the location. Use 50 miles for a broad default search. Range: 1â€“100 miles. |
| `maxItemsPerQuery` | Maximum unique jobs collected for each keyword, up to 60 (three public result pages). This is a limit, not a guarantee of available matches. |
| `maxTotalItems` | Global output limit across all keywords, up to 3,000 (50 keywords Ã— 60). Use this to control the maximum Dataset size and spend. |
| `offset` | Skip this many results for every keyword. Offset plus maxItemsPerQuery cannot exceed 60. |
| `datePostedHours` | Return jobs published within this many hours. Use 0 for any age. |
| `jobType` | Optional ZipRecruiter employment-type filter. |
| `remoteOnly` | Return listings identified by ZipRecruiter as remote. |
| `easyApplyOnly` | Return only listings with an internal ZipApply flow. Applied locally after search; may reduce the number of returned jobs. |
| `descriptionFormat` | Format of the public job description in each Dataset item. |
| `includeEmails` | Extract email addresses found in public job descriptions. Disabled by default. |

Keywords are required; the Actor does not invent a search when they are absent. Leading, trailing and repeated whitespace is normalized. Blank location searches without a location constraint. Up to 50 keywords share one total result limit. The source supports up to 60 accessible results per keyword; result offset plus requested jobs per keyword cannot exceed 60. These are ceilings, not guaranteed row counts.

### Output

Each Dataset item represents a unique public job. This is a complete Dataset item from a real successful run:

```json
{
  "success": true,
  "status": "success",
  "source": "ziprecruiter",
  "searchKeyword": "software engineer",
  "searchCountry": "United States",
  "searchLocation": "New York, NY",
  "jobId": "zr-G3vfECa9V6qyBUxIMgfbLQ",
  "jobUrl": "https://www.ziprecruiter.com/c/DataAnnotation/Job/Software-Engineer-AI-Trainer/-in-New-York,NY?jid=5d18c242de93f67e",
  "directJobUrl": "https://app.dataannotation.tech/worker_signup?projects=PROG_SA&jt=Software%20Engineer&worker_src=ZR&utm_source=ziprecruiter&utm_medium=listing&utm_campaign=coder&utm_adgroup=software_engineer&utm_content=new_york_ny&cid=01a178dc-2274-706f-aec2-856909325610",
  "title": "Software Engineer - AI Trainer",
  "companyName": "DataAnnotation",
  "companyUrl": "https://www.ziprecruiter.com/co/DataAnnotation",
  "companyDirectUrl": "https://www.dataannotation.tech/",
  "location": {
    "country": "United States",
    "city": "New York",
    "state": "NY"
  },
  "locationDisplay": "New York, NY, United States",
  "isRemote": true,
  "jobTypes": [
    "contract"
  ],
  "postedDate": "2026-09-22",
  "description": "**About the Role:**\n\nWe are looking for existing software engineers and developers to help advance AI development. As a member of DataAnnotation's Software Engineering team, you'll be part of a growing community of over 100,000 professionals, including front-end, back-end, full-stack, machine learning, DevOps, and other software engineers who are driving real-world impact in AI development.\n\nOur platform offers an engaging blend of flexibility and challenge. You'll work closely with state-of-the-art AI models on programming tasks such as creating and solving complex coding problems, building applications with rich functionality, debugging and improving code, and synthesizing insights through data analysis and visualization. Your work directly contributes to refining intelligent systems that learn, adapt, and evolve.\n\nSome contributors fit this work alongside a full-time role, while others make it their primary focus, choosing projects and schedules that align with their availability and goals.\n\nTo get started, you'll create an account and complete a short assessment, which serves as our version of an interview. If you pass the assessment, you'll receive an email confirmation and gain access to paid projects through our platform.\n\n**Advantages of contracting with us:**\n\n - Choose which projects you want to work on and when.\n\n - Work with state-of-the-art and unreleased AI coding agents.\n\n - Work on your own schedule, using your own computer, from the comfort of your home.\n\n - Projects are paid hourly starting at $50-100+/hr with higher rates available for certain projects.\n\n**Responsibilities:**\n\n - Create and work with coding environments, unit tests, and verifiers.\n\n - Design and solve diverse coding problems used to train AI systems.\n\n - Write clear, high-quality code and technical explanations.\n\n - Evaluate model trajectories for accuracy, performance, readability, and best practices.\n\n - Identify bugs, edge cases, and opportunities for improvement in AI-generated solutions.\n\n - Provide structured feedback that helps improve the next generation of AI models.\n\n**Qualifications:**\n\n - Fluency in English (native or bilingual level).\n\n - Proficiency in at least one modern programming language, such as Python, JavaScript, TypeScript, Java, C, C#, C++, Go, Kotlin, Swift, or React.\n\n - Strong software engineering fundamentals, including problem-solving, debugging, and code review.\n\n - Excellent written communication skills.\n\n - A bachelor's degree (completed or in progress).\n\n - Previous experience as a Software Engineer, Software Developer, Programmer, Full-Stack Engineer, Front-End Engineer, Back-End Engineer, or similar technical role is preferred.\n\n**Note:**\n\nPayment is made via PayPal. We will never ask for any money from you. PayPal will handle any currency conversions from USD. This job is only available to those in the United States, Canada, the United Kingdom, Ireland, Australia, New Zealand, the Netherlands, Germany, Denmark, Norway, Sweden, Poland, Romania, Ukraine, Argentina, Brazil, India, and the Philippines. Those located outside of these countries will not see work or assessments available on our site at this time. This is an independent contractor position.\n\n#SWE",
  "emails": null,
  "compensation": {
    "interval": "hourly",
    "min_amount": 75.0,
    "max_amount": 150.0,
    "currency": "USD"
  },
  "companyIndustry": "Computing Infrastructure Providers, Data Processing, Web Hosting, Data Services, Software Development",
  "companyAddresses": "New York, NY, US",
  "companyEmployees": "10000+ Employees",
  "companyRevenue": null,
  "companyDescription": "DataAnnotation is a contributor platform through which freelancers complete AI training tasks such as writing prompts, comparing model responses, and correcting factual or coding errors, work used to shape how large language models respond.",
  "companyLogoUrl": "https://www.ziprecruiter.com/svc/fotomat/public-nosensitive-ziprecruiter-logos/company/breakroom-bb759630df5ef067-504eec3e.png",
  "scrapedAt": "2026-10-26T15:37:43.236072Z"
}
```

`jobId` and `jobUrl` identify the job. `searchKeyword`, `searchCountry` and `searchLocation` record search context. `description` follows the requested format; company and compensation information depend on public availability. `emails` is omitted or empty unless public email extraction is enabled. Company revenue is not supplied by this source contract.

The run summary reports accepted output, duplicates, completed searches and remaining work. An empty search is distinct from source unavailability. A partial run can preserve useful jobs without satisfying every requested search. The platform run status alone is not proof that the requested collection is complete.

### Pricing

Pay-per-event billing applies to each unique job saved to the Dataset. Check the Pricing tab for your plan's current rate. Duplicate jobs, empty searches and summaries do not create delivered-job events.

### Related Actors

| Actor | Best for |
|---|---|
| [Indeed Jobs Scraper | Worldwide Job Data](https://apify.com/datascraperes/indeed-jobs-scraper) | Worldwide job searches across supported markets. |
| [LinkedIn Jobs Scraper – No Login](https://apify.com/datascraperes/linkedin-jobs-scraper) | Public professional-network job listings. |
| [Naukri Jobs Scraper | Job Details & Company Data](https://apify.com/datascraperes/naukri-jobs-scraper) | India-focused roles, skills and employer data. |

### Limits and data quality

Results depend on public source availability, selected filters, duplicate removal and run limits. Requested row counts may exceed matching public listings. Company information, compensation and descriptions may be missing. No account login is required, and private applicant or employer-account data is outside the scope.

When a search is unavailable, the Actor retains verified results and records incomplete coverage. Input or service-configuration problems produce a clear stopped outcome. If result delivery or charging cannot be verified safely, processing stops for verification rather than repeating an uncertain operation. Saved recovery data remains available for diagnosis.

### Frequently asked questions

#### Can I combine several keywords?

Yes. Jobs are deduplicated across keywords and the total cap is shared. Earlier completed searches can consume the cap before others finish.

#### Why did I receive fewer jobs?

The source may have fewer matching jobs, selected filters may exclude results, or part of the collection may be unavailable. Read the summary before assuming all requested work completed.

#### Do spelling mistakes cause the Actor to fail?

Structural input mistakes are reported without starting a search. Spelling interpretation depends on the source; automatic correction is not guaranteed. Unknown input field names are rejected so a misspelled location field does not silently remove the location constraint.

#### Do all rows contain salary or company data?

No. Optional fields reflect public availability. A missing field should not be treated as a zero salary or a verified absence of company information.

### Responsible use

Use public job information lawfully and respect applicable terms and privacy obligations. Do not use this Actor to access private accounts or applicant data. You are responsible for the purpose and retention of exported information.

### Support

Open an issue in the Actor's Issues tab with sanitized input, the run link and expected behavior. Never include credentials or other secrets.

[Python, JavaScript and CSV integration examples on GitHub](https://github.com/datacrawler-edu/ziprecruiter-jobs-scraper-python).

# Changelog

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

# Actor input Schema

## `keywords` (type: `array`):

One job search phrase per item. Duplicate phrases are removed before the run.

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

Country used by ZipRecruiter. The public ZipRecruiter search endpoint supports the United States and Canada.

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

City, state, province, postal code, or other location text understood by ZipRecruiter. Leave empty for a country-wide search.

## `distanceMiles` (type: `integer`):

Distance around the location. Use 50 miles for a broad search. Range: 1 to 100 miles.

## `maxItemsPerQuery` (type: `integer`):

Maximum unique jobs collected for each keyword, up to 60 (three public result pages). This is a limit, not a guarantee of available matches.

## `maxTotalItems` (type: `integer`):

Global output limit across all keywords, up to 3,000 (50 keywords x 60). Use this to control the maximum Dataset size and spend.

## `offset` (type: `integer`):

Skip this many results for every keyword. Offset plus maxItemsPerQuery cannot exceed 60.

## `datePostedHours` (type: `integer`):

Return jobs published within this many hours. Use 0 for any age.

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

Optional ZipRecruiter employment-type filter.

## `remoteOnly` (type: `boolean`):

Return listings identified by ZipRecruiter as remote.

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

Return only listings with an internal ZipApply flow. Applied locally after search; may reduce the number of returned jobs.

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

Format of the public job description in each Dataset item.

## `includeEmails` (type: `boolean`):

Extract email addresses found in public job descriptions. Disabled by default.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "country": "usa",
  "location": "New York, NY",
  "distanceMiles": 50,
  "maxItemsPerQuery": 3,
  "maxTotalItems": 3,
  "offset": 0,
  "datePostedHours": 0,
  "jobType": "any",
  "remoteOnly": false,
  "easyApplyOnly": false,
  "descriptionFormat": "markdown",
  "includeEmails": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "software engineer"
    ],
    "country": "usa",
    "location": "New York, NY",
    "distanceMiles": 50,
    "maxItemsPerQuery": 3,
    "maxTotalItems": 3,
    "offset": 0,
    "datePostedHours": 0,
    "jobType": "any",
    "remoteOnly": false,
    "easyApplyOnly": false,
    "descriptionFormat": "markdown",
    "includeEmails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/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 = {
    "keywords": ["software engineer"],
    "country": "usa",
    "location": "New York, NY",
    "distanceMiles": 50,
    "maxItemsPerQuery": 3,
    "maxTotalItems": 3,
    "offset": 0,
    "datePostedHours": 0,
    "jobType": "any",
    "remoteOnly": False,
    "easyApplyOnly": False,
    "descriptionFormat": "markdown",
    "includeEmails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/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 '{
  "keywords": [
    "software engineer"
  ],
  "country": "usa",
  "location": "New York, NY",
  "distanceMiles": 50,
  "maxItemsPerQuery": 3,
  "maxTotalItems": 3,
  "offset": 0,
  "datePostedHours": 0,
  "jobType": "any",
  "remoteOnly": false,
  "easyApplyOnly": false,
  "descriptionFormat": "markdown",
  "includeEmails": false
}' |
apify call datascraperes/ziprecruiter-jobs-scraper --silent --output-dataset

```

## MCP server setup

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