A public records API: registries, court, jail, prison and warrants on one key.
One public records API over the US sources a screening or research product needs: 58 US sex offender registries through the sex offender API, and county court cases, jail bookings, statewide prison custody and warrants across more than a thousand county, state and federal jurisdictions through the criminal records API. One schema, a match score and a citation on every record, $0.15 a call, 25 free calls, no card. Together they are the background check API.
25 free calls · No card · $0.15 a call, $0.11 past 2,000 a monthNo code? Run the same search in the screening dashboard ›curl -X POST https://api.offendersearch.app/v1/criminal/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": { "firstName": "Felony", "lastName": "Record", "dob": "1975-06-15" } }'What is a public records API?
A public records API is a web service that returns records a government body publishes about a person — registry entries, court cases, bookings, custody records, warrants — as structured data instead of a web page. Your application sends identifiers, usually a name and a date of birth, over HTTPS, and records come back in one schema with the jurisdiction that holds each one and a link to its official entry.
“Public records” is a broad phrase. Property deeds, business filings, licences and vital records are public records too, and this API does not carry them. It carries the layers a safety, screening or research product reads: the sex offender registries and the criminal record systems, and it says which of those layers each record came from.
Public records API coverage: what each source layer carries
Counts are the catalogue; live coverage per jurisdiction is published at GET /v1/criminal/sources and GET /v1/sources, and every response says which sources answered.
| Layer | In the catalogue | Endpoint | What a record carries |
|---|---|---|---|
| Sex offender registries | 58 US registries: the 50 states, DC and five territories | POST /v1/search | Photographs, aliases, addresses, offenses and tier where published; matchState on every record |
| County court records | 36 court sources in the catalogue | POST /v1/criminal/search | Case number, court, charges with statute and severity, dispositions, sentence |
| County jail bookings | 1,408 jail rosters in the catalogue | POST /v1/criminal/search | Booking date, charges at booking, custody status; a booking is not a conviction |
| Statewide prison systems | 53 departments of corrections | POST /v1/criminal/search | Custody status, facility, admission and release dates, parole block |
| Warrants | 34 warrant systems | POST /v1/criminal/search | Offense, description and warrant status |
| Healthcare exclusion lists | Federal and state exclusion lists | POST /v1/criminal/search | recordType healthcare_exclusion, conviction-based by default |
The registry side is one call across all 58 registries by default; the criminal side requires a last name and takes a state or county to narrow the search. Both share one key and one match model. What each state publishes: criminal records by state and the data sources catalogue.
Public records API for sex offender registries: a real response
The sandbox’s own answer for its date-of-birth-verified test person, captured from the code that serves it.
curl -X POST https://sandbox.offendersearch.app/v1/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": { "firstName": "Exact", "lastName": "Match", "dob": "1980-01-01" } }'Read status, counts and sourceStatus before the records: an incomplete registry means “not clear”, never “no match”. Every field is defined on the record object reference; the sex offender API page covers scope, matching and pricing in full.
Public records API for court, jail, prison and warrant records: a real response
The sandbox’s felony-conviction test person: one court case with a guilty felony and a dismissed misdemeanor side by side.
{
"status": "complete",
"counts": {
"records": 1,
"recordsReturned": 1,
"sourcesQueried": 0,
"sourcesComplete": 0,
"sourcesIncomplete": 0,
"candidatesCapped": false,
"exclusionsIncluded": false,
"sourcesOnFile": 1567,
"sourcesPending": 347
},
"warnings": [],
"page": 1,
"perPage": 50,
"totalPages": 1,
"sourceStatus": [],
"cappedOmittedSources": [],
"omittedFields": [
"sourceData"
],
"legal": {
"notice": "Not a consumer report. This information may not be used for any purpose under the Fair Credit Reporting Act (15 U.S.C. § 1681 et seq.)."recordType names the layer (court_case, jail_booking, doc_inmate, warrant, healthcare_exclusion); cases[].charges[].disposition decides whether a record is a conviction. The criminal records API page walks each layer; the inmate search API page covers custody records in depth.
How a public records API should match a person
- Send a full date of birth.
matchState: dob_matchis the only automatic identification; year, age and name-only matches are leads for a reviewer. - Read
matchBasisandmatchConfidenceto see which strategy produced a hit (exact, nickname, initial, prefix, alias) and how strong it is. The matching rules define each state. - Keep
personRefandsources[].recordUrlwith every decision, so a reviewer can open the official entry. - Treat an incomplete source as unknown.
sourceStatuson the registry side andcounts.sourcesPendingon the criminal side say what was not reached.
Public records API batch, async, monitoring and webhooks
Batch
POST /v1/batch and POST /v1/criminal/batch take up to 1,000 queries as JSON or CSV and return one result per row, billed per row. See bulk sex offender search.
Async
POST /v1/searches accepts a long search with a webhookUrl and answers 202 with a resultsUrl; a live criminal search with more than two sources answers 202 with a poll URL. See async and webhooks.
Monitors
POST /v1/monitors keeps a watch on a person ($3 a month) or a place ($10 a month) and sends signed monitor.alert webhooks. See monitoring.
Public records API pricing
$0.15 a call, $0.11 for each call past 2,000 in a month. No seats, no setup fee, no minimum on search. 25 free calls on sign-up, no card.
| Calls / month | Monthly cost | Effective per call |
|---|---|---|
| 1,000 | $150.00 | $0.1500 |
| 5,000 | $630.00 | $0.1260 |
| 25,000 | $2,830.00 | $0.1132 |
| 100,000 | $11,080.00 | $0.1108 |
A registry search and a criminal search are separate calls. Full schedule and the published vendor comparison: background check API pricing; the free calls and the sandbox: free background check API.
A public records API is not a consumer report
Every standard response carries legal.notice: not a consumer report. Looking up public records for safety, trust-and-safety, research or due diligence is what the API is for. A decision about employment, housing, credit or insurance is a consumer-report use under the Fair Credit Reporting Act and runs as an FCRA order through FCRA Partner Access for approved partners — consent, permissible purpose, adverse action and disputes on the same data. The employment screening API and tenant screening API pages describe the two paths for each flow.
Public records API how-to guides
Runnable guides
Every one runs against the sandbox with a free test key.
All guides: Learn APIs by example · reference: developer docs · packages: SDKs and CLI.
Public records API questions
Which public records does the API cover?
Which public records does it not cover?
Is a public records API a background check?
How are the two sides different?
How do I avoid matching the wrong person?
Is there a free public records API?
Can I get the data in bulk?
How current are the records?
Public records API — Make your first call free
25 free calls, no card, and a sandbox that never bills. One key for registries and criminal records.