Offendersearch
Criminal API Reference

Resolve a website to a code

Map a roster or court website you know to the neutral jurisdiction code to search with.

Base URL https://api.offendersearch.app

Your site in, our neutral code out

You may already know the roster or records website for a place you care about — a county sheriff’s inmate page, a court portal — without knowing our jurisdiction code for it. The resolver maps a website to that code, so you can drive a search from a URL.

The resolver is one-directional: your site in → our neutral jurisdiction code out. Even when the answer is “we cover this”, the response names only the state, the county, and the neutral code — never the site we actually read. The mapping runs only from your input toward a neutral code, never the other way.

POST /v1/criminal/resolve

X-API-Key, available on every account exactly like search — no entitlement required. Not metered — a cheap in-memory lookup that consults no data source, so it emits no criminal_call. Send one website or a list of websites; a request with neither is 422 no_website.

POST /v1/criminal/resolve
curl -X POST https://api.offendersearch.app/v1/criminal/resolve \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "website": "https://sheriff.examplecounty.gov/inmates" }'
200 OK — one website
{
  "input": "https://sheriff.examplecounty.gov/inmates",
  "supported": true,
  "code": "TX-DALLAS",
  "state": "TX",
  "county": "Dallas",
  "note": "equivalent data available for this jurisdiction"
}

Response fields

FieldTypeMeaning
inputstringYour website, echoed back verbatim so you can line results up with inputs.
supportedbooleantrue = we have equivalent data and code is populated. false = not covered.
codestring | nullThe public jurisdiction code to use in a search. null when unsupported.
statestring | nullThe jurisdiction’s state, when we can identify it — even for an unsupported site.
countystring | nullThe jurisdiction’s county, when we can identify it.
notestringA plain-language explanation, e.g. "equivalent data available for this jurisdiction" or "Baldwin, AL is not currently covered".

An unsupported site is supported: false with a plain-language reason — not an error. Only a request with no site at all is a 422 no_website.

Resolving a list

A list of websites returns a results[] wrapper, one entry per input, in order — so a mixed batch of sites still resolves the ones we cover and tells you which ones we do not.

POST /v1/criminal/resolve — a list
curl -X POST https://api.offendersearch.app/v1/criminal/resolve \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "websites": ["https://sheriff.examplecounty.gov/inmates",
                     "https://jail.baldwincounty.example/roster"] }'
200 OK — a list
{
  "count": 2,
  "results": [
    { "input": "https://sheriff.examplecounty.gov/inmates",
      "supported": true, "code": "TX-DALLAS", "state": "TX", "county": "Dallas",
      "note": "equivalent data available for this jurisdiction" },
    { "input": "https://jail.baldwincounty.example/roster",
      "supported": false, "code": null, "state": "AL", "county": "Baldwin",
      "note": "Baldwin, AL is not currently covered" }
  ]
}

Using a website inline in a search

You don’t have to resolve first. query.website scopes a cached search to the resolved jurisdiction; live.websites live-verifies the resolved jurisdictions, exactly as if you had listed their codes. Whenever a search resolves a website, the response carries a top-level resolution[] array so you can see which code each site mapped to. See Search and Jurisdictions & codes.