Offendersearch
Criminal API Reference

Jurisdictions & codes

The two neutral code shapes, the record-kind vocabulary, and the jurisdictions catalog.

Base URL https://api.offendersearch.app

A code names a state and a jurisdiction, and nothing else

A jurisdiction code is the neutral handle for one place the product covers. It is what sources[].code reports on a record, what you pass as live.jurisdictions to verify at a source, and what the website resolver returns. There is deliberately no token for how the data is obtained — no portal, platform or vendor ever appears in a code, a source name, a coverage total, or an error. A code is a jurisdiction handle, and it is vendor-neutral by construction.

Treat a code as an opaque handle you got from the catalog. The two-shape rule below is enough to recognise a code; it is not a licence to synthesise one. A code that resolves is a code the catalog returns — enumerate the live values rather than building strings by hand.

The two shapes

ShapeFormExamples
County a county-level jurisdiction<ST>-<COUNTY>AL-BALDWIN, TX-DALLAS, TX-HARRIS
Statewide / federal a system, named by the kind of record it holds<ST>-<RECORD-KIND>TX-DOC, OK-COURT, US-WARRANT

<ST> is the two-letter USPS state code (US for a federal system). <COUNTY> is the county name, upper-cased, non-alphanumerics dropped and spaces hyphenated — Palm BeachPALM-BEACH — and it is the county name only: it never carries the word “County”. A county code never takes a record-kind suffix, because a county line already names one place.

The record-kind vocabulary

For a statewide or federal system the suffix is the kind of record the system publishes — one token from a fixed set. So TX-DOC is the Texas state prison system, OK-COURT is Oklahoma statewide court records, and US-WARRANT is a federal warrant system.

SuffixMeansExample
DOCa state prison / Department of Corrections inmate systemTX-DOC
COURTstatewide court records / dispositionsOK-COURT
WARRANTa warrant systemUS-WARRANT
REGISTRYa statewide registryFL-REGISTRY
JAILa statewide jail-roster systemKY-JAIL

GET /v1/criminal/jurisdictions

The coverage catalog as codes — every jurisdiction the product covers, plus an honest per-product coverage summary. This is where you enumerate the codes you will send in a search; do not build them by hand. Requires an API key. Three query parameters filter it, and they combine (AND):

ParamEffect
stateUSPS code — filter to one state, case-insensitive.
recordKindFilter by kind: jail-roster, court, doc-inmate, registry, warrant.
livetrue to list only jurisdictions reachable for live verification. Any other value (or omitted) lists all.
Request
One state, live only
curl -s -G "https://api.offendersearch.app/v1/criminal/jurisdictions" \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  --data-urlencode "state=TX" \
  --data-urlencode "live=true"
Response
200 OK
{
  "coverage": { "jurisdictions_total": 1410, "jurisdictions_live_connector": 727,
                "jurisdictions_pending_connector": 683, "states_covered": 50 },
  "jurisdictions": [
    { "code": "TX-DALLAS", "state": "TX", "county": "Dallas",
      "recordKind": "jail-roster", "level": "county", "live": true },
    { "code": "TX-DOC", "state": "TX", "county": null,
      "recordKind": "doc-inmate", "level": "state", "live": true }
  ],
  "count": 41
}

Each row is { code, state, county, recordKind, level, live }. An unmatched state simply yields an empty jurisdictions[] with the coverage summary intact — never an error. The recordKind values are the ones below:

recordKindEnumerates
jail-rosterCounty jail booking rosters.
courtStatewide court records and dispositions.
doc-inmateState Department of Corrections inmate systems.
registryStatewide registries.
warrantWarrant / most-wanted systems.
The coverage block is honest and vendor-scrubbed. It reports the true totals from the product’s own manifest — covered today versus known-but-pending — so a jurisdiction not yet covered is counted, never silently dropped. No portal, platform or vendor token ever appears here: only states, counties, record kinds and neutral codes. For the public, no-key currency picture of the same catalog, read GET /v1/criminal/sources.

How a code is used

A code shows up in two places, and they are different controls. A cached search is scoped by query.state and query.county — the location filter — while a live verification names the exact jurisdictions to re-check by their public codes in live.jurisdictions.

PurposeFieldExample
Filter a cached search to one jurisdictionquery.county + query.state{ "state": "TX", "county": "Dallas" }
Verify live at explicit jurisdictionslive.jurisdictions: [codes]["TX-DALLAS", "TX-DOC"]
Cached — scope by state + county
query.state + query.county
{
  "query": { "lastName": "Hamilton", "state": "TX", "county": "Dallas" }
}
Live — verify at explicit codes
live.jurisdictions: [codes]
{
  "query": { "lastName": "Hamilton", "state": "TX" },
  "live": { "jurisdictions": ["TX-DALLAS", "TX-DOC"] }
}

query.county is matched case-insensitively (and is also accepted as query.jurisdiction). State and county filter the record's jurisdiction; city, ZIP and street address filter the residence where a source publishes one; there is no lat/lng radius yet. live.jurisdictions takes the public codes; one public county code may cover more than one system, and each reports its own row in sourceStatus[].

An unrecognised live code is never fatal. A code that resolves to nothing is reported ok: false with incompleteReason: "not_searched" and is never billed — the rest of the search proceeds. If it is the only code you sent, the request is a 422 no_live_sources. Confirm a code against the catalog rather than parsing it for meaning beyond state and place.