Criminal Records API · v1.0.0

Search criminal records by place

geography, recordKinds and coverage.yearsBack: the local, state and federal layers, every way to name a place, and how the answer shows gaps.

Livehttps://api.offendersearch.appSandboxhttps://sandbox.offendersearch.app

Search criminal records by place, without codes

Send a place in your own words (a county, a ZIP code and a radius, a city, or whole states) and the kinds of record you want. The server finds the sources that cover that area and searches only those, and the answer names every jurisdiction that stood behind it and every asked county that has no source of its own. All three keys are optional on POST /v1/criminal/search; a search without them answers exactly as before, and it is billed like any other search.

POST /v1/criminal/search
curl -X POST https://api.offendersearch.app/v1/criminal/search \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "query": { "lastName": "Rivera", "firstName": "Jordan", "dob": "1988-04-12" },
        "geography": { "zip": "43215", "radiusMiles": 25 },
        "recordKinds": ["jail-roster", "court"]
      }'

What a criminal place search covers: local, state and federal

Every place search covers three layers of sources:

LayerSources searchedNotes
LocalThe county, city and regional sources for every county in the area: county jails and courts, city courts and jails (a city lists its county), and regional jails and courts (a jail serving several counties answers for each of them).Records come from that county's own systems.
StateEach involved state's statewide sources: state courts, the state prison system, statewide jail rosters, state-run jail systems, registries, warrants and the state's exclusion list.A statewide source is one source for the whole state, so its records are not narrowed to the asked counties: a state prison record from elsewhere in the state is returned when the name matches.
FederalFederal courts, the federal prison system, federal warrants and the federal exclusion lists.Searched with every place: federal records are not tied to one county.

Ways to name a place in a criminal search

geographyExampleCovers
county{"county": "39049"} or {"county": "OH:Franklin"}One county, by five-digit FIPS code or "ST:County name". In Virginia a name means the county; write an independent city by its FIPS code.
zip{"zip": "43215"}Every county the ZIP code touches.
radiusMiles{"zip": "43215", "radiusMiles": 25}Adds every county whose center lies within that many miles (0–100) of the center of the zip, county or city counties. State lines do not stop it.
city + state{"city": "Columbus", "state": "OH"}Every county the city spans: a city that crosses a county line lists them all.
states{"states": ["OH", "IN"]}Whole states, up to 10: every county in them, plus their statewide sources.

A place that matches no county is 422 unknown_geography; a malformed one is 422 invalid_geography. Both name the field.

Record kinds, years back and other criminal search keys

You sendWhat happens
Several place fieldsThey combine: the area is every county any of them names.
recordKindsjail-roster, court, doc-inmate (prison), registry, warrant, exclusion. Applies to all three layers; works with or without geography.
coverage.yearsBackA source whose stated window is shorter is not searched and is listed in coverage.geography.yearsBack.droppedShorterWindow. A source that states no window is searched and counted in unknownWindow. To keep only records dated inside a window, add filters.lookbackYears.
filters.sources as wellBoth must hold. appliedFilters echoes only what you sent.
No geographyEvery state is searched, exactly as before. A place narrows a search; it never widens it, so records from other states are left out and counted in counts.filteredOut.sources.
A place in live.jurisdictionsChecks the county, city and regional sources in that area that can be checked live. Statewide and federal sources are checked live only when named by code (OH-DOC, US-DOC), because every live source is billed. See Async and live.

Every other filter still applies on top: see every way to narrow a criminal search.

Reading coverage.geography in a criminal search response

coverage.geography is present whenever the request sends geography, recordKinds or coverage:

FieldWhat it tells you
jurisdictionsSearchedEvery source searched, with its kind and the asked counties it covers, by name.
countiesEvery county in the area and its local sources.
countiesWithoutSourceAsked counties with no county, city or regional source of the asked kinds. Only the statewide and federal sources stood behind the answer there. A gap is shown, never assumed away.
sourcesSearchedHow many sources were in scope.
yearsBackWith coverage.yearsBack: the sources left out for a shorter window, and how many state no window.

Records from sources outside the area are counted in counts.filteredOut.sources, never dropped silently. Each source’s own geography is listed by GET /v1/criminal/sources.

Example criminal search: a ZIP code and 25 miles around it

You know the person lived in ZIP 43215 and want jail and court records from there and the counties around it, without looking up a single code.

POST /v1/criminal/search
curl -X POST https://api.offendersearch.app/v1/criminal/search \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "query": { "lastName": "Rivera", "firstName": "Jordan", "dob": "1988-04-12" },
        "geography": { "zip": "43215", "radiusMiles": 25 },
        "recordKinds": ["jail-roster", "court"]
      }'
200 OK (abridged)
{
  "status": "complete",
  "counts": { "records": 1, "filteredOut": { "sources": 2 }, "unknownKept": {}, "quarantined": 0 },
  "records": [ { "externalId": "OH-FRANKLIN:booking:2024-00731", "...": "..." } ],
  "coverage": {
    "geography": {
      "asked": { "zip": "43215", "radiusMiles": 25 },
      "recordKinds": ["court", "jail-roster"],
      "sourcesSearched": 7,
      "jurisdictionsSearched": [
        { "code": "OH-FRANKLIN", "name": "Franklin County, OH", "kind": "county",
          "recordKinds": ["court", "jail-roster"], "counties": ["Franklin County, OH"] },
        { "code": "OH-DELAWARE", "name": "Delaware County, OH", "kind": "county",
          "recordKinds": ["jail-roster"], "counties": ["Delaware County, OH"] },
        { "code": "OH-COURT", "name": "Ohio — statewide court records", "kind": "statewide",
          "recordKinds": ["court"], "counties": [] }
      ],
      "counties": [
        { "fips": "39049", "name": "Franklin County", "state": "OH", "sources": ["OH-FRANKLIN", "OH-FRANKLIN-JAIL"] },
        { "fips": "39041", "name": "Delaware County", "state": "OH", "sources": ["OH-DELAWARE"] },
        { "fips": "39097", "name": "Madison County", "state": "OH", "sources": [] }
      ],
      "countiesWithoutSource": [ { "fips": "39097", "name": "Madison County", "state": "OH" } ]
    }
  }
}
  • ZIP 43215 is in Franklin County; 25 miles from its center reaches Delaware, Madison and Pickaway counties.
  • Madison County has no jail or court source of its own, so it is listed in countiesWithoutSource: only the Ohio statewide and federal sources stood behind the answer there.
  • filteredOut.sources: 2 are records for the same name from sources outside the area, counted rather than hidden.

The SearchGeography object — search a place in your own words

A place, in the customer's words. Send at least one of county, zip, city with state, or states; they combine. A place that matches no county is 422 unknown_geography; a malformed one is 422 invalid_geography.

Returned or accepted by POST /v1/criminal/search.

FieldTypeDescription
county
optional
stringA five-digit county FIPS code ("39049") or "ST:County name" ("OH:Franklin").
Example "OH:Franklin"
zip
optional
stringA five-digit ZIP code. Every county the ZIP touches is included.
Example "43215"
radiusMiles
optional
number0 to 100. Also include the counties whose center lies within this many miles of the zip, county or city counties' centers.
Example 25
city
optional
stringA city or town; needs state. Every county the city spans is included.
Example "Columbus"
state
optional
stringTwo-letter state for city.
Example "OH"
states
optional
array of stringWhole states, up to 10, two-letter codes.
Example ["OH"]

The SearchCoverageRequest object — how far back

The request's coverage block.

Returned or accepted by POST /v1/criminal/search.

FieldTypeDescription
yearsBack
optional
integer1 to 100. Keep only sources whose stated window reaches at least this many years back.
Example 7

The GeographyCoverage object — what stood behind a place search

coverage.geography on a search that sends geography, recordKinds or coverage: what stood behind the answer, in names, and what did not.

Returned or accepted by POST /v1/criminal/search, GET /v1/criminal/searches/{searchId}, POST /v1/criminal/batch.

FieldTypeDescription
asked
objectThe geography as sent.
recordKinds
array of string or "all"The record kinds searched, or "all".
sourcesSearched
integerHow many sources were in scope.
jurisdictionsSearched
array of objectEvery source in scope. Present with geography.
jurisdictionsSearched[].code
stringPublic jurisdiction code.
Example "OH-FRANKLIN"
jurisdictionsSearched[].name
stringJurisdiction label.
Example "Franklin County, OH"
jurisdictionsSearched[].kind
string
one of "county", "city", "regional", "statewide", "federal"
The source's geography kind.
jurisdictionsSearched[].recordKinds
array of stringThe kinds of record it holds.
jurisdictionsSearched[].counties
array of stringThe asked counties this source covers, by name. Empty for statewide and federal sources.
Example ["Franklin County, OH"]
counties
array of objectEvery county in the asked area and the county-level sources that cover it.
counties[].fips
stringCounty FIPS code.
Example "39049"
counties[].name
stringCounty name.
Example "Franklin County"
counties[].state
stringTwo-letter state.
Example "OH"
counties[].sources
array of stringIts county, city and regional sources searched.
Example ["OH-FRANKLIN"]
countiesWithoutSource
array of objectAsked counties with no county, city or regional source of the asked record kinds; only the statewide and federal sources searched cover them.
countiesWithoutSource[].fips
stringCounty FIPS code.
Example "39097"
countiesWithoutSource[].name
stringCounty name.
Example "Madison County"
countiesWithoutSource[].state
stringTwo-letter state.
Example "OH"
countiesNote
stringWhat countiesWithoutSource means, in one sentence.
yearsBack
objectPresent when the request sends coverage.yearsBack.
yearsBack.asked
integerThe years asked.
Example 7
yearsBack.droppedShorterWindow
array of objectSources not searched because their stated window is shorter than asked.
yearsBack.droppedShorterWindow[].code
stringPublic jurisdiction code.
yearsBack.droppedShorterWindow[].name
stringJurisdiction label.
yearsBack.droppedShorterWindow[].yearsBack
integerThe source's stated window.
yearsBack.unknownWindow
integerSources searched that state no window.
yearsBack.note
stringHow the window was applied.

Product overview