# ZipRecruiter Jobs Scraper (`datacach/ziprecruiter-search-jobs-by-keyword`) Actor

Scrape ZipRecruiter job listings by keyword and location with filters for remote type, salary, employment type, experience level, and more. NO Proxy required.

- **URL**: https://apify.com/datacach/ziprecruiter-search-jobs-by-keyword.md
- **Developed by:** [DataCach](https://apify.com/datacach) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 job seats

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

**ZipRecruiter Jobs Scraper** extracts structured job data from [ZipRecruiter](https://www.ziprecruiter.com) — one of the largest job boards in the United States — without needing an official API. Search by job title and location, run **multiple searches in a single execution**, apply powerful filters for remote type, salary range, employment type, experience level, and more, then collect results as clean, ready-to-use JSON.

Proxy rotation, Cloudflare session management, and pagination are all handled automatically. You focus on the data.

### What does ZipRecruiter Jobs Scraper extract?

Each scraped listing is a fully normalised JSON record containing:

- **Job basics** — title, description snippet, posting date, and active status
- **Company info** — name, logo URL, and ZipRecruiter company page link
- **Location** — city, state, country, display label, and remote/hybrid/on-site classification
- **Salary & pay** — minimum and maximum annual figures, pay interval, currency, and a human-readable display string; flagged when salary is estimated by ZipRecruiter
- **Employment type** — full-time, part-time, contract, temporary, and more
- **Benefits** — medical, dental, vision, retirement, PTO, and others when listed
- **Apply details** — whether ZipRecruiter Quick Apply is available, external apply URL, and direct job page link

Filters are passed as native ZipRecruiter URL query parameters, so results are filtered **server-side** — the same data ZipRecruiter shows real users.

### Why scrape ZipRecruiter job listings?

ZipRecruiter does not offer a public API for bulk job data access, making a scraper the only reliable programmatic path to this dataset. Common use cases include:

- **Job market intelligence** — track demand for specific roles, in-demand skills, and salary benchmarks across locations over time
- **Competitor hiring analysis** — monitor which companies in your sector are actively recruiting and which roles are being filled
- **Compensation benchmarking** — collect real pay ranges to calibrate hiring budgets or negotiate salaries with data
- **Talent pipeline automation** — surface new postings matching specific criteria automatically without checking the site manually
- **Academic & economic research** — build reproducible labor-market datasets for longitudinal studies
- **Job board aggregation** — sync ZipRecruiter listings into your own platform, app, or internal tool

Running on the [Apify platform](https://apify.com) gives you built-in scheduling, monitoring, API access, proxy rotation, and integrations with tools like Google Sheets, BigQuery, Zapier, and Make — all without managing any infrastructure.

### How to scrape ZipRecruiter jobs

#### Step-by-step tutorial

1. **Click "Try for free"** at the top of this page to open the actor in Apify Console
2. **Enter your search** — type a job title or keywords (e.g. `data engineer`) in **Job title / keywords**, or provide a **Multiple searches** JSON array to run several keyword/location pairs in one go
3. **Set a location** — enter a city and state (e.g. `Austin, TX`). The actor resolves the nearest matching location automatically via ZipRecruiter's autocomplete API
4. **Apply filters** — use the dropdowns to narrow by remote type, posting date, employment type, experience level, or apply type; set minimum and maximum salary if needed
5. **Configure pagination** — set **Max pages** to control how many result pages are scraped per search; each page contains up to 20 jobs
6. **Click Start** — a single-page run typically completes in under 30 seconds
7. **Download your data** — open the **Dataset** tab and export as JSON, CSV, Excel, or JSONL; or access results programmatically via the [Apify API](https://docs.apify.com/api/v2)

### Input configuration

All fields are optional except **search** and **location** (unless `searches` is provided, in which case both are optional).

| Field | Type | Default | Description |
|---|---|---|---|
| `search` | String | `software engineer` | Job title or keywords for a single search |
| `location` | String | `Miami, FL` | City and state or region (e.g. `New York, NY`) |
| `searches` | Array | `[]` | Multiple searches in one run — see format below; overrides `search` and `location` |
| `radius` | Select | `25 miles` | Search radius: 5, 10, 25, 50, or 100 miles |
| `remote` | Select | All | Work location: **Remote**, **Hybrid**, or **On-site** |
| `datePosted` | Select | Anytime | Recency: within 1, 5, 10, or 30 days |
| `minimumSalary` | Integer | *(none)* | Minimum annual salary in USD (0–195,000) |
| `maximumSalary` | Integer | *(none)* | Maximum annual salary in USD |
| `employmentType` | Select | All | Full-time, Part-time, Contract, As-needed, Temporary, or Other |
| `experienceLevel` | Multi-select | All | Junior, Mid, Senior, or No experience — combine freely |
| `applyType` | Select | All | **Quick apply only** or all apply types |
| `maxResults` | Integer | *(none)* | Hard cap on total results returned across all searches |
| `maxPages` | Integer | `4` | Pages to scrape per search (each page = up to 20 jobs) |
| `startPage` | Integer | `1` | Page number to start from (useful for resuming runs) |

#### Example input — single search

```json
{
  "search": "data engineer",
  "location": "New York, NY",
  "radius": "25",
  "remote": "only_remote",
  "datePosted": "10",
  "minimumSalary": 100000,
  "employmentType": "employment_type:full_time",
  "experienceLevel": ["mid", "senior"],
  "maxPages": 5
}
````

#### Example input — multiple searches

Use the `searches` field to run several keyword/location pairs in one execution. Each item requires a `search` key; `location` is optional and falls back to the top-level `location` field when omitted.

```json
{
  "searches": [
    { "search": "software engineer", "location": "Miami, FL" },
    { "search": "data analyst",      "location": "Austin, TX" },
    { "search": "product manager",   "location": "New York, NY" }
  ],
  "radius": "25",
  "maxPages": 3,
  "maxResults": 150
}
```

Every result item includes a `search_query` and `search_location` field so you can tell at a glance which search produced each listing.

### What data does ZipRecruiter Jobs Scraper return?

Results are stored in the **Dataset** tab and can be downloaded in **JSON, CSV, Excel, or JSONL** format. You can also query them via the Apify API or push them to any downstream tool.

#### Output example

```json
{
  "search_query": "software engineer",
  "search_location": "Miami, FL",
  "extraction_date": "05-20-2026",
  "extraction_datetime": "2026-05-20T14:32:07Z",
  "source": "ZipRecruiter",
  "title": "Senior Agentic (AI) Engineer",
  "snippet": "5+ years of software engineering experience, with 2+ years building production LLM or agentic systems...",
  "company_name": "Worth AI",
  "company_url": "https://www.ziprecruiter.com/co/Worth-AI/Jobs",
  "company_logo_url": null,
  "location_city": "Miami",
  "location_state": "FL",
  "location_country": "US",
  "location_display": "Miami, FL",
  "is_remote": true,
  "location_types": ["LOCATION_TYPE_NAME_REMOTE"],
  "employment_types": ["EMPLOYMENT_TYPE_NAME_FULL_TIME"],
  "employment_types_display": "Full-time",
  "pay_min_annual": 107000,
  "pay_max_annual": 146900,
  "pay_display_short": "$107K - $147K / yr",
  "pay_visible": true,
  "is_estimated_pay": true,
  "pay_source": "SOURCE_PREDICTED",
  "benefits": ["BENEFIT_TYPE_NAME_MEDICAL", "BENEFIT_TYPE_NAME_DENTAL", "BENEFIT_TYPE_NAME_VISION"],
  "benefits_display": "Medical, Dental, Vision, Life, Retirement, PTO",
  "posted_at_utc": "2026-05-15T16:48:33Z",
  "posted_at_display": "4 days ago",
  "first_seen_days_ago": 4,
  "is_new_job": true,
  "has_zip_apply": true,
  "is_external_apply": false,
  "apply_url": null,
  "job_page_url": "https://www.ziprecruiter.com/c/Worth-AI/Job/Senior-Agentic-(AI)-Engineer/-in-Miami,FL?jid=cc6bceaf667e789d"
}
```

#### Output field reference

| Field | Type | Description |
|---|---|---|
| `search_query` | String | Keyword used to find this listing (mirrors the `search` input) |
| `search_location` | String | Location used to find this listing (mirrors the `location` input) |
| `extraction_date` | String | Date the item was scraped, formatted as `MM-DD-YYYY` |
| `extraction_datetime` | String | UTC timestamp of when the item was scraped (ISO 8601) |
| `title` | String | Job title as listed |
| `snippet` | String | Short description excerpt (may contain HTML fragments) |
| `company_name` | String | Employer name |
| `company_url` | String | Employer's page on ZipRecruiter |
| `company_logo_url` | String | null | Employer logo image URL |
| `location_city` | String | City |
| `location_state` | String | State code (e.g. `FL`) |
| `location_country` | String | Country code (e.g. `US`) |
| `location_display` | String | Human-readable `City, State` label |
| `is_remote` | Boolean | `true` when the job is remote |
| `location_types` | Array | Location type codes (e.g. `LOCATION_TYPE_NAME_REMOTE`) |
| `employment_types` | Array | Employment type codes |
| `employment_types_display` | String | Human-readable employment type (e.g. `Full-time`) |
| `pay_min_annual` | Number | null | Minimum annual salary in USD |
| `pay_max_annual` | Number | null | Maximum annual salary in USD |
| `pay_display` | String | null | Raw pay string from ZipRecruiter |
| `pay_display_short` | String | null | Cleaned pay range (e.g. `$120K - $160K / yr`) |
| `pay_visible` | Boolean | Whether pay is publicly shown |
| `is_estimated_pay` | Boolean | `true` when salary is ZipRecruiter's estimate, not employer-provided |
| `pay_source` | String | `SOURCE_PROVIDED` or `SOURCE_PREDICTED` |
| `benefits` | Array | Benefit type codes when listed |
| `benefits_display` | String | null | Human-readable benefit summary |
| `posted_at_utc` | String | ISO 8601 UTC posting timestamp |
| `posted_at_display` | String | Relative time string (e.g. `4 days ago`) |
| `first_seen_days_ago` | Integer | null | Days since posting (calculated at scrape time) |
| `is_new_job` | Boolean | `true` when posted within the last 7 days |
| `has_zip_apply` | Boolean | `true` when ZipRecruiter Quick Apply is available |
| `is_external_apply` | Boolean | `true` when applying redirects to an external site |
| `apply_url` | String | null | External application URL when `is_external_apply` is `true` |
| `job_page_url` | String | Full ZipRecruiter listing URL |
| `listing_key` | String | ZipRecruiter's unique listing identifier |

### Advanced tips

#### Combine filters for precision targeting

Every filter you enable is applied by ZipRecruiter's own search engine before the actor paginates — so results are already scoped. Stacking `remote: only_remote` + `datePosted: 1` + `employmentType: full_time` returns only postings that satisfy all three conditions simultaneously, shrinking the dataset to exactly the signal you need.

#### Monitor a market segment with scheduling

Connect this actor to [Apify Scheduler](https://docs.apify.com/platform/schedules) to run daily or weekly searches automatically. Pair it with a [Webhook](https://docs.apify.com/platform/integrations/webhooks) to push new results to Slack, a Google Sheet, or your own API the moment each run completes — ideal for maintaining a live recruiting feed or salary tracker.

#### Run multiple searches in one go

Pass a `searches` array to execute several keyword/location combinations in a single run. All results land in the same dataset, each tagged with `search_query` and `search_location` so grouping and filtering downstream is trivial. Pair with `maxResults` to set a hard cap across the whole batch.

#### Filter out estimated salaries

The `is_estimated_pay` field is `true` whenever ZipRecruiter computed the salary rather than the employer providing it. When building compensation benchmarks, filter to `is_estimated_pay == false` (or `pay_source == "SOURCE_PROVIDED"`) to work only with employer-disclosed figures.

#### Integrate with your stack

Results are immediately available via the [Apify API](https://docs.apify.com/api/v2) and can be streamed to **Google Sheets**, **BigQuery**, **Snowflake**, **Zapier**, or **Make** without any custom glue code. The Apify platform's native integrations handle auth, pagination, and format conversion.

### FAQ, legal disclaimer, and support

#### Is scraping ZipRecruiter legal?

This actor accesses only **publicly available** job listings — the same information visible to any unauthenticated visitor in a browser. Scraping publicly accessible web data is broadly lawful under U.S. case law (see *hiQ Labs v. LinkedIn*, 9th Circuit 2022) and in most other jurisdictions.

That said, **you are responsible** for using this tool in compliance with ZipRecruiter's [Terms of Service](https://www.ziprecruiter.com/terms), applicable data protection regulations (GDPR, CCPA), and any laws in your jurisdiction. This actor is intended for legitimate research, analytics, and business intelligence purposes only. Do not use it to collect personal data about individual job seekers or to circumvent access controls.

#### Why are some runs returning fewer results than expected?

Active filters reduce the result pool on ZipRecruiter's end before pagination. A combination of `senior` + `full_time` + `posted within 1 day` + `only_remote` in a specific city may legitimately surface fewer than 20 results. Try broadening the radius, relaxing one filter, or switching `datePosted` to `Posted anytime` to confirm whether your filters are simply returning a small natural result set.

#### Do I need to configure a proxy?

No. Residential proxy rotation is built in and always active — there is nothing to configure. ZipRecruiter uses Cloudflare bot protection, and rotating residential IPs is what keeps results reliable at scale. You never need to supply your own proxy credentials.

#### Can I run several searches at once?

Yes — natively. Pass a `searches` array to run multiple keyword/location pairs in a single execution. Each result is tagged with `search_query` and `search_location`, so grouping results by search is immediate. Use `maxResults` to set a hard cap across the whole batch, or `maxPages` to control depth per search.

#### Something isn't working or I need a custom solution

Open an issue in the **Issues** tab on this page with your input configuration, any error messages, and a sample URL if available. For bespoke data pipelines, large-scale recurring jobs, or custom output formats, feel free to reach out directly through the Issues tab.

# Actor input Schema

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

Enter a job title, role, or keywords to search for. Examples: <b>software engineer</b>, <b>data analyst</b>, <b>product manager</b>.

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

Enter a city and state or region. Examples: <b>Miami, FL</b> · <b>New York, NY</b> · <b>Austin, TX</b>. The closest ZipRecruiter match is resolved automatically.

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

Select how far from the resolved location to search.

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

Run multiple searches in a single execution. Each item requires a <b>search</b> keyword and an optional <b>location</b> (falls back to the <b>Location</b> field above). Example: <code>\[{"search": "data engineer", "location": "New York, NY"}, {"search": "product manager", "location": "Austin, TX"}]</code>. When provided, overrides the single <b>Job title / keywords</b> and <b>Location</b> fields.

## `remote` (type: `string`):

Filter by work location type. Leave as <b>All</b> to include every location type.

## `datePosted` (type: `string`):

Filter by when the job was posted. Leave as <b>Posted anytime</b> to include all dates.

## `minimumSalary` (type: `integer`):

Enter a minimum annual salary in USD (e.g. <b>80000</b>). Leave blank to include all salary ranges.

## `maximumSalary` (type: `integer`):

Enter a maximum annual salary in USD. Leave blank to include all salary ranges.

## `employmentType` (type: `string`):

Filter by employment arrangement. Leave as <b>All</b> to include every type.

## `experienceLevel` (type: `array`):

Select one or more experience levels to filter by. Selecting all or none disables this filter.

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

Filter by how candidates apply. Select <b>Quick apply only</b> to show jobs with ZipRecruiter's one-click application.

## `maxResults` (type: `integer`):

Set the maximum number of job listings to return. Leave blank for no limit.

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

Set how many result pages to scrape. Each page returns up to <b>20 jobs</b> (max 20 pages = 400 jobs). Use <b>Max results</b> for a precise count.

## `startPage` (type: `integer`):

Set the page number to start scraping from. Use this to resume a previous run or skip already-collected pages.

## Actor input object example

```json
{
  "search": "software engineer",
  "location": "Miami, FL",
  "radius": "25",
  "searches": [],
  "remote": "",
  "datePosted": "",
  "employmentType": "",
  "experienceLevel": [],
  "applyType": "",
  "maxPages": 4,
  "startPage": 1
}
```

# 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 = {
    "search": "software engineer",
    "location": "Miami, FL"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/ziprecruiter-search-jobs-by-keyword").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 = {
    "search": "software engineer",
    "location": "Miami, FL",
}

# Run the Actor and wait for it to finish
run = client.actor("datacach/ziprecruiter-search-jobs-by-keyword").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 '{
  "search": "software engineer",
  "location": "Miami, FL"
}' |
apify call datacach/ziprecruiter-search-jobs-by-keyword --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=datacach/ziprecruiter-search-jobs-by-keyword",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ZipRecruiter Jobs Scraper",
        "description": "Scrape ZipRecruiter job listings by keyword and location with filters for remote type, salary, employment type, experience level, and more. NO Proxy required.",
        "version": "0.0",
        "x-build-id": "2RY5b4rtWhJdnH7GJ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/datacach~ziprecruiter-search-jobs-by-keyword/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-datacach-ziprecruiter-search-jobs-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/datacach~ziprecruiter-search-jobs-by-keyword/runs": {
            "post": {
                "operationId": "runs-sync-datacach-ziprecruiter-search-jobs-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/datacach~ziprecruiter-search-jobs-by-keyword/run-sync": {
            "post": {
                "operationId": "run-sync-datacach-ziprecruiter-search-jobs-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "search",
                    "location"
                ],
                "properties": {
                    "search": {
                        "title": "Job title / keywords",
                        "type": "string",
                        "description": "Enter a job title, role, or keywords to search for. Examples: <b>software engineer</b>, <b>data analyst</b>, <b>product manager</b>.",
                        "default": "software engineer"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Enter a city and state or region. Examples: <b>Miami, FL</b> · <b>New York, NY</b> · <b>Austin, TX</b>. The closest ZipRecruiter match is resolved automatically.",
                        "default": "Miami, FL"
                    },
                    "radius": {
                        "title": "Search radius",
                        "enum": [
                            "5",
                            "10",
                            "25",
                            "50",
                            "100"
                        ],
                        "type": "string",
                        "description": "Select how far from the resolved location to search.",
                        "default": "25"
                    },
                    "searches": {
                        "title": "Multiple searches",
                        "type": "array",
                        "description": "Run multiple searches in a single execution. Each item requires a <b>search</b> keyword and an optional <b>location</b> (falls back to the <b>Location</b> field above). Example: <code>[{\"search\": \"data engineer\", \"location\": \"New York, NY\"}, {\"search\": \"product manager\", \"location\": \"Austin, TX\"}]</code>. When provided, overrides the single <b>Job title / keywords</b> and <b>Location</b> fields.",
                        "default": []
                    },
                    "remote": {
                        "title": "Remote type",
                        "enum": [
                            "",
                            "only_remote",
                            "hybrid",
                            "no_remote"
                        ],
                        "type": "string",
                        "description": "Filter by work location type. Leave as <b>All</b> to include every location type.",
                        "default": ""
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "",
                            "1",
                            "5",
                            "10",
                            "30"
                        ],
                        "type": "string",
                        "description": "Filter by when the job was posted. Leave as <b>Posted anytime</b> to include all dates.",
                        "default": ""
                    },
                    "minimumSalary": {
                        "title": "Minimum salary",
                        "minimum": 0,
                        "maximum": 195000,
                        "type": "integer",
                        "description": "Enter a minimum annual salary in USD (e.g. <b>80000</b>). Leave blank to include all salary ranges."
                    },
                    "maximumSalary": {
                        "title": "Maximum salary",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter a maximum annual salary in USD. Leave blank to include all salary ranges."
                    },
                    "employmentType": {
                        "title": "Employment type",
                        "enum": [
                            "",
                            "employment_type:full_time",
                            "employment_type:part_time",
                            "employment_type:contract",
                            "employment_type:as_needed",
                            "employment_type:temporary",
                            "employment_type:other"
                        ],
                        "type": "string",
                        "description": "Filter by employment arrangement. Leave as <b>All</b> to include every type.",
                        "default": ""
                    },
                    "experienceLevel": {
                        "title": "Experience level",
                        "type": "array",
                        "description": "Select one or more experience levels to filter by. Selecting all or none disables this filter.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "junior",
                                "mid",
                                "senior",
                                "no_experience"
                            ],
                            "enumTitles": [
                                "Junior level",
                                "Mid level",
                                "Senior level and above",
                                "No experience"
                            ]
                        },
                        "default": []
                    },
                    "applyType": {
                        "title": "Apply type",
                        "enum": [
                            "",
                            "has_zipapply"
                        ],
                        "type": "string",
                        "description": "Filter by how candidates apply. Select <b>Quick apply only</b> to show jobs with ZipRecruiter's one-click application.",
                        "default": ""
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the maximum number of job listings to return. Leave blank for no limit."
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Set how many result pages to scrape. Each page returns up to <b>20 jobs</b> (max 20 pages = 400 jobs). Use <b>Max results</b> for a precise count.",
                        "default": 4
                    },
                    "startPage": {
                        "title": "Start page",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the page number to start scraping from. Use this to resume a previous run or skip already-collected pages.",
                        "default": 1
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
