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 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.
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-02T21: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.