# Search criminal records by place

> Search criminal records by county, ZIP code and radius, city or state, and by kind of record, without knowing jurisdiction codes. The answer names every jurisdiction searched.

- **HTML:** https://offendersearch.app/docs/criminal/search-by-place
- **Base URL (live):** https://api.offendersearch.app — live keys (`os_live_…`)
- **Base URL (sandbox):** https://sandbox.offendersearch.app — test keys (`os_test_…`), never billed; see https://offendersearch.app/docs/criminal/sandbox.md
- **Authentication:** `X-API-Key` request header
- **OpenAPI:** https://offendersearch.app/openapi.json · https://offendersearch.app/openapi.yaml
- **Criminal reference as markdown:** https://offendersearch.app/docs/criminal.md

## 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](https://offendersearch.app/docs/criminal/search.md); a search without them answers exactly as before, and it is billed like any other search.

```bash
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

| 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](/docs/criminal/async). |

Every other filter still applies on top: see [every way to narrow a criminal search](https://offendersearch.app/docs/criminal/filtering.md).

## 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](https://offendersearch.app/docs/criminal/coverage.md).

## 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.

```bash
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"]
      }'
```

```json
{
  "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`](https://offendersearch.app/docs/criminal/search#reference-post-v1-criminal-search).

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `county` | `string` | optional | A five-digit county FIPS code (`"39049"`) or `"ST:County name"` (`"OH:Franklin"`). Example `"OH:Franklin"`. |
| `zip` | `string` | optional | A five-digit ZIP code. Every county the ZIP touches is included. Example `"43215"`. |
| `radiusMiles` | `number` | optional | 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` | `string` | optional | A city or town; needs `state`. Every county the city spans is included. Example `"Columbus"`. |
| `state` | `string` | optional | Two-letter state for `city`. Example `"OH"`. |
| `states` | `array of string` | optional | 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`](https://offendersearch.app/docs/criminal/search#reference-post-v1-criminal-search).

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `yearsBack` | `integer` | optional | 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`](https://offendersearch.app/docs/criminal/search#reference-post-v1-criminal-search), [`GET /v1/criminal/searches/{searchId}`](https://offendersearch.app/docs/criminal/async#reference-get-v1-criminal-searches-searchid), [`POST /v1/criminal/batch`](https://offendersearch.app/docs/criminal/batch#reference-post-v1-criminal-batch).

| Field | Type | Default | 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. |

---

## Related

- Previous: [Filtering criminal searches](https://offendersearch.app/docs/criminal/filtering.md)
- Next: [Matching, confidence & partial names](https://offendersearch.app/docs/criminal/matching.md)
- Index: [Criminal Search API reference](https://offendersearch.app/docs/criminal.md)
