Service Status: All Systems Operational — Safeguarded by our multi-cloud infrastructure.
📄 Download PDF Version
The PDF guide includes additional details, diagrams, and examples not covered on this page.
🔗 Download OpenAPI Spec
Import into Postman, Swagger UI, or any OpenAPI-compatible tool.

Unlike competitors with weekly updates, our Sex Offender Registry API features real-time 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.

All Systems Operational
Uptime: Avg Response:
On This Page
🏥 Healthcare & HIPAA Compliance

The standard endpoint is not intended for PHI/ePHI workflows. Approved Enterprise HIPAA/BAA workflows use a dedicated account-enabled access path with header authentication and require an executed Business Associate Agreement (BAA). Contact us for details.

FCRA-Regulated Workflows

Standard API access is not intended for FCRA-regulated workflows. Approved CRA and Enterprise partners use dedicated, separately enabled access under a written agreement, approved business verification and permissible purpose, and agreed scope. Contact us for details.

Base URL

https://api.offenders.io/sexoffender

Authentication

For quick demos, pass your API key as a query parameter key.

GET /sexoffender?key={YOUR_API_KEY}&firstName=Alice
Tip: use POST with header authentication in production

Send your API key in X-API-Key or Authorization: Bearer, and send search fields in a JSON body. This keeps credentials and search parameters out of browser history, referrers, screenshots, and many logging systems.

POST /sexoffender
Content-Type: application/json
X-API-Key: {YOUR_API_KEY}
X-Request-Id: 550e8400-e29b-41d4-a716-446655440000

{
  "firstName": "Alice",
  "lastName": "Smith"
}

The same fields listed in Query Parameters can be sent as JSON properties in POST requests. For compatibility, the standard endpoint also accepts key in the JSON body; the production example above uses headers. GET requests remain supported for demos and compatibility. Approved Enterprise HIPAA/BAA workflows see a separate documented path with a JSON body. Contact us for details.

Get a free API key and start with 50 free requests each month.

💡 Using an AI assistant? You can also access full records via our MCP server with the same API key — no code needed.

Request IDs

For production troubleshooting, send an optional X-Request-Id request header with a unique opaque ID from your system. Use a UUID or similar correlation ID; do not include names, email addresses, dates of birth, member IDs, patient IDs, search values, or other sensitive data. Values may contain letters, numbers, ., _, :, and -, up to 64 characters.

X-Request-Id: 550e8400-e29b-41d4-a716-446655440000

The API returns X-Offenders-Request-Id as the Offenders.io-generated request ID on every response. If you send X-Request-Id, the response X-Request-Id echoes your value; otherwise it mirrors the Offenders.io request ID. Include both IDs in support tickets when available. If your client times out before receiving response headers, provide the X-Request-Id you sent plus the exact UTC timestamp.

Continue from Search to History

Use a returned record uuid to retrieve History as JSON or download a printable PDF report. Both endpoints are available to all API accounts. See the Sex Offender History API documentation.

Search Modes

Regular Search

Targeted lookups by name, DOB, address, zip code, or any combination. Structured address searches use fuzzy address matching by default and are billed at the fuzzy search rate. At least one query param is required.

When you include a DOB, Regular Search matches exact records by full date, year_month records by year and month, and year records by year. Records with no stored DOB are not returned. A record with unknown precision but a stored date must match the full date.

GET /sexoffender?key={KEY}&firstName=Alice&zipcode=12345

Extensive Mode +$0.05/call

Add &mode=extensive to a full-name search to check additional live registry sources and return more jurisdiction data where available. Send firstName and lastName; you can also add other supported fields to narrow the results.

If you include a DOB, results with a full stored date must match it. Results with a partial or missing DOB may still appear as possible matches. Because Extensive Mode also checks additional live sources and name variations, it may return a different number of results than Regular Search.

GET /sexoffender?key={KEY}&firstName=Alice&lastName=Smith&mode=extensive

⚠ Slower response (~2s+). Has rate limit — not for batch processing.

GIS / Geospatial Search

Find offenders within a radius of any GPS coordinate with native geospatial search. Can combine with name/city filters. GIS search includes automatic failover to secondary infrastructure for high availability.

GET /sexoffender?key={KEY}&lat=30.967&lng=-91.116&radius=2&page=1

Fuzzy Matching +$0.02/call

Add &fuzzy=true to a name search to enable typo-tolerant matching. Structured address searches are fuzzy by default. Fuzzy matching is generally available, billed at +$0.02 per fuzzy call, and works with or without mode=extensive. It runs on a dedicated search cluster separate from the primary API, providing additional geo-redundancy and infrastructure redundancy. Choose the request shape that matches your input.

Example Matches

These examples illustrate records that may match. Actual results depend on the registry data indexed for each person and any additional filters you send.

Search inputMay matchWhy
Jon SmythJohn SmithOne spelling edit in each name
Rob JohnsonRobert JohnsonPartial or prefix first name
Bob SmithRobert SmithWhen Bob is present in the record's nickname or alias index
Alex Smith JohnsonAlex Smith-JohnsonHyphenated or space-separated surname variants
123 Main Dr123 Main DriveCommon street-suffix abbreviations in structured address search

Structured Name Search (firstName / lastName)

Best when name fields are separate. fuzzy=true applies to either provided name field, but a structured search requires at least two search parameters overall. For example, send both firstName and lastName, or combine one name with state, zipcode, dob, or GIS coordinates. Each provided name is matched against the correct field for more precise results.

GET /sexoffender?key={KEY}&firstName=Jon&lastName=Smyth&fuzzy=true

Free-Text Search (q)

Best when you have a single combined name string, or want to search across names and addresses together. Searches across first name, last name, aliases, address, city, and zip code in one query.

GET /sexoffender?key={KEY}&q=John+Smith+San+Francisco&fuzzy=true

Structured Address Search (address)

Best when you have street-address fields separate from names. The address parameter is fuzzy by default, handles common street suffix abbreviations, can be combined with city, state, zipcode, and dob filters, and is billed at the fuzzy search rate. Use either q or address, not both; address also cannot be combined with lat/lng GIS coordinates.

GET /sexoffender?key={KEY}&address=123+Main+St&state=CA

Query Parameters

ParameterTypeDescriptionExample
keystringYour API key (required). If using POST, you can send it in X-API-Key or Authorization: Bearer instead.YOUR_API_KEY
firstNamestringFirst name of offenderAlice
lastNamestringLast name of offenderSmith
dobstringDate of birth (YYYY-MM-DD). Regular Search matches exact records by full date, year_month records by year and month, and year records by year. Records with no stored DOB are excluded. A record with unknown precision but a stored date must match the full date. Extensive Mode may also return possible matches with a partial or missing DOB.1990-01-15
citystringResidence citySan Francisco
statestringResidence state (full name or 2-letter code)CA
zipcodestringResidence zip code94104
addressstringStreet address search. Fuzzy by default; supports common address abbreviations and is billed at the fuzzy search rate (+$0.02/call). Do not combine with q or lat/lng. If combined with mode=extensive, also send firstName and lastName so enriched name results can be filtered by address.123 Main St
latnumberLatitude (GIS search)30.967
lngnumberLongitude (GIS search)-91.116
radiusnumberRadius in miles (default 1, max 100)5
modestringSet to extensive to check additional live sources and return aliases and state-level data where available. Results with a partial or missing DOB may still appear, so the result count can differ from Regular Search (+$0.05/call)extensive
fuzzybooleanEnable typo-tolerant fuzzy matching (+$0.02/call)true
qstringFree-text search across names, aliases, address, city, and zip code. Use with fuzzy=true instead of firstName/lastName.John Smith San Francisco
prefixMatchstringPrefix match on firstName or lastNamefirstName
createdAtStartstringFilter by when a record was first added to Offenders.io. Use this for new-record alerts.2026-01-01
createdAtEndstringEnd of the date range for when a record was first added to Offenders.io2026-01-31
updatedAtStartstringFilter by last update in system2026-01-01
updatedAtEndstringFilter by last update in system2026-01-31
faceIdstringFace ID from Facial Search API4d8ade05...
uuidstringPull single record by UUID807ff46d...
personUuidstringPull single record by Person UUID83425e56...
pagenumberPage number for GIS search pagination. Each page is billed as a separate API call.3

Response Fields

Each offender object in the offenders array contains:

FieldTypeDescriptionExampleEmpty
namestringFull name including middle name"JOHN M DOE"""
firstNamestringFirst name"JOHN"""
middleNamestringMiddle name"MICHAEL"""
lastNamestringLast name"DOE"""
aliasesarrayKnown aliases (Extensive Mode only)[{"givenName":"JAY","surName":"DOE"}][]
dobISO dateNormalized date of birth in UTC when available. Use dobPrecision to distinguish a full date from source-reported year-month, year-only, or unknown values."1990-01-15T00:00:00.000Z"null
dobPrecisionstringSource precision of dob: exact, year_month, year, or unknown."exact""unknown"
addressstringResidence street address"123 MAIN ST"""
citystringResidence city"RICHMOND"""
statestringResidence state (full name)"Virginia"""
zipcodestringResidence zip code"23219"""
countystringResidence county"RICHMOND CITY"""
locationsarrayAll official addresses (Extensive Mode only)see Location Object[]
sexstringRegistered sex"Male"""
agestringAge"35"""
eyeColorstringEye color"Brown"""
hairColorstringHair color"Black"""
heightstringHeight"5 ft 10 in"""
weightstringWeight"180 lbs."""
racestringRace"White"""
ethnicitystringEthnicity"Non-Hispanic"""
marksstringFormatted marks, tattoos, and scars; multiple source entries are newline-delimited"TAT R ARM\nSC L KNEE"""
riskLevelstringRisk level"Tier 3"""
crimestringNewline-delimited public summaries derived from validated official offense records"SEXUAL ASSAULT\nINDECENT EXPOSURE"""
registrationDateISO dateDate first registered"2005-03-01T00:00:00.000Z"null
offenderUrlstringURL to source state agency page"https://example.gov/offender/123"null
offenderImageUrlstringProfile image URL"https://example.gov/photo/123"null
latnumberLatitude of address37.5407-1
lngnumberLongitude of address-77.4360-1
jurisdictionstringJurisdiction code (e.g. CA, WV)"VA"null
isAbsconderbooleanKnown absconder statusfalsenull
isPredatorbooleanClassified as sexual predator or sexually violent offendertruenull
offenderImageUrlR2stringCDN-hosted profile image URL (faster, more reliable)"https://img.offenders.io/photo/abc123.jpg"null
createdAtISO dateWhen this record was recorded in Offenders.io; not a registration or move date"2025-06-15T08:30:00.000Z"null
updatedAtISO dateLast update timestamp"2026-03-31T12:00:00.000Z"null
uuidstringUnique record identifier"807ff46d-1234-5678-9abc-def012345678"""
personUuidstringIdentifier used to connect known records for the same person"83425e56-2c6e-5e90-a86f-d4e607a39c85"""
locationHistoryarrayAvailable address history for this record (History endpoint only)[{"address":"123 MAIN ST","observedAt":"2026-01-01T00:00:00.000Z"}][]
contentstringPre-formatted HTML summary""
sourcesarrayData source references[{"id":"nsopw","name":"NSOPW"}][]
pagenumberCurrent page (GIS only)11
totalPagesnumberTotal pages (GIS only)31
stateDataobjectState agency enriched data (Extensive Mode only)see stateData Schemanull

stateData Schema

The stateData object contains structured, jurisdiction-specific data verified in realtime against authoritative sources where supported. Search coverage includes 184 U.S. registry jurisdictions spanning all 50 states, DC, U.S. territories, and tribal jurisdictions; stateData availability and fields vary by jurisdiction. Repeated entities such as offenses and photos are object arrays. marks remains one formatted string, with multiple source entries separated by newlines.

FieldTypeDescriptionExample
stateOffenderIdstringState registry ID"SO-123456"
statusstringRegistration status"Active", "Incarcerated"
designationstringOffender classification"Sexually Violent Offender"
complianceStatusstringRegistration compliance"COMPLIANT", "NON-COMPLIANT"
offensesarrayCriminal convictions (see Offense Object below)see below
aliasesarrayKnown aliases["JOHN DOE", "J DOE"]
locationsarrayOfficial addresses (see Location Object below)see below
vehiclesarrayRegistered vehicles; a vessel may include hullNumber[{"plate":"ABC1234","make":"Toyota","model":"Camry","year":"2015","color":"White"},{"hullNumber":"HIN123456789"}]
victimInfoarrayVictim information[{"gender":"Female","minor":true}]
initialRegistrationDatestringFirst registration date"2000-12-19"
registrationEndsstringRegistration end date"2030-12-31"
isLifetimeRegistrationbooleanLifetime registration flagtrue
lastVerificationDatestringLast verification date"2025-02-20"
addressVerificationDatestringLast address verification"2025-02-20"
judgmentOfConvictionUrlstringRegistry-hosted judgment of conviction PDF URL, when provided by the jurisdiction"https://sexoffenders.ehawaii.gov/coveredoffender/resource/A3005425__QA.pdf"
marksstringFormatted scars, marks, and tattoos; multiple entries are newline-delimited"TAT R ARM\nSC L KNEE"
ethnicitystringEthnicity"Hispanic", "Non-Hispanic"
lawAgencystringSupervising law enforcement"HOUSTON POLICE DEPT"
incarcerationStatusstringIncarceration/supervision status"On Parole"
verificationRequirementstringVerification frequency"QUARTERLY"
employerstringEmployer information"ACME CORP, CHARLESTON WV"
schoolstringSchool attendance"STATE UNIVERSITY"
commentsstringAdditional notes from state registry"VICTIM WAS A 12 YR OLD FEMALE"
registrationStartDatestringRegistration start date"2005-03-01"
sourceModifiedAtstringOfficial source-system modification value in the jurisdiction's native precision and format; not a registration or other offender event date"2026-08-25"
registrationEndDatestringRegistration end date (if not lifetime)"2030-12-31"
registrationDurationstringRegistration duration"25 Years"
photosarrayOfficial jurisdiction photos; object fields may include url, date, photoId, isCurrent, and datePosted[{"url":"https://...","date":"2025-01-15"}]
criminalHistoryarrayFull criminal history entries[{"offense":"BURGLARY","date":"2010-05-01"}]

Offense Object

FieldTypeExample
offensestring"LEWD,LASCIVIOUS CHILD U/16"
convictionDatestring"07/02/1998"
releaseDatestring"12/27/2006"
statutestring"F.S. 800.04"
victimAgestring"16"
victimSexstring"Female"
jurisdictionstring"Miami-Dade, FL"
adjudicationstring"Adjudicated Guilty"
caseNumberstring"CR-2024-0001"

Location Object

FieldTypeExample
typestring"RESIDENTIAL", "WORK"
streetAddressstring"123 MAIN ST"
citystring"RICHMOND"
countystring"RICHMOND CITY"
statestring"VA"
zipCodestring"23221"
fromDatestring"05/19/2023"
toDatestring"08/01/2024"
latitudenumber40.7128
longitudenumber-74.0060

Field availability varies by jurisdiction. Not all fields are present for every record.

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",
      "dobPrecision": "exact",
      "address": "10000 San Francisco Way",
      "city": "San Francisco",
      "state": "California",
      "zipcode": "94104",
      "locations": [
        {
          "type": "R",
          "streetAddress": "10000 San Francisco Way",
          "city": "San Francisco",
          "county": "San Francisco",
          "state": "CA",
          "zipCode": "94104",
          "latitude": 50.12345,
          "longitude": -34.67890
        },
        {
          "type": "E",
          "streetAddress": "200 FL DRIVE",
          "city": "Miami",
          "county": "Miami-Dade",
          "state": "FL",
          "zipCode": "33129",
          "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)\ntattoo on l_arm (portrait)",
      "riskLevel": "2",
      "crime": "14:81 - Indecent Behavior with Juveniles\n314 - Indecent Exposure",
      "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",
      "personUuid": "83425e56-2c6e-5e90-a86f-d4e607a39c85",
      "stateData": {
        "stateOffenderId": "SO-123456",
        "status": "Active",
        "designation": "Sexually Violent Offender",
        "offenses": [
          {
            "offense": "AGGRAVATED SEXUAL BATTERY",
            "convictionDate": "11/04/1999",
            "statute": "18.2-67.3",
            "jurisdiction": "Richmond Circuit",
            "victimAge": "Unknown"
          }
        ],
        "aliases": ["JOHN A DOE", "JOHNNY DOE"],
        "marks": "TAT R ARM\nSC L KNEE",
        "photos": [{"url":"https://example.gov/photo/123","date":"2025-01-15"}],
        "initialRegistrationDate": "2000-12-19",
        "lastVerificationDate": "2026-02-20",
        "judgmentOfConvictionUrl": "https://sexoffenders.ehawaii.gov/coveredoffender/resource/A3005425__QA.pdf",
        "complianceStatus": "COMPLIANT",
        "isLifetimeRegistration": true,
        "incarcerationStatus": "On Parole",
        "lawAgency": "RICHMOND POLICE DEPT",
        "vehicles": [{"plate":"ABC1234","make":"Toyota","year":"2015"}],
        "victimInfo": [{"gender":"Female","minor":true}]
      }
    }
  ]
}

Result Limits

Need higher result limits?

Higher limits for name searches can be enabled at no extra cost. All results are returned in a single API call. Contact us to enable this for your account.

Error Handling

CodeMeaningExample Response
400Bad Request — missing, duplicate, too broad, or invalid parameters. Date parameters such as dob must be valid, non-future dates within the supported range.{"code":400,"message":"Invalid date format for 'dob' parameter"}
401Unauthorized — missing or invalid API key{"code":401,"message":"Missing API key"}
403Forbidden — the requested controlled-access capability is not enabled for the account{"code":403,"message":"Endpoint not enabled for this API key"}
405Method Not Allowed{"code":405,"message":"Method Not Allowed"}
503Service Unavailable — search infrastructure temporarily down. GIS and fuzzy searches automatically fall back to secondary infrastructure.{"offenders":[],"error":503}

When the error field is present in the response, results may be incomplete or empty. Your application should check for this field and handle accordingly.

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"

cURL (POST with Header Auth)

Use X-API-Key, or swap that header for Authorization: Bearer YOUR_KEY.

curl -X POST "https://api.offenders.io/sexoffender" \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-H "X-Request-Id: 550e8400-e29b-41d4-a716-446655440000" \
--data '{"firstName":"Alice","lastName":"Smith","fuzzy":true}'

# Bearer token form also works:
# -H "Authorization: Bearer YOUR_KEY"

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 →