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"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.
| kind | Jurisdiction code | In the roster |
|---|---|---|
jail | <ST>-<COUNTY> | 1,375 |
doc | <ST>-DOC | 53 |
court | <ST>-COURT | 24 |
warrant | <ST>-WARRANT | 28 |
registry | <ST>-REGISTRY | 11 |
Codes are public and usable directly in a query — see jurisdictions.
Every answer says what it covered
searched.jurisdictions— how many were actually queried for this callsearched.incomplete— anything that did not answer, named rather than silently droppedsource.citationon every record, so a result can be verified at the jurisdiction that holds itscoreon every match — a name is matched, not string-comparedkindon every record, so an arrest is never mistaken for a conviction in your own code
Full field reference: the record object.
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.