---
title: "Search sex offender records with JSON body"
method: POST
path: "/sexoffender"
---

# Search sex offender records with JSON body

`POST /sexoffender`

Recommended production method. Send your API key in X-API-Key or Authorization: Bearer and send search fields in the JSON body. Send optional X-Request-Id for customer-side request correlation. The standard endpoint also remains compatible with key in the JSON body for existing clients.

## Headers

- `X-Request-Id` string

## Request body

- SearchRequest — JSON body for POST /sexoffender. Uses the same fields as the GET query parameters. At least one search field is required.
  - `key` string — Your API key (required). If using POST, you can send it in X-API-Key or Authorization: Bearer instead.
  - `firstName` string — First name of offender
  - `lastName` string — Last name of offender
  - `dob` string, date — Date of birth (YYYY-MM-DD). Matching respects source precision: exact records match the full date, year_month records match the same year and month, and year records match the same year. Regular indexed DOB searches exclude records with no stored DOB; unknown-precision records with a stored date match only that exact date. Structured full-name Extensive searches may retain no-DOB or unknown-precision safety-net candidates.
  - `city` string — Residence city
  - `state` string — Residence state (full name or 2-letter code)
  - `zipcode` string — Residence zip code
  - `address` string — Street 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.
  - `lat` number — Latitude for GIS radius search
  - `lng` number — Longitude for GIS radius search
  - `radius` number — Radius in miles for GIS search (default 1, max 100)
  - `mode` 'extensive' — Set to 'extensive' for live alias search, state-level enrichment, and additional response fields (aliases, locations, stateData). For structured full-name searches, Extensive can use additional live candidates and may retain missing or unknown DOB safety-net matches, so its result count can differ from Regular Search. +$0.05/call.
  - `fuzzy` boolean — Enable typo-tolerant fuzzy name matching for structured name fields. Handles spelling variations, partial first names, nicknames, aliases, and hyphenated surnames. Structured address searches are fuzzy by default and do not require this flag. +$0.02/call.
  - `q` string — Free-text search across names, aliases, address, city, and zip code. Use with fuzzy=true instead of firstName/lastName.
  - `prefixMatch` 'firstName' | 'lastName' — Enable prefix matching on the specified name field
  - `uuid` string — Pull a single record by UUID
  - `personUuid` string — Pull a single record by Person UUID
  - `faceId` string — Face ID from Facial Search API
  - `createdAtStart` string, date — Filter by first appearance in system (YYYY-MM-DD)
  - `createdAtEnd` string, date — Filter by first appearance in system (YYYY-MM-DD)
  - `updatedAtStart` string, date — Filter by last update in system (YYYY-MM-DD)
  - `updatedAtEnd` string, date — Filter by last update in system (YYYY-MM-DD)
  - `page` integer — Page number for GIS search pagination. Each page is billed as a separate API call.

## Response `200`

Successful search

- object
  - `offenders` Offender[]
    - `name` string — Full name
    - `firstName` string
    - `lastName` string
    - `middleName` string
    - `aliases` Alias[] — Known aliases (Extensive Mode only)
      - `prefix` string, nullable
      - `givenName` string
      - `middleName` string, nullable
      - `surName` string
      - `suffix` string, nullable
    - `dob` string, date-time, nullable — Normalized date of birth in UTC when available. Use dobPrecision to distinguish a full date from source-reported year-month, year-only, or unknown values.
    - `dobPrecision` 'exact' | 'year' | 'year_month' | 'unknown' — Source precision of the dob field: exact, year_month, year, or unknown.
    - `address` string
    - `city` string
    - `county` string — Residence county when available.
    - `state` string
    - `zipcode` string
    - `locations` Location[] — All official addresses (Extensive Mode only)
      - `type` string
      - `streetAddress` string
      - `city` string
      - `county` string
      - `state` string
      - `zipCode` string
      - `fromDate` string
      - `toDate` string
      - `latitude` number, double
      - `longitude` number, double
    - `sex` string
    - `age` string
    - `eyeColor` string
    - `hairColor` string
    - `height` string
    - `weight` string
    - `race` string
    - `ethnicity` string
    - `marks` string — Formatted tattoos, scars, and marks. Multiple source entries are newline-delimited.
    - `riskLevel` string
    - `crime` string — Newline-delimited public summaries derived from validated official offense records.
    - `content` string — Pre-formatted HTML summary when provided by the source response.
    - `registrationDate` string, date-time, nullable
    - `offenderUrl` string, uri — URL to source state registry page
    - `offenderImageUrl` string, uri — Profile image URL from state registry
    - `offenderImageUrlR2` string, uri — Cached profile image URL
    - `lat` number — Latitude (-1 if unknown)
    - `lng` number — Longitude (-1 if unknown)
    - `jurisdiction` string — State/jurisdiction code
    - `isAbsconder` boolean, nullable
    - `isPredator` boolean, nullable
    - `updatedAt` string, date-time
    - `createdAt` string, date-time, nullable
    - `uuid` string, uuid
    - `sources` Source[]
      - `id` string
      - `name` string
      - `url` string, uri
    - `stateData` StateData — Allowlisted jurisdiction-specific registry data (Extensive Mode only). Availability varies by jurisdiction. Repeated entities such as offenses and photos are object arrays; marks is one formatted string with multiple source entries newline-delimited.
      - `stateOffenderId` string
      - `status` string
      - `designation` string
      - `complianceStatus` string
      - `aliases` string[]
      - `initialRegistrationDate` string
      - `lastVerificationDate` string
      - `addressVerificationDate` string
      - `registrationEnds` string
      - `isLifetimeRegistration` boolean
      - `marks` string — Formatted scars, marks, and tattoos. Multiple source entries are newline-delimited.
      - `verificationRequirement` string
      - `lawAgency` string
      - `ethnicity` string
      - `incarcerationStatus` string
      - `school` string
      - `employer` string
      - `registrationStartDate` string
      - `registrationEndDate` string
      - `registrationDuration` string
      - `comments` string
      - `judgmentOfConvictionUrl` string, uri
      - `locations` Location[]
        - `type` string
        - `streetAddress` string
        - `city` string
        - `county` string
        - `state` string
        - `zipCode` string
        - `fromDate` string
        - `toDate` string
        - `latitude` number, double
        - `longitude` number, double
      - `offenses` object[]
        - `offense` string
        - `convictionDate` string
        - `releaseDate` string
        - `statute` string
        - `victimAge` string
        - `victimSex` string
        - `jurisdiction` string
        - `caseNumber` string
        - `adjudication` string
      - `vehicles` object[]
        - `type` string
        - `make` string
        - `model` string
        - `plate` string
        - `state` string
        - `color` string
        - `year` string
      - `photos` object[]
        - `photoId` string
        - `isCurrent` boolean
        - `datePosted` string
        - `date` string
        - `url` string, uri
      - `victimInfo` object[]
        - `gender` string
        - `sex` string
        - `age` string
        - `minor` boolean
        - `classification` string
        - `race` string
      - `criminalHistory` object[]
        - `offense` string
        - `date` string
        - `charge` string
        - `arrestDate` string
        - `disposition` string
        - `dispositionDate` string
  - `page` integer — Current page (GIS only)
  - `totalPages` integer — Total pages (GIS only)

## Other responses

- `400` — Bad request — missing or invalid parameters
- `401` — Unauthorized — missing or invalid API key
- `405` — Method not allowed

## Changes

- **2026-08-27** `53628c51d691` — 2 info
  - added the optional property `offenders/items/content` to the response with the `200` status
  - added the optional property `offenders/items/county` to the response with the `200` status
- **2026-08-26** `d4170c2a8abc` — 1 breaking, 5 warning, 31 info
  - the `offenders/items/stateData/photos/items/isCurrent` response's property type changed from `string` to `boolean` for status `200`
  - removed the optional property `offenders/items/locations/items/address` from the response with the `200` status
  - removed the optional property `offenders/items/locations/items/zipcode` from the response with the `200` status
  - removed the optional property `offenders/items/stateData/locations/items/address` from the response with the `200` status
  - …33 more

[Change history](https://skmtc.dev/offenders/apis/offenders-io-sex-offender-registry-api/changes/sexoffender/post.md)

---

[API](https://skmtc.dev/offenders/apis/offenders-io-sex-offender-registry-api.md) · [All operations](https://skmtc.dev/offenders/apis/offenders-io-sex-offender-registry-api/llms.txt) · [OpenAPI document](https://skmtc.dev/offenders/apis/offenders-io-sex-offender-registry-api/revisions/53628c51d691?raw)
