# ZipRecruiter Job Post Scraper (`blue_puppy/ziprecruiter-job-post-scraper`) Actor

Scrape job posts from ZipRecruiter

- **URL**: https://apify.com/blue\_puppy/ziprecruiter-job-post-scraper.md
- **Developed by:** [Blue Puppy](https://apify.com/blue_puppy) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does ZipRecruiter Job Search Scraper do?

ZipRecruiter Job Search Scraper extracts **job listings from [ZipRecruiter](https://www.ziprecruiter.com/)** by keyword, location, radius, and posting date. It returns structured job data such as title, company, location, salary, employment type, benefits, posting date, company logo, apply URL, canonical job URL, and optionally the full job description.

Run it on Apify to get API access, scheduling, integrations, proxy rotation, monitoring, and downloadable datasets without maintaining scraper infrastructure yourself.

### Why use ZipRecruiter Job Search Scraper?

Use this Actor to monitor hiring trends, collect leads, research compensation ranges, compare employers, enrich recruiting workflows, or build job-market datasets. It is designed for repeated searches where you want structured output instead of manually opening job posts one by one.

The scraper uses ZipRecruiter's own frontend job-card API when available. This means most metadata is fetched in batches, while full descriptions can be enabled when you need complete job text.

### How to use ZipRecruiter Job Search Scraper

1. Open the Actor on Apify.
2. Enter a search query such as `software engineer`, `driver`, or `nurse`.
3. Enter a location such as `San Francisco, CA`.
4. Choose radius, posting date, and result limit.
5. Keep the default Residential proxy for reliable runs, or change the proxy settings to suit your Apify plan.
6. Start the run.
7. Download results from the Dataset tab or access them through the Apify API.

### Input

You can configure the scraper from the Input tab.

```json
{
    "search": "software engineer",
    "location": "San Francisco, CA",
    "radius": "25",
    "days": "30",
    "limit": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

Main input fields:

| Field                 | Description                                                                                                                                                  |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `search`              | Job title, keyword, or company name. Leave blank to search all jobs.                                                                                         |
| `location`            | City, state, or ZIP code. Required.                                                                                                                          |
| `radius`              | Search radius in miles.                                                                                                                                      |
| `days`                | Posting age filter. Use `0` for anytime.                                                                                                                     |
| `limit`               | Maximum number of jobs to save. Use `0` for unlimited.                                                                                                       |
| `proxyConfiguration`  | Apify proxy settings. The Residential proxy group is enabled by default for more reliable requests and safer concurrency.                                   |

#### Residential proxy configuration

The Actor uses **Apify Residential Proxy by default**. Residential IPs help reduce blocking and keep the browser session, cookies, and IP identity consistent while job pages are collected.

### Output

Each dataset item represents one job post. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "title": "Software Engineer",
    "company": "Example Technologies",
    "companyLogo": "https://www.ziprecruiter.com/svc/fotomat/public-ziprecruiter/uploads/job_page_images_v2/example.png",
    "companyUrl": "https://www.ziprecruiter.com/c/Example-Technologies/Jobs",
    "location": "San Francisco, CA",
    "city": "San Francisco",
    "state": "California",
    "stateCode": "CA",
    "country": "United States",
    "countryCode": "US",
    "locationType": "Hybrid",
    "employmentType": "Full-time",
    "salary": "$120,000 - $160,000/year",
    "salaryInterval": "year",
    "salaryMin": 120000,
    "salaryMax": 160000,
    "salaryMinAnnual": 120000,
    "salaryMaxAnnual": 160000,
    "currency": "USD",
    "benefits": ["Medical", "Dental", "Vision"],
    "datePosted": "2026-07-30T12:00:00.000Z",
    "validThrough": null,
    "description": "Example job description text...",
    "externalApplyUrl": "https://example.com/apply",
    "jobUrl": "https://www.ziprecruiter.com/jobs/example-job"
}
```

### Data table

| Field                                                                                        | Type        | Description                                                 |
| -------------------------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------- |
| `title`                                                                                      | Text        | Job title.                                                  |
| `company`                                                                                    | Text        | Hiring company name.                                        |
| `companyLogo`                                                                                | Image URL   | Company logo when available.                                |
| `companyUrl`                                                                                 | URL         | Company page URL when available.                            |
| `location`                                                                                   | Text        | Display location.                                           |
| `city`, `state`, `stateCode`, `county`, `country`, `countryCode`, `postalCode`               | Text        | Structured location fields when available.                  |
| `locationType`                                                                               | Text        | Remote, hybrid, or on-site signal when available.           |
| `locationTypes`                                                                              | Array       | All source location-type enums, such as `REMOTE` or `HYBRID`. |
| `employmentType`                                                                             | Text        | Full-time, part-time, contract, temporary, or similar type. |
| `employmentTypes`                                                                            | Array       | All source employment-type enums, such as `FULL_TIME`.       |
| `salary`                                                                                     | Text        | Display salary string.                                      |
| `salaryInterval`, `salaryMin`, `salaryMax`, `salaryMinAnnual`, `salaryMaxAnnual`, `currency` | Text/Number | Structured pay fields when available.                       |
| `benefits`                                                                                   | Array       | Benefits listed on the job card or detail payload.          |
| `datePosted`                                                                                 | Date        | Posting date when available.                                |
| `description`                                                                                | Text        | Full job description.                                      |
| `externalApplyUrl`                                                                           | URL         | Employer or application URL when available.                 |
| `jobUrl`                                                                                     | URL         | Canonical ZipRecruiter job URL.                             |

### Pricing / Cost estimation

How much does it cost to scrape ZipRecruiter? Cost depends on result count, proxy settings, and retries caused by anti-bot checks. Each result includes a full job-description request.

The Actor fetches metadata in batches, usually one request per group of about 20 jobs, then makes one lightweight `GetJobDetails` request per result to collect its full description.

### Tips or Advanced options

Use `limit` while testing so runs finish quickly. Without a proxy the Actor forces one worker to avoid sending all parallel traffic from the same container IP. Operators can tune internal worker concurrency with the `ZR_WORKERS` environment variable.

Every output includes full job text, making it suitable for downstream search, matching, summarization, or compliance workflows.

Environment variables can tune advanced behavior, including request timeouts, delay ranges, batch size, session request caps, and the ZipRecruiter job-card API base URL.

### FAQ, disclaimers, and support

Is scraping ZipRecruiter legal? Public web data may be scraped in many cases, but you are responsible for ensuring your use complies with applicable laws, ZipRecruiter's terms, and privacy requirements. Do not collect or store sensitive personal data unless you have a lawful basis and permission to do so.

Why are some fields missing? ZipRecruiter does not provide every field for every job. The Actor returns `null` or an empty array when a value is unavailable.

Why are descriptions sometimes missing? ZipRecruiter may omit a description or the detail endpoint may be unavailable for an individual listing. The Actor logs the case and returns the remaining job data.

For bugs, feature requests, or custom scraping needs, use the Issues tab on the Actor page.

# Actor input Schema

## `search` (type: `string`):

Job title, keywords, or company name to search for. Leave blank to search all jobs.

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

City, state, or zip code for the job search location.

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

Search radius in miles.

## `days` (type: `string`):

Only show jobs posted within this many days. 0 = posted anytime.

## `refineByEmployment` (type: `string`):

Filter by employment type.

## `refineByLocationType` (type: `string`):

Filter by remote or on-site jobs.

## `refineBySalary` (type: `integer`):

Minimum annual salary filter.

## `refineBySalaryCeil` (type: `integer`):

Maximum annual salary filter.

## `refineByApplyType` (type: `string`):

Filter by application method.

## `refineByExperienceLevel` (type: `array`):

Filter by experience levels. Select none for all levels.

## `limit` (type: `integer`):

Maximum number of job results to return.

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

Proxy settings for anti-bot protection.

## Actor input object example

```json
{
  "search": "",
  "location": "San Francisco, CA",
  "radius": "25",
  "days": "30",
  "refineByEmployment": "",
  "refineByLocationType": "",
  "refineBySalary": 0,
  "refineBySalaryCeil": 300000,
  "refineByApplyType": "",
  "refineByExperienceLevel": [],
  "limit": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("blue_puppy/ziprecruiter-job-post-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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call blue_puppy/ziprecruiter-job-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=blue_puppy/ziprecruiter-job-post-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2paZj0uUQL6khXslh/builds/ZRz3ybK2ZIIksuAdA/openapi.json
