# ZipRecruiter API

> ZipRecruiter job listings and salary estimates are available as a workflow and API.

ZipRecruiter’s Search jobs method returns public job listings using required keywords and location, with optional distance and posting-date filters. Get salary returns pay estimates, percentile ranges, and top-paying cities for a required job title and optional US state.

- Page: https://fous.com/tools/ziprecruiter
- Handle: `@ziprecruiter`
- Category: [Jobs](https://fous.com/tools/category/jobs)
- Source website: https://ziprecruiter.com
- Last verified: Sep 29, 2026

## Methods

### Get salary

Operation `get_salary`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Get typical pay, percentile range, and top-paying cities for a job title in the United States or a US state from ZipRecruiter salary pages. Returns only salary pages that exist publicly.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `state` | string | no | `"CA"` | US state name or two-letter code, for example California or CA. Defaults to the whole United States. |
| `job_title` | string | yes | `"Medical Assistant"` | Job title to look up, for example Medical Assistant. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "job_title"
  ],
  "properties": {
    "state": {
      "type": "string",
      "default": "",
      "description": "US state name or two-letter code, for example California or CA. Defaults to the whole United States.",
      "examples": [
        "CA"
      ]
    },
    "job_title": {
      "type": "string",
      "description": "Job title to look up, for example Medical Assistant.",
      "examples": [
        "Medical Assistant",
        "Pharmacist"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "state": "CA",
      "job_title": "Medical Assistant"
    },
    {
      "job_title": "Pharmacist"
    },
    {
      "job_title": "Medical Assistant"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `location` | string | `"California"` | United States or the selected state. |
| `job_title` | string | `"Medical Assistant"` | Job title on the salary page. |
| `page_link` | string | `"https://www.ziprecruiter.com/Salaries/Medical-Assistant-Salary--in-California"` | Link to this salary page. |
| `date_shown` | string | `"2026-09-28"` | Date of the salary estimate. |
| `top_paying_cities` | array |  | Up to 10 top-paying cities shown on this salary page. |
| `top_paying_cities[].city` | string | `"Corcoran"` | City name shown on the page. |
| `top_paying_cities[].annual_pay_usd` | number | `65946` | Annual pay in USD. |
| `average_annual_pay_usd` | number | `40828` | Average annual pay in USD. |
| `average_hourly_pay_usd` | number | `19.63` | Average hourly pay in USD. |
| `average_weekly_pay_usd` | number | `785` | Average weekly pay in USD. |
| `average_monthly_pay_usd` | number | `3402` | Average monthly pay in USD. |
| `typical_25th_percentile_annual_pay_usd` | number | `35000` | 25th percentile annual pay in USD. |
| `typical_75th_percentile_annual_pay_usd` | number | `44900` | 75th percentile annual pay in USD. |
| `top_earners_90th_percentile_annual_pay_usd` | number | `51319` | 90th percentile annual pay in USD. |

**Example input**

```json
{
  "state": "CA",
  "job_title": "Medical Assistant"
}
```

**Example output**

```json
{
  "location": "California",
  "job_title": "Medical Assistant",
  "page_link": "https://www.ziprecruiter.com/Salaries/Medical-Assistant-Salary--in-California",
  "date_shown": "2026-09-28",
  "top_paying_cities": [
    {
      "city": "Corcoran",
      "annual_pay_usd": 65946
    },
    {
      "city": "Soledad",
      "annual_pay_usd": 61886
    },
    {
      "city": "Lake Los Angeles",
      "annual_pay_usd": 61195
    }
  ],
  "average_annual_pay_usd": 40828,
  "average_hourly_pay_usd": 19.63,
  "average_weekly_pay_usd": 785,
  "average_monthly_pay_usd": 3402,
  "typical_25th_percentile_annual_pay_usd": 35000,
  "typical_75th_percentile_annual_pay_usd": 44900,
  "top_earners_90th_percentile_annual_pay_usd": 51319
}
```

### Search jobs

Operation `search_jobs`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Find open ZipRecruiter jobs by keywords and location, with distance and posting-date filters. Returns up to 100 public listings in search order; details that are not shown may be null.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `keywords` | string | yes | `"registered nurse"` | Job title or search words, for example forklift operator. |
| `location` | string | yes | `"Chicago, IL"` | City, state or ZIP code, for example Phoenix, AZ. |
| `max_results` | integer | no | `5` | Maximum jobs to return, for example 25. |
| `posted_within` | string | no | `"last_day"` | How recently the job was posted, for example last_5_days. |
| `distance_miles` | integer | no | `5` | Search radius in miles, for example 25. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "keywords",
    "location"
  ],
  "properties": {
    "keywords": {
      "type": "string",
      "minLength": 1,
      "description": "Job title or search words, for example forklift operator.",
      "examples": [
        "registered nurse",
        "forklift operator"
      ]
    },
    "location": {
      "type": "string",
      "minLength": 1,
      "description": "City, state or ZIP code, for example Phoenix, AZ.",
      "examples": [
        "Chicago, IL",
        "Phoenix, AZ"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 25,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum jobs to return, for example 25.",
      "x-fous-developer": true,
      "examples": [
        5,
        25
      ]
    },
    "posted_within": {
      "enum": [
        "last_day",
        "last_5_days",
        "last_10_days",
        "last_30_days",
        "any"
      ],
      "type": "string",
      "default": "any",
      "description": "How recently the job was posted, for example last_5_days.",
      "examples": [
        "last_day",
        "last_5_days"
      ]
    },
    "distance_miles": {
      "enum": [
        5,
        10,
        25,
        50,
        100
      ],
      "type": "integer",
      "default": 25,
      "description": "Search radius in miles, for example 25.",
      "examples": [
        5,
        10
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "keywords": "registered nurse",
      "location": "Chicago, IL",
      "max_results": 5,
      "posted_within": "last_day",
      "distance_miles": 5
    },
    {
      "keywords": "forklift operator",
      "location": "Phoenix, AZ",
      "max_results": 25,
      "posted_within": "last_5_days",
      "distance_miles": 10
    },
    {
      "keywords": "forklift operator",
      "location": "Phoenix, AZ"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `jobs` | array |  |  |
| `jobs[].pay` | string or null | `"$37.25 - $57.74/hr"` |  |
| `jobs[].title` | string | `"RN New Graduate Residency Program"` |  |
| `jobs[].remote` | string | `"no"` |  |
| `jobs[].company` | string or null | `"Endeavor Health"` |  |
| `jobs[].currency` | string or null | `"USD"` |  |
| `jobs[].job_link` | string | `"https://www.ziprecruiter.com/c/Endeavor-Health/Job/RN-New-Graduate-Residency-Program/-in-Evanston,IL?jid=4a9007b9a91a7d` |  |
| `jobs[].location` | string or null | `"Evanston, IL"` |  |
| `jobs[].pay_period` | string or null | `"hour"` |  |
| `jobs[].pay_maximum` | number or null | `57.74` |  |
| `jobs[].pay_minimum` | number or null | `37.25` |  |
| `jobs[].posted_date` | string or null | `"2026-09-28"` |  |
| `jobs[].employment_type` | string or null | `"Full-time"` |  |
| `jobs[].short_description` | string or null | `"Hourly Pay Range: $37.25 - $57.74 - The hourly pay rate offered is determined by a candidate's expertise and years of e` |  |

**Example input**

```json
{
  "keywords": "registered nurse",
  "location": "Chicago, IL",
  "max_results": 5,
  "posted_within": "last_day",
  "distance_miles": 5
}
```

**Example output**

```json
{
  "jobs": [
    {
      "pay": "$37.25 - $57.74/hr",
      "title": "RN New Graduate Residency Program",
      "remote": "no",
      "company": "Endeavor Health",
      "currency": "USD",
      "job_link": "https://www.ziprecruiter.com/c/Endeavor-Health/Job/RN-New-Graduate-Residency-Program/-in-Evanston,IL?jid=4a9007b9a91a7df9",
      "location": "Evanston, IL",
      "pay_period": "hour",
      "pay_maximum": 57.74,
      "pay_minimum": 37.25,
      "posted_date": "2026-09-28",
      "employment_type": "Full-time",
      "short_description": "Hourly Pay Range: $37.25 - $57.74 - The hourly pay rate offered is determined by a candidate's expertise and years of experience, among other factors. Position Highlights: PROGRAM OVERVIEW Endeavor"
    },
    {
      "pay": "$1.9K/wk",
      "title": "Travel Nurse RN - ED - Emergency Department - $1,972 per week",
      "remote": "no",
      "company": "TotalMed RN",
      "currency": "USD",
      "job_link": "https://www.ziprecruiter.com/c/TotalMed-RN/Job/Travel-Nurse-RN-ED-Emergency-Department-$1,972-per-week/-in-Chicago,IL?jid=5cdda019f51f5d63",
      "location": "Chicago, IL",
      "pay_period": "week",
      "pay_maximum": 1972,
      "pay_minimum": 1972,
      "posted_date": "2026-09-28",
      "employment_type": "Contractor",
      "short_description": "TotalMed RN is seeking a travel nurse RN ED - Emergency Department for a travel nursing job in Chicago, Illinois. Job Description & Requirements * Specialty: ED - Emergency Department * Discipline:"
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@ziprecruiter",
  "visibility": "public",
  "operation": "get_salary",
  "version": 1,
  "input": {
    "state": "CA",
    "job_title": "Medical Assistant"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@ziprecruiter\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_salary\",\n  \"version\": 1,\n  \"input\": {\n    \"state\": \"CA\",\n    \"job_title\": \"Medical Assistant\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@ziprecruiter",
  "visibility": "public",
  "operation": "get_salary",
  "version": 1,
  "input": {
    "state": "CA",
    "job_title": "Medical Assistant"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/ziprecruiter`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `get_salary`: Get salary. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `search_jobs`: Search jobs. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-ziprecruiter https://api.fous.com/mcp/tools/ziprecruiter --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Find open roles matching a title and location
- Compare public job listings by distance or posting date
- Review pay estimates for a job title
- Compare salary estimates across US states
- Identify top-paying cities for a role

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this ZipRecruiter tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a ZipRecruiter account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from ziprecruiter.com when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### What jobs are open for a given title and location?

Search jobs returns public listings matching required keywords and location.

### What is the typical pay for a job title?

Get salary returns typical pay estimates and percentile ranges for a job title.

### Which cities pay the most for a job?

Get salary returns top-paying cities shown on the salary page.

## Related

- [Indeed API](https://fous.com/tools/indeed.md): Indeed returns public first-page listings and details for available, unexpired jobs, company employee ratings and CEO approval when available, and typical pay from public salary pages.
- [PayScale API](https://fous.com/tools/payscale.md): PayScale provides job and location salary research, skill pay effects when published, and employer average base salaries and common jobs where available.
- [Naukri API](https://fous.com/tools/naukri.md): Search public job listings in India.
- [Remote OK API](https://fous.com/tools/remote-ok.md): Remote job postings from Remote OK.
- [LinkedIn API](https://fous.com/tools/linkedin.md): LinkedIn returns publicly visible company information, recent company posts, open job listings and details, and similar midsized robotics companies; closed jobs, hidden details, and exhaustive company matches are unavailable.
- [H1B Salary Database API](https://fous.com/tools/h1b-salary-database.md): Search employer-filed H-1B salary and labor condition records.
- [Zumper API](https://fous.com/tools/zumper.md): Zumper searches rental homes and apartments with filters and reports rolling 30-day city median rents, changes, and rankings where available.
- [Workday API](https://fous.com/tools/workday.md): Public job listings on Workday career sites.
- [All Jobs tools](https://fous.com/tools/category/jobs)
