# Sex Offender API vs. Criminal Records API

> Two different datasets with two different questions. Most screening calls both.

- **HTML:** https://offendersearch.app/docs/products/sex-offender-vs-criminal
- **Base URL (live):** https://api.offendersearch.app — live keys (`os_live_…`)
- **Base URL (sandbox):** https://sandbox.offendersearch.app — test keys (`os_test_…`), never billed
- **Authentication:** `X-API-Key` request header
- **OpenAPI:** https://offendersearch.app/openapi.json · https://offendersearch.app/openapi.yaml
- **Docs index for agents:** https://offendersearch.app/llms.txt

## Side by side

|  | Sex Offender Search API | Criminal Records API |
| --- | --- | --- |
| Dataset | Public sex offender registries: every US state, DC, the territories, tribal registries. | Criminal records from jails, prisons (DOC), criminal courts, warrant systems, registries and exclusion lists the platform holds. |
| Answer | Registrants matching the person, with registration details, offenses, addresses and photographs where published. | Records of bookings, custody, cases, charges and dispositions matching the person, each tagged with its source and record type. |
| Completeness model | Every jurisdiction in scope is searched; `sourceStatus` says which finished. | Every stored record is read or the search is refused as too broad; live checks say which sources finished. |
| Key fields | `matchConfidence`, `matchState` (DOB tiers), `offenses[]`, `sources[]` | `matchConfidence`, `recordType`, `cases[].charges[]`, `currentStatus`, `sources[]` |
| Endpoint | `POST /v1/search` | `POST /v1/criminal/search` |
| Live re-check | `live.jurisdictions` or `live.scope: "matched"`; evidence PDFs with `live.evidence: "pdf"`. | `live.jurisdictions` or `live.scope: "matched"`. |

## When to call which

- Registry status is the question (visitor screening, admissions, volunteer checks): the **Sex Offender Search API**.
- Criminal history is the question (bookings, convictions, custody): the **Criminal Records API**.
- A person is being screened: **both**, then a Monitoring watch. A registrant may have no criminal record in the sources held, and a person with criminal records may not be a registrant.

**Sex offender**
```bash
curl -X POST https://api.offendersearch.app/v1/search \
  -H "X-API-Key: $OFFENDERSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": {"firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12"}}'
```

**Criminal**
```bash
curl -X POST https://api.offendersearch.app/v1/criminal/search \
  -H "X-API-Key: $OFFENDERSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": {"firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12", "state": "TX"}}'
```

## Related

- [Sex Offender Search API](https://offendersearch.app/docs/sex-offender)
- [Criminal Records API](https://offendersearch.app/docs/criminal)
- [Which API should I use?](https://offendersearch.app/docs/products/which-api)
