# 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/workflows/ziprecruiter
- Handle: `@ziprecruiter`
- Category: [Jobs](https://fous.com/workflows/category/jobs)
- Source website: https://ziprecruiter.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with ZipRecruiter.

## Methods

### Get salary

Operation `get_salary`, version 1. 1 credit per call.

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 call.

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

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_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.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

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=120) 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.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_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);
```

Or describe the data in plain language: send `{"api":"@ziprecruiter","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## 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

### Is Fous affiliated with ZipRecruiter?

No. Fous is not affiliated with ZipRecruiter. This workflow reads the public ziprecruiter.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. 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; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check 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/workflows/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/workflows/payscale.md): PayScale provides job and location salary research, skill pay effects when published, and employer average base salaries and common jobs where available.
- [Remote OK API](https://fous.com/workflows/remote-ok.md): Remote job postings from Remote OK.
- [LinkedIn API](https://fous.com/workflows/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/workflows/h1b-salary-database.md): Search employer-filed H-1B salary and labor condition records.
- [Zumper API](https://fous.com/workflows/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/workflows/workday.md): Public job listings on Workday career sites.
- [USAJOBS API](https://fous.com/workflows/usajobs.md): Federal government job listings and announcements.
- [All Jobs workflows](https://fous.com/workflows/category/jobs)
