OffenderSearch
Alternative · drop-in compatible

The offenders.io alternative you can test this afternoon.

OffenderSearch searches 58 US registries; every result names its registry and carries lastCheckedAt. A compatibility endpoint speaks offenders.io’s request and response shape, so switching starts with one base URL — and the scored, per-source native API is there when you want it.

$0.15 per call · 25 free calls · No card · Compare first on OffenderSearch vs offenders.io

The one-line change from offenders.io to OffenderSearch

The compat endpoint mirrors the legacy parameters and envelope, so the change is the host and the key.

Compat diffPOST /v1/compat/sexoffender · unchanged envelope
- const BASE = "https://<your current provider>";+ const BASE = "https://api.offendersearch.app/v1/compat"; - headers: { /* your current auth header */ }+ headers: { "X-API-Key": process.env.OFFENDERSEARCH_KEY }   // request body and response parsing stay exactly as they are:  // { offenders, page, totalPages }
Native searchPOST /v1/search
curl -X POST https://api.offendersearch.app/v1/search \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": { "firstName": "John", "lastName": "Smith", "dob": "1980-04-12" },
        "match": "balanced" }'

What switching from offenders.io adds

A score and a reason on every match

matchConfidence, matchState and matchBasis say how much identity evidence a record carries and why it matched. A match score does not appear in offenders.io’s public API documentation, so today that judgment lives in your code.

Per-source completeness

sourceStatus names each of the 58 registries that answered and each that did not. offenders.io’s documentation describes an errors array that flags incomplete results.

Housing status

Homeless, incarcerated or housed, in one normalized field, where the registry states it. Not in offenders.io’s public API documentation.

Webhooks and monitoring

Async searches call your URL when they finish, and person and address monitors send signed alerts — no polling loop to build.

Lower cost per call at volume

$0.11 a call past 2,000 a month, with match tolerance and radius in the base call. The full price comparison is on OffenderSearch vs offenders.io.

A dashboard on the same account

No-code search, CSV screening, stored history and teammates, so compliance staff can work while engineering integrates.

Statements about offenders.io reflect its public site and API documentation, October 2026.

The switch

How to switch from offenders.io in four steps. Each step is reversible; compat stays up the whole time.

  1. 01

    Swap host and key

    Point at the compat endpoint and run your existing test suite unchanged.

    POST /v1/compat/sexoffender
  2. 02

    Shadow-read native

    Send the same query to native search and diff the record sets on each official registry link and jurisdiction.

    POST /v1/search
  3. 03

    Adopt the labels

    Branch on matchState for your auto-accept rule and on the incomplete-source count to separate no match from not determined.

    counts.sourcesIncomplete
  4. 04

    Cut over

    Move production traffic to native search; keep compat for any integration you have not migrated.

    both stay supported
Parameter map

How offenders.io request parameters map to OffenderSearch

The compatibility endpoint accepts these as they are. The native contract has a home for each one.

offenders.io parameterOffenderSearch /v1/searchNotes
firstName / lastNamequery.firstName / query.lastNameSame fields
dobquery.dobYYYY-MM-DD; raises matchConfidence
city / state / zipcodequery.city / query.state / query.zipcodeLocation filters
addressquery.addressStreet match
lat / lng / radiusquery.lat / query.lng / query.radiusMilesRadius in miles, up to 100
qquery.qFree text across name, aliases, city, ZIP and address
fuzzy: truematch: "balanced"A mode, applied the same way across registries
prefixMatchquery.prefixMatchAlso accepts "both"; matches aliases too
mode: "extensive"include: ["stateData"]Full offenses, photos, vehicles
uuid / personUuidGET /v1/records/{recordId}Direct record lookup
pagepage / perPageNative search can return the whole set in one response
createdAt / updatedAt filtersquery.createdAtStart/End, query.updatedAtStart/EndInclusive date ranges
faceId (facial search)—Not part of the current contract

Every field, with types and edge cases, is in the migration guide.

Migration

Moving from the compatibility endpoint to the native API

Most teams stay on compat for the first week, then shadow-read native /v1/search alongside it and diff the results. Key the diff on each record’s official registry link and jurisdiction, not on recordId, which is derived from the merge for a given query scope.

The main reason to finish the move is completeness. The legacy envelope can only signal a problem with a single error: 503, and {"offenders": [], "error": 503} means nothing was established — not that nobody matched. The native response marks a search partial and names each registry that did not complete and why in sourceStatus.

Once you branch on matchState and the incomplete-source count, you can auto-accept strong matches, route weak ones to a reviewer and retry partial searches. Native search also returns the whole de-duplicated set in one response up to a defined cap, so most pagination loops go away. Read matching and result completeness before you cut over.

Plan

A four-week offenders.io cut-over plan

A schedule most teams can run without a freeze. Each stage is reversible, because compat stays up the whole time.

WeekWhat you changeWhat you check before moving on
1Base URL and key on staging, then on a slice of productionYour existing tests pass unchanged; error handling treats a 503 as not determined
2Shadow-read native /v1/search beside every compat callRecord sets agree on registry link and jurisdiction for the names you care about
3Read matchState, matchConfidence and the incomplete-source countYour auto-accept and review thresholds route a sample of real matches correctly
4Production traffic on native search; turn on webhooks, batch or monitoring if you use themPartial searches retry; reviewers see the official registry link on each match

Smaller integrations often do weeks one and two in a single afternoon. Nothing forces the native move.

Evaluation

What to check before you cut over from offenders.io

  • The same names. Run the queries your product actually sends, not a demo list, through both.
  • Record sets, not counts. A count can match while the people differ; diff on registry link and jurisdiction.
  • Partial answers. Confirm your code treats a 503 on compat, and partial on native, as not determined.
  • Match handling. Decide which matchState values auto-clear, which go to review and which block.
  • Record depth. Check the fields you rely on — photographs, aliases, typed addresses, offenses — on real records.
  • Total cost. Price your month with add-ons included, as on the comparison page.

offenders.io alternative FAQ: migrating your integration

Is OffenderSearch a drop-in replacement for offenders.io?
Yes. POST /v1/compat/sexoffender accepts their parameters and returns their { offenders, page, totalPages } envelope. Switching means changing the base URL and the API key; your parsing code stays as it is.
How long does a migration take?
The compat switch is a configuration change you can test in an afternoon. Most teams run compat for a week, shadow-read the native endpoint for another, then cut over.
Do I have to migrate off the compatibility endpoint?
No. Both the compatibility endpoint and the native /v1/search endpoint stay supported. Teams move to native when they want scoring, per-source status, batch and reports.
What behaves differently on compat?
One thing. The legacy envelope has room for a single completeness signal, error: 503. {"offenders": [], "error": 503} means nothing was established — not that nobody matched. On native search the same condition is status: "partial" with a sourceStatus entry naming each registry and why.
Is facial search supported?
No. A faceId request has no equivalent in the current contract. If facial search is essential to your product, keep it where it is.
Can our operations team use it before engineering integrates?
Yes. The same account includes a no-code dashboard for single searches and CSV roster screening, so they can start the day you sign up.
Does the same key cover criminal records?
Yes. County court, jail booking, state prison and warrant records run on the same key and price. See the criminal records API.
Will our record IDs change?
Yes on native search. A native recordId is derived from the merge for a given query scope, so store the official registry link and jurisdiction as your durable key, and use GET /v1/records/{recordId} for direct lookups within a session.
How is pricing different after the switch?
$0.15 a call for the first 2,000 each month, then $0.11, with match tolerance and radius in the base call. offenders.io’s pricing page lists $0.20 for its first paid tier and $0.15 after. The full side-by-side is on OffenderSearch vs offenders.io.
Is there a free evaluation?
25 free calls at sign-up, no card — enough to run your own test names through compat and native search side by side.

Run both APIs and read the difference: test any sex offender search alternative against OffenderSearch on the same names.

25 free calls, a compat endpoint that speaks their shape, and the full contract waiting when you are ready.