OffenderSearch
Workforce screening API · gig platforms, staffing, contractor onboarding

Workforce screening API

Screen a worker at sign-up, re-screen the roster on your schedule and hear about a new record in between, through one key. Criminal records from 1,934 live jurisdictions and 58 sex offender registries, $0.15 a search, monitors $3.00 a worker a month.

Get a free API keyRead the docs25 free calls · no card

Updated November 8, 2026 · API changelog

1 · OnboardPOST /v1/criminal/search and /v1/search at sign-up$0.15 a search
2 · Re-screenPOST /v1/criminal/batch, 1,000 rows a call$0.11 past 2,000 a month
3 · MonitorPOST /v1/monitors, signed webhooks$3.00 a worker a month
Stage 1 · POST /v1/criminal/search · sandbox
curl -X POST "https://sandbox.offendersearch.app/v1/criminal/search" \
  -H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "query": {
        "firstName": "Felony",
        "lastName": "Record",
        "dob": "1975-06-15"
      }
    }'
One court case: a felony burglary conviction with case number, court, charges, plea, disposition and sentence. DOB-verified.Sandbox people are synthetic; production answers have the same shape.
1,934live criminal jurisdictions as of 2026-11-08; 1,782 of them county jail rosters
58US sex offender registries in one registry search
1,000rows in one batch call, results in input order
$1,180.00for 10,000 searches in a month at the graduated rate

What does a workforce screening API return at sign-up?

The sandbox’s answer for its felony persona: one court case with a conviction, scored against the name and date of birth the worker typed.

POST /v1/criminal/searchsandbox scenario “Felony conviction” · query {"firstName":"Felony","lastName":"Record","dob":"1975-06-15"}
200 OK · the sandbox's answer, captured from its code
{
  "status": "complete",
  "counts": {
    "records": 1,
    "recordsReturned": 1,
    "sourcesQueried": 0,
    "sourcesComplete": 0,
    "sourcesIncomplete": 0,
    "candidatesCapped": false,
    "exclusionsIncluded": false,
    "sourcesOnFile": 1567,
    "sourcesPending": 347
  },
  "warnings": [],
  "page": 1,
  "perPage": 50,
  "totalPages": 1,
  "sourceStatus": [],
  "cappedOmittedSources": [],
  "omittedFields": [
    "sourceData"
  ],
  "legal": {
    "notice": "Not a consumer report. This information may not be used for any purpose under the Fair Credit Reporting Act (15 U.S.C. § 1681 et seq.)."
For an onboarding decision three fields carry most of the weight: matchState (dob_match here), normalized.hasConviction and normalized.topSeverity. The cases[].charges[].disposition says how the case ended; a booking with no disposition is an arrest, not a conviction.Run it yourself with a test key ›

A sign-up form gives you a name, a date of birth and usually a city or state. That is the whole query: it goes in query, the date of birth as YYYY-MM-DD, and the answer comes back in the same round trip with a status, the counts, one row per system in sourceStatus and the records. A platform that also wants the registries sends the same body to POST /v1/search; the two responses share the match fields, so one decision function serves both.

The rule that keeps a marketplace out of trouble is in the status and counts before any record: counts.sourcesIncomplete above zero means a system did not answer, and the response says partial. A worker is cleared on a complete answer, routed to review on a partial one, never cleared on silence.

Onboarding questionField
Is this record this applicant?matchState, matchConfidence, matchBasis
Was anyone convicted of anything?normalized.hasConviction, normalized.convictionCount
How serious?normalized.topSeverity, cases[].charges[].severity
Is it open, pending or closed?cases[].status, normalized.outcomes
Is the person in custody or wanted now?currentStatus, currentlyIncarcerated
Did every system answer?status, counts.sourcesIncomplete

How do you screen a workforce in three API calls?

Sign-up, the scheduled re-screen, and the monitor. Each stage reuses the previous one’s identifiers.

  • Stage 1, onboarding. One POST /v1/criminal/search and, where the role calls for it, one POST /v1/search for the registries. Store searchId and each record’s personRef with the worker.
  • Stage 2, the re-screen. On your own schedule, send the active roster to POST /v1/criminal/batch as a queries array in a known order. Each result carries its index; diff the row’s records against the stored personRef set, and a new personRef is a new record to review.
  • Stage 3, the monitor. For workers who keep working between re-screens, POST /v1/monitors with product: "criminal". The 201 returns the webhook secret once; alerts arrive signed, and the history endpoint is the record.

The background checks for marketplaces tutorial walks all three stages against the sandbox; the bulk background checks from a CSV guide covers the batch endpoint’s CSV form for teams that export a roster from a spreadsheet.

curl -X POST https://api.offendersearch.app/v1/criminal/batch \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": [
      { "firstName": "Felony", "lastName": "Record", "dob": "1975-06-15" },
      { "firstName": "Clear",  "lastName": "Record", "dob": "1990-02-02" }
    ],
    "match": "balanced"
  }'
# results[] in input order, each with its 0-based index; a failing row is status "error" in place
# the registries: the same envelope to POST /v1/batch

A batch runs on the stored answer, so there is no live charge inside it; a row that needs a confirmation with the jurisdiction goes through the criminal record verification API one at a time.

When is a re-screen a batch, and when is it a monitor?

They answer different questions. A batch says what is true on the day you run it; a monitor says when something changed.

Scheduled re-screen (/v1/criminal/batch)Person monitor (/v1/monitors)
What it tells youThe state of the record on the day of the runThat a record appeared, changed or was removed since the last evaluation
Who it suitsThe whole roster, including inactive workersActive workers whose next shift is before your next batch
Unit of billingOne call per row: $0.15, $0.11 past 2,000 in the month$3.00 a person a month, alerts included
How you learnResults in the response, in input orderA signed monitor.alert webhook, plus GET /v1/monitors/{id}/alerts
Identity keyresults[].index → personRefmonitor id → personRef
Live re-verificationNot offered inside a batchNot part of a monitor; confirm a hit with a live search
Where to read moreBatch referenceMonitoring reference

The cost table below works out both lines. The continuous criminal monitoring API page documents the webhook, the event catalogue and delivery in full.

What does a worker monitor look like when it is created?

The sandbox’s 201 for a criminal person monitor on the felony persona. The id is the handle for every later call.

POST /v1/monitors · request
{
  "product": "criminal",
  "type": "person",
  "person": {
    "firstName": "Felony",
    "lastName": "Record",
    "dob": "1975-06-15"
  },
  "channels": {
    "email": "alerts@your-app.example.com"
  }
}
201 Created · captured from the sandbox
{
  "id": "mon_5f67d9bde1f79980",
  "product": "criminal",
  "type": "person",
  "minConfidence": null,
  "label": null,
  "status": "active",
  "channels": {
    "emails": [
      "alerts@your-app.example.com"
    ]
  },
  "createdAt": "2026-11-08T15:49:29.914226+00:00",
  "canceledAt": null,
  "person": {
    "firstName": "Felony",
    "lastName": "Record",
    "dob": "1975-06-15"
  },
  "sandbox": true
}

product picks the dataset, type: "person" the predicate, and person is the same name and date of birth the onboarding search used. channels takes an email, several, or a webhookUrl; with a webhook the 201 also carries channels.webhookSecret, shown once. minConfidence is unset here, which means the default floor: year_match when a date of birth was sent. A platform that wants only identifications sets it to dob_match. The monitor a person with webhooks tutorial has the Express and FastAPI receivers.

Is a workforce screening API an FCRA consumer report?

It depends on what the platform does with the answer, not on the data. Two paths, two prices, the same records.

Path 1

Data API, not FCRA

$0.15a call, 25 free, no card
  • For: visitor and volunteer screening, trust and safety, research, monitoring, and software that shows a public record to the person who asked for it.
  • Must not decide: whether someone is hired, housed, insured or given credit. The response is a public-records lookup, not a consumer report, and the key is not approved for those uses.
  • Example: A trust-and-safety team re-screens a marketplace account after a report; nothing about a job depends on it.

Self-serve: get a key, then POST /v1/search or /v1/criminal/search.

Path 2

FCRA Partner Access

$4.95per order, searches and live checks included, no court fees
  • Built in: end-user registration with a permissible purpose, consent on every order, the pre-adverse and adverse-action notices with the consumer’s copy, and a consumer portal.
  • Disputes: a dispute endpoint; the record is re-checked with the registry or court that holds it, with an outcome inside 30 days, and a correction reaches every partner that received it.
  • Example: A staffing platform decides whether to place a candidate; the candidate consented and can dispute what came back.

Under a written agreement: Request FCRA Partner Access.

The records can be the same; the process around them is not. How the program works: FCRA Partner Access · the orders endpoint: FCRA orders API · reference and statute citations: FCRA docs. This page describes the product, not legal advice.

What does screening 1,000, 10,000 or 100,000 workers cost?

The graduated rate applied to a month’s searches, then the monitor line beside it. Change the volume in the calculator.

Workers searched in a monthSearch costIf every one is also monitoredTotal
1,000$150.00$3,000.00$3,150.00
10,000$1,180.00$30,000.00$31,180.00
100,000$11,080.00$300,000.00$311,080.00
ItemPriceUnit
Criminal or registry search, one worker$0.15per call, the first 2,000 in a calendar month
Volume rate$0.11per call past 2,000 in a calendar month
Free to start25 callsonce per account, on production data, no card
Sandbox$060 calls a minute and 2,000 a day per test key
Person monitor$3.00per person a month
FCRA order$4.95per order; sex offender and criminal court search included, with no court fees or extra charges

No minimum on search. The Map API has its own $300 monthly minimum. No seats, no platform fee, no per-state fee; a batch row is billed as one call.

Monthly calls:
$1,180
a month
$0.118
effective per call
8,000
calls at $0.11

The first 2,000 calls in a calendar month are $0.15 each, every one after that $0.11. The 25 free calls on a new account are not subtracted here. Live re-verification, monitors and FCRA orders are billed separately.

A batch row is a call. The first 2,000 calls in a calendar month are $0.15; each one after is $0.11, which is why 100,000 searches cost $11,080.00 rather than 100,000 times the first-tier rate.

Worked examples by volume: background check API pricing · every rate: pricing.

How does it compare with Checkr for workforce screening?

Checkr sells finished consumer reports by package; this is a per-call records API with an FCRA path beside it. Both from the published pages, with the read date.

AspectCheckrOffenderSearch API
What you pay forA finished consumer report, per report, by package; court and database fees passed through at costOne API call: scored public records for a name and date of birth, in the same HTTP response
Published entry price$29.99 a report (Basic)$0.15 a call, $0.11 past 2,000 in a month
County courthouse searchwhere another vendor does moreIncluded in Essential ($59.99); as an add-on $25 a check, plus pass-through feesNo courthouse pulls. Statewide court sources in 48 states, plus live re-verification of named jurisdictions at +$0.02 a source
Free tierwhere another vendor does moreNo free trial listed on its pricing page; a staging environment with mocked data is available on request25 calls on production data, no card; the sandbox at 60 calls a minute, 2,000 a day per test key, nothing billed
Test environmenta staging environment with mocked data, available once Checkr grants access (api.checkr-staging.com)Self-serve sandbox with documented test people; mint an os_test_ key in the dashboard
Webhookswebhooks signed with HMAC-SHA256 in an X-Checkr-Signature header; retries every minute for 10 minutes, then every hour for 24 hoursAsync searches post the finished envelope to a webhookUrl; monitor and FCRA deliveries carry X-Offendersearch-Signature (HMAC-SHA256 over t.body), are retried and can be replayed
FCRA consumer reportsYes: every report is a consumer report, $29.99 to $94.99 by packageThrough FCRA Partner Access: $4.95 an order, searches and live checks included, no court fees
Continuous monitoringCheckr offers continuous criminal search at $1.70 per individual a month and continuous MVR at $2.50 per driver a month$3.00 a month per person, $10.00 per location, alerts by signed webhook

Checkr: checkr.com/pricing and docs.checkr.com, read 2026-11-08. Each vendor’s pages are the authority on its product and change without notice; a blank is a fact the vendor does not publish, not a zero. A consumer report and a public-records lookup are different products.

The county row is the one to read honestly: a Checkr county criminal search is a courthouse pull, and this API does not do those. What it offers instead is statewide court sources in 48 states and live re-verification of a named jurisdiction. The Checkr API alternative page sets the two models side by side.

Where does a workforce screening search reach?

County jail rosters, statewide prison systems and statewide courts, by state; the registry column is the sex offender search on the same key.

The twelve states with the most live jurisdictions. A gig platform whose workers cluster in a few states should read those rows first.

StateCounty jail rosters (live / catalogued)Prison systemCourtsRegistry
Kentucky119 / 121StatewideStatewideKentucky registry
Texas84 / 104StatewideStatewideTexas registry
Ohio82 / 86StatewideStatewideOhio registry
South Carolina72 / 73StatewideStatewideSouth Carolina registry
Indiana70 / 74StatewideStatewideIndiana registry
Pennsylvania69 / 71StatewideStatewidePennsylvania registry
California66 / 71StatewideStatewideCalifornia registry
New York65 / 67StatewideStatewideNew York registry
Missouri66 / 68StatewideStatewideMissouri registry
Montana61 / 72StatewideStatewideMontana registry
Virginia60 / 62StatewideStatewideVirginia registry
Florida57 / 63StatewideStatewideFlorida registry

Jurisdictions in our catalogue as of 2026-11-08; a live jurisdiction answers a search today. Approximate, not an official figure. Showing the 12 states with the most live jurisdictions; the full list is in the criminal coverage reference.

Which workforce platforms read which field?

Three shapes of workforce, and the one response field each one acts on.

Gig and marketplace platforms

Thousands of sign-ups a week and a shift tomorrow. The onboarding search runs inline; the field that gates activation is status: complete activates, partial queues for review. Active drivers and couriers get a monitor.

Gig economy platforms ›

Staffing agencies

A candidate pool placed into many client sites with different rules. The agency re-screens by client with POST /v1/criminal/batch and reads normalized.topSeverity per row to apply each site’s threshold. Placement decisions run through FCRA Partner Access.

Employment screening API ›

Contractor onboarding

A vendor portal that onboards technicians and caregivers. The registry search matters as much as the criminal one, so both endpoints run at sign-up and matchState on each decides between auto-clear and a human review.

Bulk criminal record search ›

Applicants rather than workers: the tenant screening API. Behind every stage here sit the criminal records API and the background check API hub.

Limits of a workforce screening API

Rate limits, the batch size, the response cap and what is not returned. Honest zeros are part of the product.

LimitValue
Sandbox, per test key60 calls a minute, 2,000 a day; nothing billed
Production, per keyNo published ceiling. A 429 only when the service is at capacity, with Retry-After; a 429 is never billed
Records per responseUp to 4,000 in one answer; above that capped: true, and perPage pages through the rest
Batch1,000 rows a call; a failing row is reported in place and never stops the batch
DeadlinedeadlineMs bounds the wait for slow jurisdictions; an unanswered one is named in sourceStatus and the answer says partial
EndpointsPOST /v1/criminal/search; one X-API-Key header
  • No civil cases, no traffic citations. Criminal records only: jail bookings, prison custody, court cases with dispositions, warrants, and the registries.
  • No international records. US county, state and federal sources, and the 58 US registries.
  • Not a consumer report. A hiring, housing, credit or insurance decision runs as an order through FCRA Partner Access, not through the standard key.
  • No SSN, no credit, no verifications, no drug or driving records. Scope comes from the name, the date of birth and the places you already hold.
  • No identity, employment or education verification, no drug or driving records. A workforce platform that needs those adds another vendor; this API is the criminal and registry layer.

Retry rules and backoff: rate limits, retries and idempotency · every status code: errors.

What a rate-limit answer looks like
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json

{
  "detail": {
    "code": "overloaded",
    "retryAfterSeconds": 12
  }
}
Nothing was searched and nothing was billed; wait retryAfterSeconds and send the same request again.

Workforce screening API questions

Batch mechanics, monitors, staging, billing and the FCRA line, in the words platform teams use.

How do I run a re-screen across the whole active roster?

Send the roster to POST /v1/criminal/batch (or /v1/batch for the registries) in chunks of up to 1,000 rows. Results come back in input order, each with its 0-based index, and a row that fails validation is reported in that position as status: "error" without stopping the rest and without being billed. Each row is billed as one call at the graduated rate, so a re-screen of 10,000 workers costs the same as 10,000 single searches in that month.

When should a worker get a monitor instead of a re-screen?

When waiting for the next batch is the risk. A person monitor costs $3.00 a month and reports a new, changed or removed record as a signed webhook when it is next evaluated; a batch tells you only on the day you run it. Many platforms monitor the active workers and batch the inactive ones.

Can one key serve sign-up, batch and monitoring?

Yes. The same X-API-Key header authenticates /v1/criminal/search, /v1/search, the two batch endpoints and /v1/monitors, and the sandbox mirrors all four with an os_test_ key. Keys carry no entitlements, so you can issue one per environment and revoke any one alone.

What does the platform receive when a monitor fires?

A monitor.alert POST signed with the monitor’s own secret, carrying event (new, changed, removed), the match label, the record summary and the personRef. The same alert is listed at GET /v1/monitors/{id}/alerts, so a missed delivery can be reconciled from the history.

How does the sandbox fit a staging environment?

Point staging at sandbox.offendersearch.app with an os_test_ key. The documented personas return the same shapes as production, including a felony conviction, an open warrant and a clear result; the sandbox allows 60 calls a minute and 2,000 a day per test key and bills nothing.

Which stage is a consumer report?

None of them through the standard key: each response says so in legal.notice. A platform that decides whether to activate, deactivate or place a worker on the strength of a record runs that step as an order through FCRA Partner Access at $4.95 an order, which adds consent, the notices and the dispute path.

Does a clear result cost the same as a hit?

Yes, a search is a search. A clear answer carries the evidence that makes it worth paying for: sourceStatus says which systems answered and counts.sourcesIncomplete says how many did not, so “clear” is never read off a search that was only partly answered.

Learn the API by example

Runnable guides that use this endpoint as the worked example.

Background checks for marketplaces ›Where the check sits in sign-up, re-screens by batch, a monitor per provider.
Bulk background checks from a CSV ›The batch endpoint, 1,000 rows a call, results in input order, billed per row.
Monitor a person with webhooks ›A standing watch on a person, signed alerts, and the receiver that verifies them.
Background check API for HR and ATS ›The FCRA order from the offer stage to the result on the candidate record.
Test a background check integration ›The sandbox scenario matrix, a test suite, CI and the switch to production.
No-match and multiple-match results ›The three shapes of "nothing", possibles, and a decision table per matchState.

All guides: Learn APIs by example · reference: developer docs · packages: SDKs and CLI.

Related background check API pages

The rest of the developer surface, one anchor per page.

Background check API ›Criminal records and 58 US sex offender registries on one key, per call.
Criminal records API ›Court cases, jail bookings, prison custody and warrants as JSON.
Sex offender API ›One POST across 58 US registries, scored and cited.
Free background check API ›25 free calls on real data, no card, plus the free sandbox.
Employment screening API ›The public-records stage of a hiring pipeline, and the FCRA path for the decision.
Tenant screening API ›The registry and criminal layer behind a rental application.
Inmate search API ›State prison and county jail custody records.
Background check API pricing ›Costs from 100 to 100,000 searches a month.
Public API for testing ›A free sandbox with documented test people in the production shape.
SDKs: Python, Node, CLI ›Client status and the method surface, one per endpoint.
Postman collection ›Every endpoint with sandbox bodies pre-filled.
MCP server ›Registry and criminal lookups as tools for Claude, Cursor and agents.

Screen your first worker on the sandbox

A key in seconds, the felony and clear personas, a two-row batch and a monitor. Nothing is billed until you switch to a live key.