OffenderSearch
For developers

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" } }'
Definition

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.

The layers

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.

LayerIn the catalogueEndpointWhat a record carries
Sex offender registries58 US registries: the 50 states, DC and five territoriesPOST /v1/searchPhotographs, aliases, addresses, offenses and tier where published; matchState on every record
County court records36 court sources in the cataloguePOST /v1/criminal/searchCase number, court, charges with statute and severity, dispositions, sentence
County jail bookings1,408 jail rosters in the cataloguePOST /v1/criminal/searchBooking date, charges at booking, custody status; a booking is not a conviction
Statewide prison systems53 departments of correctionsPOST /v1/criminal/searchCustody status, facility, admission and release dates, parole block
Warrants34 warrant systemsPOST /v1/criminal/searchOffense, description and warrant status
Healthcare exclusion listsFederal and state exclusion listsPOST /v1/criminal/searchrecordType 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.

Registry layer

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.

Criminal layers

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.

Matching

How a public records API should match a person

  • Send a full date of birth. matchState: dob_match is the only automatic identification; year, age and name-only matches are leads for a reviewer.
  • Read matchBasis and matchConfidence to see which strategy produced a hit (exact, nickname, initial, prefix, alias) and how strong it is. The matching rules define each state.
  • Keep personRef and sources[].recordUrl with every decision, so a reviewer can open the official entry.
  • Treat an incomplete source as unknown. sourceStatus on the registry side and counts.sourcesPending on the criminal side say what was not reached.
Beyond one call

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.

Pricing

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 / monthMonthly costEffective 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.

Start free ›25 free calls, no card.
The line

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.

Learn

Public records API how-to guides

Runnable guides

Every one runs against the sandbox with a free test key.

Background check API tutorial ›A first registry and criminal check in ten minutes, on the sandbox, in curl, Python and Node.
Background check API response explained ›Every field of a real sandbox response, group by group.
Criminal records by name and date of birth ›Why the date of birth decides whether a hit is an identification or a lead.
Check a registered sex offender by API ›Name plus date of birth, 58 US registries, and what each matchState means.
Court records API tutorial ›Cases, charges and dispositions, and how to read a case that holds both a conviction and a dismissal.
Build an inmate search tool ›Custody status, facility and release dates from the criminal records API.
No-match and multiple-match results ›The three shapes of "nothing", possibles, and a decision table per matchState.
Rate limits, retries and idempotency ›429 semantics, backoff that honours Retry-After, and why a repeated POST is a second search.
Test a background check integration ›The sandbox scenario matrix, a test suite, CI and the switch to production.
Monitor a person with webhooks ›A standing watch on a person, signed alerts, and the receiver that verifies them.
Background checks for marketplaces ›Where the check sits in sign-up, re-screens by batch, a monitor per provider.
API vs building your own records pipeline ›The build-versus-buy decision for public-records data.

All guides: Learn APIs by example · reference: developer docs · packages: SDKs and CLI.

FAQ

Public records API questions

Which public records does the API cover?

Sex offender registries (58 US registries), county court cases, county jail bookings, statewide prison custody records, warrants and healthcare exclusion lists. Each record says which layer and which jurisdiction it came from.

Which public records does it not cover?

Property, business, licence, vital, civil, family, traffic and bankruptcy records, and anything outside the United States. There is no SSN trace, credit, MVR, drug test or employment verification.

Is a public records API a background check?

It is the records layer of one. A background check used to decide a hire or a tenancy is a consumer report under the FCRA and runs as an FCRA order through FCRA Partner Access; the standard API is a public-records lookup and says so on every response.

How are the two sides different?

The registry search runs across all 58 registries by default and returns registry records with photographs and offenses. The criminal search requires a last name, takes a state or county to narrow it, runs cached by default with a live option, and returns court, booking, custody and warrant records.

How do I avoid matching the wrong person?

Send a full date of birth and act automatically only on dob_match. Weaker matches come back labelled, never silently promoted; route them to a reviewer with the photograph, addresses and the official record link.

Is there a free public records API?

Every new account gets 25 free calls on real data with no card, and the sandbox is free without limit with documented test people in the production shape.

Can I get the data in bulk?

Batch endpoints take up to 1,000 queries per call, billed per row. There is no bulk download of the corpus; the open-data page publishes aggregate statistics.

How current are the records?

The dataset is continuously updated and every record carries lastCheckedAt (registry) or lastSeen (criminal). A live block re-verifies named sources inside the request.

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.