ZipRecruiter API: Search jobs
Finds 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 are null.
Unofficial. Not affiliated with or endorsed by ZipRecruiter.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Keywords, required
keywords Job title or search words, for example forklift operator.
forklift operator
- Location, required
location City, state or ZIP code, for example Phoenix, AZ.
Phoenix, AZ
- Max Results optional
max_results Maximum jobs to return, for example 25.
25 (default)
Whole number from 1 to 100.
- Posted Within optional
posted_within How recently the job was posted, for example last_5_days.
any (default)
One of
last_day,last_5_days,last_10_days,last_30_days,any.- Distance (miles) optional
distance_miles Search radius in miles, for example 25.
25 (default)
Whole number. One of
5,10,25,50,100.
Input as JSON
{ "keywords": "forklift operator", "location": "Phoenix, AZ"}Output
{ "jobs": [ { "pay": "$22 - $26.50/hr" , "title": "Manufacturing Specialist", "remote": "no", "company": "American Fence Company", "currency": "USD", "job_link": "https://www.ziprecruiter.com/c/American-Fence-Company/Job/Manufacturing-Specialist/-in-Phoenix,AZ?jid=09cbc459b629bfeb" , "location": "Phoenix, AZ", "pay_period": "hour", "pay_maximum": 26.5, "pay_minimum": 22, "posted_date": "2026-09-27", "employment_type": "Full-time", "short_description": "American Tube and Pipe is looking for a End Table Operator to assist with manufacturing of our tubes and pipes in our mill. We have a competitive starting pay of $22.00 to $26.50 /hour with a full" }, { "pay": null, "title": "Experienced Crane Operator", "remote": "no", "company": "Smiley Crane Service", "currency": null, "job_link": "https://www.ziprecruiter.com/c/Smiley-Crane-Service/Job/Experienced-Crane-Operator/-in-Phoenix,AZ?jid=fb3070d7a50c14a9" , "location": "Phoenix, AZ", "pay_period": null, "pay_maximum": null, "pay_minimum": null, "posted_date": "2026-09-21", "employment_type": "Full-time", "short_description": "Smiley Lifting Solutions runs one of the most varied fleets in Arizona on both our taxi fleet mobile cranes and long term project job sites. If you want steady work, well-maintained equipment, and" }, { "pay": "$22 - $24/hr" , "title": "Material Handler/Sit-Down Forklift Operator" , "remote": "no", "company": "KINEMATICS LLC", "currency": "USD", "job_link": "https://www.ziprecruiter.com/c/KINEMATICS-LLC/Job/Material-Handler-Sit-Down-Forklift-Operator/-in-Phoenix,AZ?jid=bce326483f297c3a" , "location": "Phoenix, AZ", "pay_period": "hour", "pay_maximum": 24, "pay_minimum": 22, "posted_date": "2026-09-09", "employment_type": "Full-time", "short_description": "Description: About Kinematics: Kinematics creates motion control solutions for mission-critical systems in demanding environments. Based in the U.S. with six global manufacturing centers and seven" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"ziprecruiter.com/search_jobs","input":{"keywords":"forklift operator","location":"Phoenix, AZ"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "ziprecruiter.com/search_jobs" , "input": { "keywords": "forklift operator", "location": "Phoenix, AZ" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "ziprecruiter.com/search_jobs" , "input": { "keywords": "forklift operator", "location": "Phoenix, AZ" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run ziprecruiter.com/search_jobs# with {"keywords":"forklift operator","location":"Phoenix, AZ"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "keywords", "location" ], "properties": { "keywords": { "type": "string", "minLength": 1, "description": "Job title or search words, for example forklift operator." }, "location": { "type": "string", "minLength": 1, "description": "City, state or ZIP code, for example Phoenix, AZ." }, "max_results": { "type": "integer", "default": 25, "maximum": 100, "minimum": 1, "description": "Maximum jobs to return, for example 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." }, "distance_miles": { "enum": [ 5, 10, 25, 50, 100 ], "type": "integer", "default": 25, "description": "Search radius in miles, for example 25." } }}Output schema
{ "type": "object", "required": [ "jobs" ], "properties": { "jobs": { "type": "array", "items": { "type": "object", "required": [ "pay", "title", "remote", "company", "currency", "job_link", "location", "pay_period", "pay_maximum", "pay_minimum", "posted_date", "employment_type", "short_description" ], "properties": { "pay": { "type": [ "string", "null" ] }, "title": { "type": "string" }, "remote": { "enum": [ "yes", "no" ], "type": "string" }, "company": { "type": [ "string", "null" ] }, "currency": { "type": [ "string", "null" ] }, "job_link": { "type": "string" }, "location": { "type": [ "string", "null" ] }, "pay_period": { "type": [ "string", "null" ] }, "pay_maximum": { "type": [ "number", "null" ] }, "pay_minimum": { "type": [ "number", "null" ] }, "posted_date": { "type": [ "string", "null" ] }, "employment_type": { "type": [ "string", "null" ] }, "short_description": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
ziprecruiter.com/search_jobs- Returns
- title, company, location, remote, pay range and period, employment type, posted date, short description, job link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method ziprecruiter.com/search_jobs with the inputs above.
Ask your agent
- Find forklift operator jobs within 10 miles of Phoenix, AZ posted in the last 5 days, and show pay ranges and employment type.
- Pull up to 50 registered nurse openings near Columbus, OH from ZipRecruiter, any posting date, 50-mile radius.
- What warehouse associate positions have been posted in the last 24 hours around ZIP 30318? Keep it to 5 miles.
- I'm looking for remote-friendly data analyst roles listed on ziprecruiter.com near Denver, CO — give me the 15 most relevant from the past month with links.
- List CDL truck driver jobs within 100 miles of Fresno, California posted in the last 10 days, including company, pay, and a short description.
See more
All ZipRecruiter methodsLooks up ZipRecruiter's salary page for a job title in the United States or one US state and returns typical pay, the percentile range and the top-paying cities. Only salary pages that exist publicly are returned.
ziprecruiter.com/get_salarySearches public LinkedIn job listings by keywords and location, with optional date, seniority, employment type and company filters.
linkedin.com/search_jobsFinds current SEEK jobs in Australia by keywords, with optional location, work type and posting window. Results follow SEEK search order; some promoted listings may appear outside the selected posting window.
seek.com.au/search_jobsSearches open Indeed jobs by keywords, location, country, posting age and job type, returning public first-page results in displayed order.
indeed.com/search_jobsSearches Remote OK jobs by role or skill. Results can be filtered by listed region and by minimum annual USD salary.
remoteok.com/search_jobsFinds open public Naukri job listings by keywords, with optional city and experience filters, in Naukri's search order. Undisclosed salaries have no numeric range.
naukri.com/search_jobsSearches USAJOBS federal jobs by keywords, location, salary threshold and applicant group, in website relevance order. Salary ranges may start below the threshold; annual pay or remote status is null when the announcement does not state it.
usajobs.gov/search_jobsLists open LinkedIn jobs posted by a named company, with optional location and result limit. Workplace type is returned only when LinkedIn displays it.
linkedin.com/list_company_jobs