The PDF guide includes additional details, diagrams, and examples not covered on this page.
Unlike competitors with weekly updates, our Sex Offender Registry API features daily updates, sub-200ms response times, and an exclusive 99.9% Uptime SLA, making it the reliable choice for background checks, security platforms, and public safety applications.
Base URL
Authentication
Pass your API key as a query parameter key on every request.
Get a free API key at offenders.io/pricing. First 50 requests/month are free.
💡 Using an AI assistant? You can also access full records via our MCP server with the same API key — no code needed.
Search Modes
Regular Search
Targeted lookups by name, DOB, address, zip code, or any combination. At least one query param is required.
Extensive Mode +$0.05/call
Add &mode=extensive to search through all known aliases on file. Ideal for state-compliance visitor screening (e.g. healthcare facilities).
⚠ Slower response (~2s+). Has rate limit — not for batch processing.
GIS / Geospatial Search EXCLUSIVE
Find offenders within a radius of any GPS coordinate. The only API with native geospatial search. Can combine with name/city filters.
Query Parameters
| Parameter | Type | Description | Example |
|---|---|---|---|
key | string | Your API key (required) | YOUR_API_KEY |
firstName | string | First name of offender | Alice |
lastName | string | Last name of offender | Smith |
dob | string | Date of birth | 1990-01-15 |
city | string | Residence city | San Francisco |
state | string | Residence state (full name) | California |
zipcode | string | Residence zip code | 94104 |
lat | number | Latitude (GIS search) | 30.967 |
lng | number | Longitude (GIS search) | -91.116 |
radius | number | Radius in miles (default 1, max 100) | 5 |
mode | string | Set to extensive for alias search | extensive |
prefixMatch | string | Prefix match on firstName or lastName | firstName |
createdAtStart | string | Filter by when the registrant first appeared in our system. Use this to create alerts for new offenders (e.g., new registrants in a zip code this month). | 2026-01-01 |
createdAtEnd | string | Filter by first appearance in system | 2026-01-31 |
updatedAtStart | string | Filter by last update in system | 2026-01-01 |
updatedAtEnd | string | Filter by last update in system | 2026-01-31 |
faceId | string | Face ID from Facial Search API | 4d8ade05... |
uuid | string | Pull single record by UUID | 807ff46d... |
personUuid | string | Pull single record by Person UUID | 83425e56... |
page | number | Page number (GIS search pagination) | 3 |
Response Fields
Each offender object in the offenders array contains:
| Field | Type | Description | Empty |
|---|---|---|---|
name | string | Full name including middle name | "" |
firstName | string | First name | "" |
lastName | string | Last name | "" |
aliases | array | Known aliases (Extensive Mode only) | [] |
dob | ISO date | Date of birth in UTC. Some states report year only (defaults to YYYY-01-01) | null |
address | string | Residence street address | "" |
city | string | Residence city | "" |
state | string | Residence state (full name) | "" |
zipcode | string | Residence zip code | "" |
locations | array | All official addresses (Extensive Mode only) | [] |
sex | string | Registered sex | "" |
age | string | Age | "" |
eyeColor | string | Eye color | "" |
hairColor | string | Hair color | "" |
height | string | Height | "" |
weight | string | Weight | "" |
race | string | Race | "" |
Ethnicity | string | Ethnicity | "" |
marks | string | Marks, tattoos, scars | "" |
riskLevel | string | Risk level | "" |
crime | string | Crimes committed for registration | "" |
registrationDate | ISO date | Date first registered | null |
offenderUrl | string | URL to source state agency page | null |
offenderImageUrl | string | Profile image URL | null |
lat | number | Latitude of address | -1 |
lng | number | Longitude of address | -1 |
jurisdiction | string | Jurisdiction code (e.g. CA, WV) | null |
isAbsconder | boolean | Known absconder status | null |
updatedAt | ISO date | Last update timestamp | null |
uuid | string | Unique record identifier | "" |
content | string | Pre-formatted HTML summary | "" |
sources | array | Data source references | [] |
page | number | Current page (GIS only) | 1 |
totalPages | number | Total pages (GIS only) | 1 |
stateData* | object | Raw state agency data (experimental) | null |
* Experimental fields are not guaranteed and may be removed without notice.
Full Example Response
//Response { "offenders": [ { "name": "First M Last", "firstName": "First", "firstName_nicknames": ["firsty", "firs", "1st"], "lastName": "Last", "aliases": [ { "prefix": null, "givenName": "FIR", "middleName": null, "surName": "ST", "suffix": null }, { "prefix": null, "givenName": "FIRST", "middleName": "M", "surName": "LA", "suffix": null }, { "prefix": null, "givenName": "FIRST", "middleName": "NONAME", "surName": "LAST", "suffix": null }, { "prefix": null, "givenName": "X", "middleName": null, "surName": "THE X", "suffix": null } ], "dob": "1900-10-01T00:00:00.000Z", "address": "10000 San Francisco Way", "city": "San Francisco", "state": "California", "zipcode": "94104", "locations": [ { "name": null, "type": "R", "streetAddress": "10000 San Francisco Way", "city": "San Francisco", "county": "California", "state": "CA", "zipCode": "94104", "zipCodeExtension": null, "latitude": 50.12345, "longitude": -34.67890 }, { "name": null, "type": "E", "streetAddress": "200 FL DRIVE", "city": "Miami", "county": "Miami-Daide", "state": "FL", "zipCode": "33129", "zipCodeExtension": null, "latitude": 34.67890, "longitude": -50.12345 } ], "sex": "Male", "age": "123", "offenderUrl": "https://meganslaw.ca.gov/OffenderDisplay.aspx?search...", "offenderImageUrl": "https://meganslaw.ca.gov/NSOPWPI.ashx?f=...&NSOPRFlag=True", "jurisdiction": "CA", "isAbsconder": false, "isPredator": true, "eyeColor": "Green", "hairColor": "Brown", "height": "5'11\"", "weight": "200 lbs.", "race": "White", "marks": "tattoo on r_arm (cross / cover the cross with tribal symbol); tattoo on l_arm (pic of a lady); tattoo on l_arm (something); ...", "riskLevel": "2", "crime": "Crime: 14:81 - Indecent Behavior with Juveniles; Juvenile victim, Conviction date: 2199-09-09, Jurisdiction: California", "registrationDate": "2012-12-31T00:00:00.000Z", "content": "<br><b>Zip Code: </b>94104<br><b>Sex: </b>Male<br><b>Age: </b>123...", "lat": 50.12345, "lng": -34.67890, "sources": [ { "name": "National Sex Offender Public Website", "id": "nsopw", "url": "https://www.nsopw.gov/" }, { "name": "New York State Division of Criminal Justice Services", "id": "criminaljustice.ny.gov", "url": "https://www.criminaljustice.ny.gov/" } ], "updatedAt": "2026-03-05T21:35:42.936Z", "uuid": "5893a310-37ce-58d8-b101-39e76a60e94a" } ] }
Result Limits
- Regular Search: 50 records max. Filter by city or zip for better results.
- GIS Search: Radius defaults to 1 mi (max 100 mi). 50 records per page — use
pageandtotalPagesto paginate.
Error Handling
| Code | Meaning | Example Response |
|---|---|---|
| 400 | Bad Request | {"error":"Invalid input params","reason":"no query params presented"} |
| 401 | Unauthorized — missing or invalid API key | {"code":401,"message":"Missing API key"} |
| 405 | Method Not Allowed |
Code Examples
JavaScript / Node.js
const res = await fetch( `https://api.offenders.io/sexoffender?key=${API_KEY}&zipcode=94104` ) const { offenders } = await res.json() console.log(offenders[0].name, offenders[0].city)
Python
import requests r = requests.get("https://api.offenders.io/sexoffender", params={ "key": API_KEY, "firstName": "Alice", "zipcode": "94104" }) offenders = r.json()["offenders"]
cURL
curl "https://api.offenders.io/sexoffender?key=YOUR_KEY&lat=30.967&lng=-91.116&radius=2"Batch Processing
Need to process thousands of records? Use our web-based batch tool at batch.offenders.io — upload a CSV with First Name, Last Name, and optional DOB. See the Batch Processing Guide for details.
Ready to integrate?
Get your free API key and start making calls in minutes — via REST API or MCP server.
Get Free API Key →