The Sex Offender Registry API
A sex offender registry API that searches 58 US registries — the 50 states, DC and the territories — in one request. Choose which registries to search, see which ones answered, and get back scored records that each cite the registry holding them.
25 free calls · No card · $0.15 a call, $0.11 past 2,000 a month
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"
}
}'What a sex offender registry API does
Sex offender registration in the United States is run jurisdiction by jurisdiction. Every state, the District of Columbia and each territory keeps its own registry, with its own website, its own search form and its own idea of which fields to publish. A person checking one name by hand has to decide which of those websites to visit, and a person who registered in another state is easy to miss.
A sex offender registry API replaces that with one HTTP request. You send a name and, when you have it, a date of birth. The API searches the registries in scope and returns structured records: who the person is, where they are registered, what they were convicted of, their photograph, and a link to the official registry entry. This page covers the registry side of that: scoping, completeness and how 58 registries that publish differently are made to read the same. For the request and field reference see the sex offender search API, and for the data itself the sex offender database.
Search 58 US registries with one API call
Leave jurisdictions out and the request searches all 58 registries. The response starts with counts, so the first thing your code learns is how many registries were asked and how many answered in full.
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"
}
}'Search one state registry, or any set of them
Pass a jurisdictions array of two-letter codes to search only those registries. The codes are the same ones every record returns in sources[].jurisdiction, so a value from one response can go straight into the next request. The full list is in the jurisdictions reference.
curl https://api.offendersearch.app/v1/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": { "firstName": "Maria", "lastName": "Lopez" },
"jurisdictions": ["TX", "NM"]
}'
# counts.sourcesQueried === 2
# counts.sourcesSkippedByScope === 56A registry scope is different from a residence filter. jurisdictions decides where the search looks. query.state keeps the search across all 58 registries and then filters the results to people who live in that state, which is what you want when a person may be registered somewhere other than where they live now.
Every response says which registries answered
“No records found” means two different things: nobody matched, or a registry did not answer. The API keeps them apart. Each registry in scope gets its own entry in sourceStatus, and the top-level status reads "complete" only when all of them finished. Details are in result completeness.
{
"status": "partial",
"counts": { "sourcesQueried": 58, "sourcesComplete": 56, "sourcesIncomplete": 2 },
"sourceStatus": [
{ "source": "NJ", "status": "ok", "matched": 4,
"incomplete": false, "incompleteReason": null },
{ "source": "TX", "status": "ok", "matched": 0,
"incomplete": true, "incompleteReason": "truncated" },
{ "source": "WA", "status": "error", "matched": 0,
"incomplete": true, "incompleteReason": "unavailable",
"note": "source did not complete for this request" }
],
"records": [ /* … */ ]
}| The registry question | Where the response answers it | What it tells you |
|---|---|---|
| Which registries were searched? | counts.sourcesQueried, counts.sourcesSkippedByScope | All 58 unless you pass a jurisdictions list; the counts say exactly how many were in scope. |
| Did each registry answer in full? | sourceStatus[], counts.sourcesComplete, counts.sourcesIncomplete | One entry per registry with its own status. A registry that did not finish is named, with a reason. |
| Which registry holds this person? | sources[].jurisdiction, sources[].registryName | Every record names each registry it appears on. One person on three registries is one record with three sources. |
| Where is the official entry? | sources[].recordUrl | The registry’s own page for that registrant, so a reviewer can confirm the match at the registry itself. |
| How current is this registry’s answer? | sources[].lastCheckedAt | A timestamp per record and per registry, rather than one blanket statement for the whole dataset. |
What a registry record contains
One schema for all 58 registries. Fields a registry does not publish come back empty rather than guessed, and the record object reference documents every field and what an empty value means.
| Field | What it holds |
|---|---|
name, aliases | The registered name, plus the aliases and nicknames the registry lists. |
dob, birthYear, age, dobPrecision | A full date of birth, a birth year or only an age — dobPrecision says which the registry publishes, so an age is never mistaken for a birth date. |
sex, race, ethnicity | Physical description as the registry states it. An empty string means the registry publishes no value for that field. |
addresses[] | Typed addresses — residence, employment, school and others — with coordinates where available. |
offenses[] | Offense description, statute, conviction date, conviction county and case number where the registry publishes them. |
images[] | The registry photographs, returned on every response. |
flags.absconder, flags.predator | True, false, or null where the registry does not publish the flag — null is not the same as false. |
housingStatus | Housed, homeless or incarcerated, in one field, where the registry states it. |
registrationDate | When the person registered, or null where the registry publishes no such date. |
stateData | The registry-specific extras — vehicles, professional licenses and more — returned when you ask with include. |
sources[] | Per registry: jurisdiction code, registry name, the permanent record link and lastCheckedAt. |
matchConfidence, matchState, matchBasis | How strong the match is, how the date of birth verified, and which fields matched and how. |
How registry matches are scored
A common name returns many registrants. What separates them is the date of birth, and registries publish it at different precision. matchState reports exactly how the date you sent compared with what the registry publishes, and matchConfidence turns the whole body of evidence into one number you can threshold on. More in matching and confidence and date of birth.
| matchState | What it means |
|---|---|
dob_match | The registry publishes a full date of birth and it equals the one you sent. The strongest identity evidence a registry record can give. |
year_match | The registry publishes only a birth year, and your date falls inside it. |
age_match | The registry publishes only an age, and your date is consistent with it. |
dob_mismatch | The registry publishes a date of birth that conflicts with yours. Shown so you can see why a same-name record was ruled out. |
no_dob_age_year | The registry publishes no date of birth, year or age for this person, so your date could not be checked. The record is kept on the name and flagged unverified. |
null | You did not send a date of birth or an age, so there was nothing to verify. The match rests on the name. |
Why state registries differ, and how the API handles it
Date of birth is not published the same way
Some registries publish a full date of birth, some a birth year, some only an age. The record carries dobPrecision and the match carries matchState, so a year-only registry never produces a false “exact” match.
Field coverage varies by registry
Vehicles, employer and school addresses, professional licenses and risk tiers are published by some registries and not others. An empty array means “none known”, never “none exists”, and the documentation lists the rate for each field.
One person can be on several registries
Someone who moved, works across a state line or was convicted elsewhere can hold several registrations. They come back as one record whose sources[] names each registry, instead of three near-duplicates to reconcile.
Names are written differently
Legal names, aliases, nicknames, hyphenation and spelling vary from registry to registry. Matching runs in strict, balanced or broad mode at the base price, and matchBasis tells you which strategy found the record.
Housing is stated in different places
One registry writes “homeless” on the address line, another uses a status code, a third puts it in a comment. housingStatus normalizes all of them into one field you can filter on.
A state filter is not a registry filter
query.state filters results to people who live in a state; jurisdictions chooses which registries are searched. Keeping them separate means an out-of-state registration still surfaces when you search by residence.
Sex offender registry APIs compared
The offenders.io column states what offenders.io publishes about itself. Where it publishes more — tribal jurisdictions, a recurring free tier, an availability SLA — the row says so. The full comparison is on Offendersearch vs offenders.io.
| Offendersearch | offenders.io | State registry websites | |
|---|---|---|---|
| Registries in one request | Searches 58 US registries — the 50 states, DC and the territories | Publishes 184 state, territory and tribal registry jurisdictions | One registry per website |
| Free usage | 25 free calls at sign-up, no card | First 50 requests free every month | Free to browse |
| Price per call | $0.15 for the first 2,000 a month, then $0.11 | $0.20 for the next 2,000 after the free 50, then $0.15 | No API to call |
| Which registries answered | sourceStatus names each registry that answered and each that did not | An errors array flags incomplete results | Not applicable |
| Match score | matchConfidence, matchBasis and matchState on every record | Not in their public API documentation | A list of names to read by eye |
| Name tolerance | Strict, balanced or broad matching, nicknames and aliases, at the base price | Fuzzy matching as a +$0.02 a call add-on | Varies by website |
| Batch | POST /v1/batch, up to 1,000 people per request, or a CSV in the dashboard | A CSV batch web tool, 10,000+ records per session | One search at a time |
| Monitoring | Person and address watches with alerts | A createdAtStart filter for building your own new-record alerts | Email alerts on some state websites |
| Availability SLA | Enterprise terms on request | Publishes a 99.9% availability SLA | None published |
More vendors, measured the same way: the best sex offender APIs in 2026, compared.
Sex offender registry API pricing
| First 25 calls | Free, no card required |
| Each search | $0.15, whether it searches one registry or all 58 |
| Past 2,000 calls in a month | $0.11 per call |
| Live re-verification | +$0.02 per registry you name, capped at $2.00 a search |
| Verification PDF | +$0.02 each |
| Seats, search minimums, contracts | None |
Worked out by monthly volume: background check API pricing. Full schedule: pricing.
Who builds on a sex offender registry API
Background screening companies
Add the registry layer to a report without maintaining 58 integrations of your own.
Property management
Check an applicant against the registries, and see who is registered around a listing.
Schools, childcare and youth programs
Screen staff, coaches and volunteers, and keep a cited record of each check.
Senior living and nursing homes
Run a registry check on every admission, with a date of birth so one resident means one answer.
Gig platforms and marketplaces
Check providers at sign-up and keep watching them with monitoring.
Dating and social apps
A registry check at sign-up or before two people meet in person.
Need criminal records as well as the registries? The offender search API covers both on one key.
Sex offender registry API: common questions
What is a sex offender registry API?
A sex offender registry API lets software search the public sex offender registries with an HTTP request instead of a person visiting each registry website. You send a name and, ideally, a date of birth; you get back structured records with the registry that holds each one, a link to the official entry and a match score.
Is there a national sex offender registry API?
Each US state, DC and territory runs its own registry, and there is no single official API that returns structured records across them. Offendersearch provides one: a single request searches 58 US registries and returns the results in one schema.
Which registries does the API search?
By default a request searches 58 US registries — the 50 states, DC and the US territories. Pass a jurisdictions list to search only some of them. The jurisdictions reference lists every code.
How do I search one state’s registry only?
Send "jurisdictions": ["TX"] with the query. The response confirms it: counts.sourcesQueried is 1 and counts.sourcesSkippedByScope is 57. To search all 58 registries but keep only people who live in Texas, use query.state instead.
How do I know a registry was actually searched?
Every response carries a sourceStatus entry for each registry in scope, and counts for how many completed. If a registry did not finish, the response status is "partial" and that registry is named with a reason, so an incomplete search is never mistaken for a clean result.
What does the sex offender registry API cost?
$0.15 per call for the first 2,000 calls in a month, then $0.11 per call. The first 25 calls are free with no payment method. There are no seats, search minimums or contracts.
Is there a free sex offender registry API?
The first 25 calls are free and need no card, which is enough to test real names against real registries. After that the API is metered per call.
How accurate are the matches?
Each record states its own evidence: matchState says whether the date of birth matched in full, by year or by age, and matchBasis lists the fields that matched and how. You set your own threshold on matchConfidence rather than trusting a yes or no.
Does the API return registry photographs?
Yes. Photographs the registries publish are returned in images[] on every response, along with aliases, addresses, offenses and physical description where the registry publishes them.
Can I check a whole list of names against the registries?
Yes. POST /v1/batch accepts up to 1,000 people per request as JSON or CSV and returns one scored result per row. The dashboard takes a CSV upload if you would rather not write code.
Can I get an alert when someone is added to a registry?
Yes. Monitoring watches a person or an address and sends an alert when a matching registration appears or changes. It runs on the same account and key.
Can I use registry results to make a hiring or tenant decision?
Results from the standard API are not a consumer report. A hiring or tenant decision is an FCRA-regulated use and runs through FCRA Partner Access, a separately enabled service for consumer reporting agencies and screening platforms under a written FCRA agreement.
The Offendersearch APIs
One account, one key, one bill — the sex offender registry and criminal records, side by side.
Sex offender registry
- Sex offender API — One call across 58 US sex offender registries, with scored matches and a citation on every record.
- Sex offender search API — Endpoints, request shapes, record fields, matching and batch, in detail.
- Sex offender database — The national registry data in one schema — photos, aliases, offenses, addresses.
- Registered offender database — What a registered offender record holds, and how its accuracy is measured.
- Bulk sex offender search — Screen a whole list of names in one upload or one API call.
- Offender search API — The registry search and the criminal search side by side, on one key.
Criminal records
- Criminal records API — County, state and federal records — jail, prison, court and warrant — through one API.
- Criminal background check API — One cited answer per person for onboarding and screening flows.
- Criminal search API — The search endpoint itself: parameters, record types and coverage, call by call.
- Court records API — Criminal court cases with charges and a disposition on each charge.
- Arrest records API — County jail bookings: booking date, custody status, facility and photo link.
- Inmate search API — State prison and county jail custody, with sentence, release and parole dates.
- Background check API — The registry and criminal layers together, on one key and one bill.
- Employment background check API — The registry and criminal data layer for HR, ATS and screening platforms.
- Employment screening API — The stages of a hiring pipeline, and where criminal and registry checks sit in it.
- Bulk criminal record search — Run a list of names against criminal records in one call.
- Statewide criminal search — One state at a time: prison, court and warrant systems that cover the whole state.
- Federal criminal records — Federal criminal records through the same API, and what a federal search covers.
Build with it
- API documentation — Quickstart, every endpoint, the record object and the OpenAPI spec.
- Sex offender map API — Clusters, pins and names for your own map, and the full record when one is opened.
- Background check API pricing — $0.15 a call, $0.11 past 2,000 a month, 25 free calls to start — worked out by volume.
- Background check API integration — Keys, the first call, async and webhooks, batch, monitoring and errors, step by step.
- Free background check API — 25 free calls on real data, no card — what is included and what comes after.
- Pay-as-you-go background check API — Per call, per report or subscription: the pricing models, with costs by volume.
- Background check API in Python — A working tutorial with requests: search, batch, async, errors and retries.
- Background check API in Node.js — A fetch client, response types, an Express webhook handler and retries.
- NSOPW API — Is there one? What exists, and a developer API for searching US registries.
- MCP server for offender search — Give Claude and other AI agents the same search as a tool.
- Integrations — Screening inside referral software — CarePort, ExtendedCare, Ensocare and Aidin.
- AI integration — Offender safety checks for AI agents and chatbots, with cited answers.
- Offendersearch vs offenders.io — A side-by-side comparison of the two registry APIs.
Screening and compliance
- Tenant background check — Screening applicants for a rental, and where an FCRA workflow is required.
- FCRA Partner Access — The FCRA workflow for hiring and tenant decisions — pricing by quote.
- FCRA-compliant background check data — Accuracy, disputes and permissible purpose for consumer reporting agencies.
- FCRA disputes API — Open, track and resolve a consumer dispute against a record.
- Sex offender monitoring — Watch a person or an address and get an alert when the registry changes.
- Tenant screening API — The registry and criminal layer for property software, with FCRA workflows for rental decisions.
- Non-FCRA background check API — What a public-records lookup may be used for, and when a decision needs FCRA instead.
Further reading
Independent comparisons of the tools in this category — including where other vendors are the better answer.
The best sex offender APIs in 2026, compared
Five ways to search US registries programmatically, measured on coverage you can enumerate, provenance, match quality and price.
The best criminal record search APIs in 2026
Jail bookings, prison custody, court cases and warrants are four different systems. Which API you want depends on which one your question needs.
The best background check APIs in 2026
Five brands, three companies: the consolidation nobody mentions, each vendor’s real published price, and the only per-call API on the list.
How to build a sex offender map with MapLibre
A developer tutorial with full code: clusters, pins, names and a record panel, built in free test mode.
More in our comparisons and research.
Search the registries from your own code today
25 free calls, no card, and a key that works the moment you create it. Your first request can search all 58 registries or just the one you care about.