Offendersearch
One endpoint · five record types

The Criminal Search API

One call across more than a thousand county, state and federal jurisdictions — jail rosters, prison systems, court records, warrants and registries — returned in one schema with a citation on every record.

Same key as the registry API. $0.15 a call, $0.11 past 2,000 a month.

curl -sS https://api.offendersearch.app/v1/criminal/search \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -G --data-urlencode "name=John Q Public" \
     --data-urlencode "state=TX"
What you integrate against

One schema over five record types

A jail booking, a prison term, a court case and a warrant are four different shapes in the source systems. They arrive here as one record type with a kind discriminator, so your code branches once — not per state.

kindJurisdiction codeIn the roster
jail<ST>-<COUNTY>1,375
doc<ST>-DOC53
court<ST>-COURT24
warrant<ST>-WARRANT28
registry<ST>-REGISTRY11

Codes are public and usable directly in a query — see jurisdictions.

Built to be auditable

Every answer says what it covered

  • searched.jurisdictions — how many were actually queried for this call
  • searched.incomplete — anything that did not answer, named rather than silently dropped
  • source.citation on every record, so a result can be verified at the jurisdiction that holds it
  • score on every match — a name is matched, not string-compared
  • kind on every record, so an arrest is never mistaken for a conviction in your own code

Full field reference: the record object.

FAQ

Criminal API questions

How is this different from the sex offender registry API?

Different corpus, same everything else. It runs on the same account, the same X-API-Key, the same scored-match model and the same billing — $0.15 a call, graduating to $0.11 past 2,000 a month. If you have already integrated the registry search, the criminal endpoints need no new credential, no new contract and no migration.

How do I know which jurisdictions a search actually reached?

Every response carries a searched block naming the jurisdiction count and listing anything incomplete, and every record carries the jurisdiction that holds it plus a citation. That is the design principle: a criminal search that cannot tell you what it covered is not auditable, and an unauditable answer is not usable for anything that matters.

Can I discover coverage programmatically?

Yes — GET /v1/criminal/sources returns every jurisdiction we know about, each marked live or pending, with its scope and the age of its most recent update. Build against that rather than against a number on a marketing page; it is the same endpoint this site reads.

Is there a batch endpoint?

Yes. POST a batch and each row is billed as one call — a 1,000-row batch is 1,000 calls at the graduated rate. Rows that error are reported with a reason and are not billed. Full detail is in the batch reference.

Is this FCRA-compliant?

No API is, by itself. Offendersearch is not a consumer reporting agency and results are not a consumer report. FCRA-covered decisions require appropriate process on your side regardless of the data source.