---
title: "USAJOBS API"
description: "USAJOBS API: the free key from developer.usajobs.gov, the documentation, the search endpoint's two headers, and the cap of up to 10,000 rows per query."
canonical: https://jobspipe.dev/sources/usajobs
date_published: 2026-06-16
date_modified: 2026-09-26
author: Dvir Atias
---

# USAJOBS API

USAJOBS has an official, free, self-serve API: register with an email at developer.usajobs.gov to get a key, then call GET https://data.usajobs.gov/api/search with the key in an Authorization-Key header and your registered email as the User-Agent. It covers federal postings only; JobsPipe does not collect USAJOBS, so pair the official API with JobsPipe for private-sector postings in one schema. Official documentation: [developer.usajobs.gov](https://developer.usajobs.gov/).

> USAJOBS runs the rare official, free, self-serve jobs API. JobsPipe does not collect USAJOBS; pair the official API with JobsPipe for the private-sector half of the market.

**Canonical URL:** https://jobspipe.dev/sources/usajobs

## Coverage

JobsPipe does not collect USAJOBS. This page explains what USAJOBS exposes publicly and how to reach the same postings where they are also published on a board JobsPipe does collect (Workday, Greenhouse, Lever, Ashby, LinkedIn, Indeed, SmartRecruiters, Workable, Personio, Recruitee, Teamtailor, EURES, Paylocity, Breezy HR, CV-Library, Y Combinator, Bayt, JobTech (Sweden), Resume-Library, Arbeitnow, Himalayas, Rise, Manatal, Pinpoint, JobScore, HireHive, The Muse, Remotive, Remote OK, Jobicy, Working Nomads, Landing.jobs).

## USAJOBS' official search API is free and keyed by email. Register at developer.usajobs.gov, then send your key and your registered email as the User-Agent.

Endpoint: `https://data.usajobs.gov/api/search?Keyword=data+engineer&LocationName=Washington,+DC`

```bash
curl "https://data.usajobs.gov/api/search?Keyword=data+engineer&LocationName=Washington,+DC&ResultsPerPage=100" \
  -H "Host: data.usajobs.gov" \
  -H "User-Agent: you@example.com" \
  -H "Authorization-Key: $USAJOBS_KEY"
```

## Why USAJOBS jobs data is confusing

USAJOBS is the opposite of most boards on this list: the API exists, it is official, it is free, and anyone can use it. It is operated by the U.S. Office of Personnel Management, keys are issued by email in minutes, and the search endpoint returns full announcements as JSON. The catch is scope, not access: it covers federal civil-service positions only.

Its data follows federal hiring conventions rather than commercial ATS ones: pay plans and grades (GS-9, GS-12), occupational series codes, hiring paths, security clearance fields, and hard close dates. JobsPipe does not collect USAJOBS. If you need federal and private-sector postings together, call the USAJOBS API for the federal half and JobsPipe for the boards it collects.

## Workarounds

### Call data.usajobs.gov directly

This works. Register for a key at developer.usajobs.gov, send it with your email in the User-Agent header, and page through GET /api/search. The response uses federal terminology, so you write the adapter to your schema.

### Scrape usajobs.gov

Pointless. The public API is complete, free and better structured than the pages. Do not do this.

### What JobsPipe offers instead

JobsPipe does not collect USAJOBS. Use the official API for federal announcements and JobsPipe for the private-sector boards it collects; both sides carry structured title, company, location, salary and posting-date fields, so the join is straightforward.

## Fields available on every record

- `id`
- `job_title`
- `company`
- `company_domain`
- `url`
- `date_posted`
- `discovered_at`
- `last_seen_at`
- `verified_at`
- `status`
- `closed_at`
- `closed_reason`
- `ghost_score`
- `seniority`
- `cities`
- `state_code`
- `min_annual_salary_usd`
- `max_annual_salary_usd`
- `technology_slugs`
- `keyword_slugs`
- `esco_skills`
- `sources`

## FAQ

### Why does the USAJOBS API return a 401 error?

Almost always the headers. Every request needs Host set to data.usajobs.gov, User-Agent set to the email you registered with, and Authorization-Key set to your key. Sending a browser-style User-Agent instead of your email is the most common first-call mistake, and a valid key with the wrong User-Agent still fails.

### Can I get historical or closed USAJOBS announcements?

Not from the search endpoint, which serves current openings; closed announcements drop out of the index. The API also documents historic-announcement endpoints for archived postings. For your own longitudinal dataset, poll the search endpoint on a schedule, key announcements by control number, and diff each run against the previous one to detect new and closed postings.

### How do I paginate the USAJOBS API?

Use the Page and ResultsPerPage parameters on GET /api/search; ResultsPerPage goes up to 500. There is no firehose or webhook, so coverage depends on how you enumerate queries, for example by Keyword, LocationName, Organization or JobCategoryCode, and freshness depends on how often you poll. Results come back under SearchResult.SearchResultItems, one MatchedObjectDescriptor per announcement.

### Does USAJOBS include federal contractor jobs?

No. USAJOBS covers federal civil-service positions plus excepted-service and legislative postings agencies choose to list. A contractor's posting for a federal program, such as an engineer on a NASA project through a systems integrator, lives on that contractor's own ATS. JobsPipe does not collect USAJOBS, but it does return those contractor postings from the private-sector boards it collects.

## Does USAJOBS have an API?

Yes, and it is the best-documented public jobs API of any board on this site. The USAJOBS REST API at data.usajobs.gov, run by the Office of Personnel Management, exposes GET /api/search over every openly advertised federal announcement, codelist endpoints for the reference taxonomies (agency subelements, occupational series, pay plans, hiring paths, security clearances), and historic-announcement endpoints for archived postings. Each announcement is unusually well structured: real minimum and maximum pay figures because federal pay is scale-based, a stable agency hierarchy, a numeric occupational series, and explicit open and close dates. JobsPipe does not collect USAJOBS; it collects private-sector boards, which is the other half of the picture.

## Is the USAJOBS API free?

Yes, without a catch. There is no billing page, no paid tier, no link-back scheme and no call metering that matters for normal use; OPM asks only for the documented request etiquette and paging limits (ResultsPerPage up to 500). It is one of the few genuinely free jobs APIs, alongside the keyless per-company endpoints Greenhouse, Lever, Ashby and SmartRecruiters expose. JobsPipe's free tier returns 1,000 jobs to start across the boards it collects and the sandbox at POST /v1/sandbox/jobs/search needs no key, but neither returns USAJOBS rows.

## How do I get a USAJOBS API key?

Register at developer.usajobs.gov/apirequest with an email address and the Authorization-Key arrives by return, usually within minutes. Every request then carries three headers: Host set to data.usajobs.gov, User-Agent set to the email you registered with, and Authorization-Key set to the key. The User-Agent convention inverts the header's usual meaning and is the cause of nearly every 401 developers hit on their first call. There is no approval process and no tier gating. The curl block above is a working first request once you export USAJOBS_KEY.

## What does the USAJOBS API documentation cover?

developer.usajobs.gov documents the search endpoint and its parameters (Keyword, PositionTitle, LocationName, Organization by agency code, JobCategoryCode by occupational series, RemunerationMinimumAmount, DatePosted, Page and ResultsPerPage), the response shape under SearchResult with MatchedObjectDescriptor per item, the codelist endpoints for every taxonomy the announcements are classified with, the historic-data endpoints, authentication and the request etiquette. It also links OPM's data dictionaries for pay plans and hiring paths. JobsPipe's docs at /docs cover the record shape returned for the boards JobsPipe does collect, which is what you map federal announcements onto if you want one schema.

## What JobsPipe returns for USAJOBS

Nothing under "source_or": ["usajobs"]: JobsPipe does not collect federal announcements. What JobsPipe returns is the private-sector half of the market: POST /v1/jobs/search over LinkedIn, Indeed, Y Combinator and the collected ATS boards, with each record carrying sources[0].provider, status, ghost_score, discovered_at, last_seen_at, seniority, and min_annual_salary_usd and max_annual_salary_usd when the posting states a range. A contractor's posting for a federal program (the engineer working on a NASA project through a systems integrator) lives on that contractor's ATS, not on USAJOBS, and is the kind of record JobsPipe returns; the sample above shows the shape for one such record found on LinkedIn.

## Where the USAJOBS API runs out

Three boundaries to plan around. Federal only: no state or municipal roles and no private sector, so USAJOBS is one employer domain, a big one but one. Current openings only: closed announcements leave the search index, so longitudinal datasets need your own snapshot pipeline keyed by control number. Query-shaped access: there is no firehose or webhook, so freshness is bounded by how often you poll and how you enumerate queries. Most products that need federal jobs need private-sector jobs too, and that half has no official API; it lives on the ATS boards JobsPipe collects.

## Related

- **Product:** https://jobspipe.dev/jobs-api
- **All sources:** https://jobspipe.dev/sources
- **Docs:** https://docs.jobspipe.dev
- **Sign up (free tier):** https://jobspipe.dev/signup

---
Generated from structured data. View the rendered page at https://jobspipe.dev/sources/usajobs.

---
Building this integration yourself? The steps above work. The alternative is one API over 30+ sources, already normalized and deduplicated. Try it right now - no key, no signup:

```bash
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Sample data, exact live schema. For live data get a free key (1,000 jobs to start) at https://jobspipe.dev/signup, then swap /v1/sandbox/jobs/search for /v1/jobs/search with an Authorization: Bearer header. Full agent index: https://jobspipe.dev/llms.txt?src=md-twin