Criminal Search API
One authenticated call searches US criminal records — statewide and federal — and returns one normalized, scored answer, in the same envelope as the Sex Offender API. Same account, same key, same dashboard.
Base URL https://api.offendersearch.appIntroduction
The Criminal Search API is a REST API for national criminal-records search. It lives under /v1/criminal/, is authenticated with the same API key as the Sex Offender API, and returns the same JSON envelope — a caller who knows one API knows both. Every match is a normalized record with a matchState, and every response carries a per-record legal notice.
- One call, one normalized answer. A single search returns de-duplicated records across the jurisdictions we cover — each labelled with the neutral jurisdiction code and record level it came back from.
- Cached by default, live verification on request. The default search reads a continuously updated corpus and returns in well under a second. Add a
liveblock to re-check the actual jurisdiction(s) in-request; it is billed per completed source to a$2.00ceiling. - Labelled match strength.
matchStateisdob_match,year_match,age_matchorno_dob_age_yearon every record, so you set your own confidence threshold rather than inherit one. - Neutral jurisdiction codes. Every place is a code of the form
<ST>-<COUNTY>(a county) or<ST>-<RECORD-KIND>(a statewide or federal system, e.g.TX-DOC). A code names a state and a place, and nothing else.
legal block of every response.Access
Criminal Search is available on every account automatically — there is nothing to enable and no entitlement to request. Any valid /v1/criminal/* call works immediately, and live verification is included with no separate add-on. The keys are the same keys you already use for the Sex Offender API. Full detail is on Access & keys.
Your first call
Create a key in your dashboard, export it, and search. query.lastName is required; an unbounded query is refused with 422. Note that page and perPage live at the top level of the request, not inside query. The full walkthrough is on Quickstart.
curl -X POST https://api.offendersearch.app/v1/criminal/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": { "lastName": "Hamilton", "firstName": "Alex", "state": "TX" },
"page": 1, "perPage": 50
}'Coverage today
Live today: the statewide DOC (state-prison) systems. The county jail and court layer is expanding, added jurisdiction by jurisdiction, and the federal layer alongside it. The authoritative, always-current answer is the API itself — GET /v1/criminal/sources lists every jurisdiction and its currency (no key required). Read it at integration rather than hard-coding a list.
Documentation
Each section below is its own page, with its own worked examples, and its own markdown alternate at /docs/criminal/{section}.md.
Your first authenticated criminal search, and the five checks to read off every response.
Access & keysThe X-API-Key header, automatic access to Criminal Search and live mode, and what a key controls.
Errors & status codesEvery status code, the stable error envelope, and why a 200 can still be an incomplete live search.
The primary endpoint. Cached by default, live verification on request, and every parameter.
POST /v1/criminal/searchMatching, confidence & partial namesThe surname anchor, name strategies, the closed match vocabulary, and how matchConfidence is built.
Searching by date of birthLabelled match strength on every record, and how one dob query reaches date, year and age evidence.
Result completeness & source statusOn a live search, an incomplete answer is labelled - counts, sourceStatus and incompleteReason.
Pagination & response sizeTop-level page and perPage, a 200-record page cap, and counts.records as the true total.
Coverage today & the sources endpointThe public coverage catalog with per-jurisdiction currency - the source of truth, no key required.
GET /v1/criminal/sourcesJurisdictions & codesThe two neutral code shapes, the record-kind vocabulary, and the jurisdictions catalog.
GET /v1/criminal/jurisdictionsResolve a website to a codeMap a roster or court website you know to the neutral jurisdiction code to search with.
POST /v1/criminal/resolveOne normalized record across every jurisdiction, the dob object, lifecycle, and re-fetch by id.
GET /v1/criminal/records/{recordId}Verification reportsA timestamped PDF attesting a search was performed, with a neutral citation on every record.
POST /v1/criminal/reportMigrating from another providerMoving from a legacy provider: the parameter map, the additive recordType note, and what you gain.
Endpoint index
The public Criminal Search surface, and the page that documents each in full. Every path is prefixed with the base URL.
| Method | Path | What it does |
|---|---|---|
| POST | /v1/criminal/search | The primary endpoint — cached by default, live verification when you send a live block. |
| GET | /v1/criminal/searches/{searchId} | Poll an asynchronous live job for its result. |
| POST | /v1/criminal/resolve | Map a roster or court website you know to our neutral jurisdiction code. |
| POST | /v1/criminal/batch | Up to 1000 cached lookups in one call, JSON or CSV, results in input order. |
| GET | /v1/criminal/records/{recordId} | Re-fetch a single normalized record by its externalId. |
| GET | /v1/criminal/sources | Coverage catalog with per-jurisdiction currency. No API key required. |
| GET | /v1/criminal/jurisdictions | The coverage catalog filtered by state, record kind and live-reachability. |
| POST | /v1/criminal/report | A timestamped PDF attesting a search was performed, with a citation per record. |
Alongside this: the Sex Offender API
The Sex Offender API is live on the same account and key: one call searches every US registry and returns scored, source-cited records with photographs.
Read the Sex Offender API reference →