Sex Offender Search API
A single authenticated call searches nationwide sex-offender data — the 50 states, DC, and the territories — and returns scored, de-duplicated, source-tagged records. Synchronous for interactive checks; asynchronous for batch and high-volume work.
Base URL https://api.offendersearch.appIntroduction
The Offendersearch API is a REST API for national sex-offender screening. It provides nationwide sex-offender data behind one endpoint, offers full legacy field parity, and adds scored matches, per-source status, live re-verification, and consolidated verification reports. Every request is authenticated with an API key; every response is JSON.
- One call, nationwide. Omit
jurisdictionsto search the full dataset, or name a subset. Nickname-aware name search, date-of-birth and age match-states, and a lat/lng radius search are all built in. - One normalized schema across 58 jurisdictions. Every match is a 76-field superset — full legacy field parity plus a 34-field extensive
stateDatablock (registration status, compliance, verification dates, restrictions, and more) viainclude: ["stateData"]. - Per-source status on every response.
sourceStatus[]reports every jurisdiction the request touched, individually — so an incomplete search is always labelled as one, never returned as a silently short list. - Labelled match strength.
matchStateisdob_match,year_match,age_matchorno_dob_age_yearon every record, so you set your own confidence threshold rather than inherit one. - Provenance built in. Every record carries source provenance with a
lastCheckedAt, and any search can be re-verified live per request. - Additive contract. New data (e.g. criminal records) lands as a new
recordType— the response shape never breaks. - Machine-readable spec. The full OpenAPI document is published at
/openapi.jsonand/openapi.yaml— generate a client from it rather than hand-writing types. It is the same spec these pages are written against.
Your first call
Create a key in your dashboard, export it, and search. Passing jurisdictions: null — or omitting it — searches the full dataset at once. Then read status, counts, and each record’s matchState. The full walkthrough is on Quickstart.
curl https://api.offendersearch.app/v1/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": {
"firstName": "John",
"lastName": "Doe",
"dob": "1980-04-12"
},
"jurisdictions": null,
"match": "balanced",
"include": ["stateData"]
}'Documentation
Each section below is its own page, with its own worked examples, and its own markdown alternate at /docs/{section}.md.
Your first authenticated search in three languages, and the four fields to read off every response.
Authentication, keys & securityThe X-API-Key header, key lifecycle and rotation, and the security posture behind the API.
Errors, status codes & rate limitsEvery status code, the stable error envelope, the rate-limit headers, and how to back off.
The primary endpoint. Every parameter, the four stages of a search, and nine worked query shapes.
POST /v1/searchMatching, confidence & partial namesMatch modes, the closed strategy vocabulary, confidence ceilings, and partial-name search.
Searching by date of birthLabelled match strength on every record, and how dob, birthYear and dobPrecision fit together.
Result completeness & per-source statusAn incomplete search is labelled, never silently empty. counts, sourceStatus and incompleteReason.
Pagination & response sizeThe full result set in one response by default — plus page, perPage and totalPages when you want slices.
Regular & Live modes, and source coverageTwo modes — Regular (continuously updated) and Live — per-record lastCheckedAt, and the live coverage catalog.
GET /v1/sourcesJurisdictions & codesEvery jurisdiction code, and the difference between scoping a search and filtering a result.
One normalized 76-field schema across every jurisdiction, and how to read its empty values.
GET /v1/records/{recordId}Verification reportsA timestamped PDF of a search you already ran, with a source citation on every record.
POST /v1/reportMigrating from another providerA drop-in compatibility endpoint, the full legacy parameter map, and what /v1/search adds.
POST /v1/compat/sexoffenderEndpoint index
Every public endpoint, and the page that documents it in full with parameters, examples and response shapes.
| Method | Path | What it does |
|---|---|---|
| POST | /v1/search | Synchronous search across every jurisdiction, scored and de-duplicated. |
| POST | /v1/searches | Asynchronous search — submit now, collect by polling or webhook. |
| GET | /v1/searches/{searchId} | Status and results of an asynchronous search. |
| POST | /v1/batch | Up to 1000 queries in one call, JSON or CSV, results in input order. |
| POST | /v1/report | A consolidated, timestamped PDF of a search you already ran. |
| GET | /v1/records/{recordId} | Fetch a single normalized record by id. |
| GET | /v1/sources | The live coverage catalog with per-jurisdiction health. |
| POST | /v1/compat/sexoffender | Drop-in compatibility endpoint returning the legacy envelope. |
Machine-readable documentation
These docs are published for automated consumption as well as for people. Every page has a markdown alternate, and the API has a published OpenAPI definition in both serialisations from a single source, so they cannot drift.
| URL | Media type | What it is |
|---|---|---|
| /docs.md | text/markdown | The complete documentation as one markdown document. |
| /docs/{section}.md | text/markdown | Any single section as markdown, e.g. /docs/search.md. |
| /openapi.json | application/json | The OpenAPI definition, for SDK and MCP-server generators. |
| /openapi.yaml | application/yaml | The same definition, YAML serialisation. |
| /.well-known/api-catalog | application/linkset+json | RFC 9727 API catalog linking the definition and this documentation. |