# Coverage today & the sources endpoint

> GET /v1/criminal/sources is the machine-readable source of truth for coverage, with per-jurisdiction currency. No API key required, so you can audit it first.

- **HTML:** https://offendersearch.app/docs/criminal/coverage
- **Base URL:** https://api.offendersearch.app
- **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

## Coverage today

Live today: the **statewide DOC (state-prison) systems** — searchable now across states, returning current inmate and corrections records. The **county jail and court layer is expanding**, added jurisdiction by jurisdiction, and the federal layer alongside it. The corpus is continuously updated.

> The authoritative, always-current answer to what is covered is the API itself, not this page. Read `GET /v1/criminal/sources` at integration rather than hard-coding a list — coverage grows over time.

## GET /v1/criminal/sources

The coverage catalog plus per-jurisdiction currency — the honest, public answer to "how current is your data?", one row per jurisdiction with the timestamp of its last update. **No API key required**, so you can check it before you buy and audit it afterwards. Each row names only a state and a record kind — never a portal or vendor.

```bash
curl "https://api.offendersearch.app/v1/criminal/sources"
```

```json
{
  "coverage": {
    "jurisdictions_total": 1410,
    "jurisdictions_live_connector": 727,
    "jurisdictions_pending_connector": 683,
    "states_covered": 50
  },
  "sources": [
    {
      "id": "TX-DALLAS",
      "name": "Dallas County, TX — County Jail Roster",
      "covers": ["TX"],
      "scope": "county",
      "status": "live",
      "health": { "lastSuccessAt": "2026-08-24T05:12:00+00:00",
                  "ageSeconds": 30074, "freshFor": ["daily", "weekly"] }
    }
  ],
  "count": 1410
}
```

| Key | Meaning |
| --- | --- |
| `sources[].id` | **Public** jurisdiction code — usable in `live.jurisdictions`. |
| `sources[].name` | A human jurisdiction label — county/state + record kind. **Never a portal or vendor name.** |
| `sources[].scope` | `county` \\| `state` \\| `federal`. |
| `sources[].status` | `live` (covered today) \\| `pending` (known, not yet covered). |
| `sources[].health.lastSuccessAt` | ISO-8601 of the last update. `null` = never ingested. |
| `sources[].health.ageSeconds` | Age of that snapshot right now, computed at request time. |

> **None of this is a filter.** A jurisdiction contributes its records to a cached search whatever its age says; freshness never withholds anything. Read this endpoint to *know* a jurisdiction's currency, not to predict which ones will answer.

---

## Related

- Previous: [Pagination & response size](https://offendersearch.app/docs/criminal/pagination.md)
- Next: [Jurisdictions & codes](https://offendersearch.app/docs/criminal/jurisdictions.md)
- Index: [Criminal Search API reference](https://offendersearch.app/docs/criminal.md)
