USAJOBS API: Search federal jobs
Searches 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.
Unofficial. Not affiliated with or endorsed by USAJOBS.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Keywords, required
keywords Words to search for in federal jobs, such as accountant.
accountant
- Location optional
location City, state, or remote, such as Washington, DC or remote. Leave blank to search anywhere.
(default)
- Max Results optional
max_results Maximum number of jobs to return, such as 25; maximum 100.
3
Whole number from 1 to 100. Default
25.- Who May Apply optional
who_may_apply Applicant group to include, such as public; default any.
any (default)
One of
any,public,veterans,students_and_recent_graduates,federal_employees.- Minimum Salary (USD) optional
minimum_salary_usd Minimum annual pay in USD, such as 100000. Leave at 0 for any salary.
0 (default)
Number 0 or more.
Input as JSON
{ "keywords": "accountant", "max_results": 3}Output
{ "jobs": [ { "agency": "U.S. Coast Guard", "remote": false, "job_link": "https://www.usajobs.gov/job/889503200" , "job_title": "ACCOUNTANT", "locations": [ "Topeka, KS" ], "open_date": "2026-10-20", "pay_grade": "GS 12", "department": "Department of Homeland Security", "closing_date": "2026-10-30", "who_may_apply": [ "Open to the public", "Career transition (CTAP, ICTAP, RPL)" ], "salary_currency": "USD", "telework_eligible": false, "salary_maximum_usd": 118261, "salary_minimum_usd": 90968 }, { "agency": "U.S. Coast Guard", "remote": false, "job_link": "https://www.usajobs.gov/job/889506700" , "job_title": "ACCOUNTANT", "locations": [ "Topeka, KS" ], "open_date": "2026-10-20", "pay_grade": "GS 12", "department": "Department of Homeland Security", "closing_date": "2026-10-30", "who_may_apply": [ "Competitive service", "Career transition (CTAP, ICTAP, RPL)", "Land and base management" ], "salary_currency": "USD", "telework_eligible": false, "salary_maximum_usd": 118261, "salary_minimum_usd": 90968 }, { "agency": "Army National Guard Units", "remote": false, "job_link": "https://www.usajobs.gov/job/889580800" , "job_title": "COST ACCOUNTANT", "locations": [ "Latham, NY" ], "open_date": "2026-10-21", "pay_grade": "GS 11", "department": "Department of the Army", "closing_date": "2026-11-05", "who_may_apply": [ "Internal to an agency" ], "salary_currency": "USD", "telework_eligible": false, "salary_maximum_usd": 100164, "salary_minimum_usd": 77045 } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"usajobs.gov/search_jobs","input":{"keywords":"accountant","max_results":3}}' # 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": "usajobs.gov/search_jobs" , "input": { "keywords": "accountant", "max_results": 3 }})# 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": "usajobs.gov/search_jobs" , "input": { "keywords": "accountant", "max_results": 3 } }), 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 usajobs.gov/search_jobs# with {"keywords":"accountant","max_results":3}"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" ], "properties": { "keywords": { "type": "string", "minLength": 1, "description": "Words to search for in federal jobs, such as accountant." }, "location": { "type": "string", "default": "", "description": "City, state, or remote, such as Washington, DC or remote. Leave blank to search anywhere." }, "max_results": { "type": "integer", "default": 25, "maximum": 100, "minimum": 1, "description": "Maximum number of jobs to return, such as 25; maximum 100." }, "who_may_apply": { "enum": [ "any", "public", "veterans", "students_and_recent_graduates", "federal_employees" ], "type": "string", "default": "any", "description": "Applicant group to include, such as public; default any." }, "minimum_salary_usd": { "type": "number", "default": 0, "minimum": 0, "description": "Minimum annual pay in USD, such as 100000. Leave at 0 for any salary." } }}Output schema
{ "type": "object", "required": [ "jobs" ], "properties": { "jobs": { "type": "array", "items": { "type": "object", "required": [ "job_title", "agency", "department", "locations", "salary_minimum_usd", "salary_maximum_usd", "salary_currency", "pay_grade", "open_date", "closing_date", "who_may_apply", "telework_eligible", "remote", "job_link" ], "properties": { "agency": { "type": [ "string", "null" ] }, "remote": { "type": [ "boolean", "null" ] }, "job_link": { "type": "string" }, "job_title": { "type": "string" }, "locations": { "type": "array", "items": { "type": "string" } }, "open_date": { "type": [ "string", "null" ] }, "pay_grade": { "type": [ "string", "null" ] }, "department": { "type": [ "string", "null" ] }, "closing_date": { "type": [ "string", "null" ] }, "who_may_apply": { "type": "array", "items": { "type": "string" } }, "salary_currency": { "type": "string" }, "telework_eligible": { "type": [ "boolean", "null" ] }, "salary_maximum_usd": { "type": [ "number", "null" ] }, "salary_minimum_usd": { "type": [ "number", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
usajobs.gov/search_jobs- Returns
- job title, agency, department, locations, salary range, pay grade, dates, who may apply, telework and remote status, 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 usajobs.gov/search_jobs with the inputs above.
Ask your agent
- Find federal cybersecurity analyst openings in Denver, Colorado paying at least $95,000 a year, open to the public
- Show me remote federal data scientist jobs with a salary above 120000 dollars
- I need veterans-only federal nursing positions in San Antonio, Texas, up to 30 results
- Look up federal accountant roles on usajobs.gov in Washington, DC for recent graduates with salaries over $60,000
- Any federal civil engineer jobs anywhere, limited to 15 listings open to federal employees only
See more
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.
ziprecruiter.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 U.S. federal grant opportunities by topic, agency, applicant type and status, with funding and eligibility details. Open results exclude opportunities whose closing date has passed.
grants.gov/search_grantsSearches USAspending federal awards by keywords, awarding agency, state of performance and date across contracts, grants, loans and direct payments. Searches from October 1, 2007 onward.
usaspending.gov/search_federal_awardsSearches public LinkedIn job listings by keywords and location, with optional date, seniority, employment type and company filters.
linkedin.com/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_jobsFinds active federal contract notices on SAM.gov that match keywords, agency, place of performance, set-aside, notice type and posting period.
sam.gov/search_contract_opportunitiesFinds 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_jobs