# Go-live checklist

> Ten checks between a working sandbox integration and production.

- **HTML:** https://offendersearch.app/docs/guides/sex-offender/go-live
- **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

## Checklist

1. Live key (`os_live_…`) in a secret store; base URL `https://api.offendersearch.app`; the test key removed from production config.
2. HTTP timeout ≥ 60 s; `429` waits `Retry-After`; `5xx` retried only on searches without a `live` block.
3. The `partial` branch is handled and never shown as "clear".
4. Candidates are tiered by `matchState` and `matchConfidence`; a human review step exists; nothing auto-declines.
5. Async `searchId` persisted on the `202` before anything else; polling or a webhook receiver in place.
6. `meterEvents[]` logged where a response carries it (criminal, live sources, documents) and usage reconciled against [Dashboard → Usage](/dashboard/usage); expected monthly volume checked against [pricing](/pricing).
7. The `legal.notice` respected: no employment, tenant, credit or insurance use.
8. Retention decided: what you store from a record and for how long; platform history is 14 days.
9. A BAA executed from the dashboard where your counsel requires one.
10. A Monitoring plan for screened people, if the answer must stay current.

## Related

- [Operations](https://offendersearch.app/docs/platform/operations)
- [Errors & rate limits](https://offendersearch.app/docs/errors)
