---
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). 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.
  - `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' to check additional live sources and return aliases, locations, and stateData where available. Results with a partial or missing DOB may still appear, so the 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 — Unique identifier for this record.
    - `personUuid` string, uuid — Identifier used to connect known records for the same person.
    - `locationHistory` LocationHistoryEpisode[] — Available address history for this record. Returned by Sex Offender History only.
      - `address` string — Street address.
      - `addressFull` string — Full formatted address, when available.
      - `city` string
      - `state` string
      - `zipcode` string
      - `lat` number, double
      - `lng` number, double
      - `observedAt` string, date-time
      - `basis` 'source' | 'vendor' | 'legacy' | 'synthetic' — Address reference category: source means it came from a public registry record; vendor means an address reference; legacy means an earlier saved address record; synthetic means fake testing-key data.
    - `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 — Official registration start date, when published by the jurisdiction
      - `sourceModifiedAt` string — Official source-system modification value in the jurisdiction's native precision and format; not a registration, verification, conviction, release, or other offender business-event date
      - `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
        - `hullNumber` string — Official vessel hull identifier, when published by the jurisdiction
      - `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-09-01** `0c8be8ca6bda` — 2 info
  - added the optional property `offenders/items/locationHistory` to the response with the `200` status
  - added the optional property `offenders/items/personUuid` to the response with the `200` status
- **2026-08-29** `1a186f221867` — 2 info
  - added the optional property `offenders/items/stateData/sourceModifiedAt` to the response with the `200` status
  - added the optional property `offenders/items/stateData/vehicles/items/hullNumber` to the response with the `200` status
- **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/1c5e9b9dfb83?raw)
