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.appSearch 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.
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:
| Layer | Sources searched | Notes |
|---|---|---|
| Local | The 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. |
| State | Each 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. |
| Federal | Federal 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
| geography | Example | Covers |
|---|---|---|
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 send | What happens |
|---|---|
| Several place fields | They combine: the area is every county any of them names. |
recordKinds | jail-roster, court, doc-inmate (prison), registry, warrant, exclusion. Applies to all three layers; works with or without geography. |
coverage.yearsBack | A 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 well | Both must hold. appliedFilters echoes only what you sent. |
No geography | Every 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.jurisdictions | Checks 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:
| Field | What it tells you |
|---|---|
jurisdictionsSearched | Every source searched, with its kind and the asked counties it covers, by name. |
counties | Every county in the area and its local sources. |
countiesWithoutSource | Asked 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. |
sourcesSearched | How many sources were in scope. |
yearsBack | With 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.
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"]
}'{
"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: 2are 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.
| Field | Type | Description |
|---|---|---|
| county optional | string | A five-digit county FIPS code ("39049") or "ST:County name" ("OH:Franklin").Example "OH:Franklin" |
| zip optional | string | A five-digit ZIP code. Every county the ZIP touches is included. Example "43215" |
| radiusMiles optional | number | 0 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 | string | A city or town; needs state. Every county the city spans is included.Example "Columbus" |
| state optional | string | Two-letter state for city.Example "OH" |
| states optional | array of string | Whole 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.
| Field | Type | Description |
|---|---|---|
| yearsBack optional | integer | 1 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.
| Field | Type | Description |
|---|---|---|
| asked | object | The geography as sent. |
| recordKinds | array of string or "all" | The record kinds searched, or "all". |
| sourcesSearched | integer | How many sources were in scope. |
| jurisdictionsSearched | array of object | Every source in scope. Present with geography. |
| jurisdictionsSearched[].code | string | Public jurisdiction code. Example "OH-FRANKLIN" |
| jurisdictionsSearched[].name | string | Jurisdiction label. Example "Franklin County, OH" |
| jurisdictionsSearched[].kind | string one of "county", "city", "regional", "statewide", "federal" | The source's geography kind. |
| jurisdictionsSearched[].recordKinds | array of string | The kinds of record it holds. |
| jurisdictionsSearched[].counties | array of string | The asked counties this source covers, by name. Empty for statewide and federal sources. Example ["Franklin County, OH"] |
| counties | array of object | Every county in the asked area and the county-level sources that cover it. |
| counties[].fips | string | County FIPS code. Example "39049" |
| counties[].name | string | County name. Example "Franklin County" |
| counties[].state | string | Two-letter state. Example "OH" |
| counties[].sources | array of string | Its county, city and regional sources searched. Example ["OH-FRANKLIN"] |
| countiesWithoutSource | array of object | Asked counties with no county, city or regional source of the asked record kinds; only the statewide and federal sources searched cover them. |
| countiesWithoutSource[].fips | string | County FIPS code. Example "39097" |
| countiesWithoutSource[].name | string | County name. Example "Madison County" |
| countiesWithoutSource[].state | string | Two-letter state. Example "OH" |
| countiesNote | string | What countiesWithoutSource means, in one sentence. |
| yearsBack | object | Present when the request sends coverage.yearsBack. |
| yearsBack.asked | integer | The years asked. Example 7 |
| yearsBack.droppedShorterWindow | array of object | Sources not searched because their stated window is shorter than asked. |
| yearsBack.droppedShorterWindow[].code | string | Public jurisdiction code. |
| yearsBack.droppedShorterWindow[].name | string | Jurisdiction label. |
| yearsBack.droppedShorterWindow[].yearsBack | integer | The source's stated window. |
| yearsBack.unknownWindow | integer | Sources searched that state no window. |
| yearsBack.note | string | How the window was applied. |