The Arrest Records API
An arrest records API for county jail bookings. Search by name and get each matching booking as JSON — the booking date, custody status, the jail, a photo link where one is published — with the county that holds it cited on every record.
The county layer of the criminal records API. A booking is not a conviction, and the response never presents it as one.
curl -X POST \
https://api.offendersearch.app/v1/criminal/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": {
"firstName": "Alex",
"lastName": "Hamilton",
"state": "TX",
"county": "Dallas",
"age": 36
}
}'What an arrest record is — and what it does not prove
An arrest record is the earliest criminal record there is, and the one most often misread.
When someone is arrested and taken to a county jail, the jail books them: name, a photo, the date, the charges the officer cited. That entry is the arrest record, and it is published by the county, usually on the sheriff’s jail roster. It proves one thing — that this person was in that jail on that date.
It does not prove guilt. Nobody has been tried at the point of booking. The charges can change before a case is filed, the case can be dismissed, or it may never be filed at all. That is why the API keeps a booking separate from a court outcome instead of folding the two into one “criminal record”: a product that shows a booking as a conviction is wrong about a real person.
What the arrest records API returns
A booking is a custody event, so the custody fields lead. These are the real fields.
| Field | What it holds |
|---|---|
dateIncarcerated | The booking date — the day the person was taken into the jail. |
currentStatus, currentlyIncarcerated | Whether the person is in custody now or has been released, as the roster shows it. |
releaseDate | The release date where the jail publishes one. null while the person is still held. |
custodyFacility | The jail holding the person, by name. |
state, county | The county that made the booking. An arrest record is a county record. |
cases[] | Often empty on a booking. When a court case is attached, it carries the charges and, once decided, their dispositions. |
mugshotUrl | A link to the booking photo where the county publishes one, otherwise null. |
name, aliases, sex, race | The person as the roster lists them. |
dob.age, dob.ageAsOf, dobPrecision | Most jail rosters publish an age rather than a birth date. dobPrecision "age" tells you that is all there was to compare. |
sources[].code, level, recordUrl | The county that holds the booking (for example TX-DALLAS, a bare county code) and its own link to the entry. |
lifecycle.droppedOut, dropInterpretation | Set when a booking is no longer on the roster. For a jail that most likely means release — it is reported, not assumed. |
externalId | A stable reference built from the county and its booking number. Store it to recognise the same booking later. |
Complete example and field availability by record type: the record object.
Arrest, charge and conviction are three different records
They are published by three different kinds of office, and the API returns each as what it is.
| Record | Who publishes it | What it tells you | Where to read it |
|---|---|---|---|
| Arrest / jail booking | County jail or sheriff | The person was booked on a date, and whether they are still held | This page |
| Court case | The court | What was charged and how each charge ended | Court records API |
| Prison record | State corrections department | A sentence being served, with facility and release dates | Inmate search API |
One search returns all three for the same person where they exist, so you can show a booking next to the case that followed it. When a booking has no case attached, cases is an empty array. That is the honest answer, not a gap in the response.
Age-only bookings and how matches are scored
Jail rosters are the record type least likely to publish a date of birth. The API is built around that.
Send a date of birth if you have one, or an age or birthYear if you do not. A single dob in the query is compared against whatever each roster published. Where the roster gives only an age, the record comes back with matchState: "age_match" when the age fits within a year, and matchConfidence reflects that an age is weaker evidence than a full date.
A booking is only dropped from your results when it has birth evidence that conflicts with yours. One with no birth evidence at all is kept and marked unverified: true, because nothing disproves it. Set your own threshold on matchState and matchConfidence; the rules are in matching and confidence.
Getting only arrest records from a search
One endpoint returns every record kind. A booking is easy to pick out.
| What to check | A jail booking | Other record kinds |
|---|---|---|
sources[].code | A bare county code with no suffix, for example TX-DALLAS | A suffixed code: TX-DOC, OK-COURT, US-WARRANT |
sources[].level | county | Usually state or federal |
dateIncarcerated | The booking date | The admission date on a prison record; null on a court case |
cases[] | Often empty | The whole point of a court record |
To see which counties are in the catalog before you search, call GET /v1/criminal/jurisdictions?recordKind=jail-roster, with a state to narrow it. To re-check a booking at the county during the request, add a live block naming the county’s code — see jurisdictions.
Arrest records API code samples
Plain REST and JSON, with your key in the X-API-Key header. The person goes inside query. A surname is required; state and county keep the search to one jail’s area.
- One schema — every county’s bookings arrive in the same shape, so your code does not branch by county.
- Nicknames handled — a search for “Bob” also finds “Robert”.
- Lists —
POST /v1/criminal/batchtakes a CSV or JSON list, one result per row. - Watch a person — monitoring alerts you when a new matching record appears.
curl -X POST \
https://api.offendersearch.app/v1/criminal/search \
-H "X-API-Key: $OFFENDERSEARCH_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": {
"firstName": "Alex",
"lastName": "Hamilton",
"state": "TX",
"county": "Dallas",
"age": 36
}
}'Arrest records coverage by county
Arrest records are county records, so coverage is counted in counties.
The jail-roster catalog lists 1,375 county jurisdictions, of which 992 are answering today. That is the largest layer of the criminal search, which as a whole reaches more than a thousand county, state and federal jurisdictions, with coverage in every US state. It is not every county in the country, and depth inside a state varies widely — a few states publish most of their county rosters, others only a handful.
So the API tells you what it reached. Each response reports the sources that answered and flags any that did not, and the state-by-state picture is on the arrest records page and in the coverage reference.
Arrest records API or arrest records search?
Same records, different job.
| Arrest records API (this page) | Arrest records | |
|---|---|---|
| Who it is for | A developer adding booking lookups to a product | A person who wants to understand or look up an arrest record |
| How you use it | An HTTPS call from your server, JSON back | A plain-language guide and a search form |
| Volume | One person or a whole list through batch | One name at a time |
| Where to start | The quickstart | Arrest records |
Arrest records API pricing
One price per search, with no per-county fees and no charge for the photo link or the match score.
| Item | Price |
|---|---|
| Arrest records search (cached answer) | $0.15 per search |
| Volume rate | $0.11 per search past 2,000 searches in a calendar month |
| Free to start | 25 searches, no card |
| Live re-verification | +$0.02 per completed source, capped at $2.00 per search; a failed live check is not billed |
| Batch (CSV or JSON list) | Each row billed as one search |
| FCRA workflows | Contact us for pricing |
Worked examples by volume: background check API pricing · all rates: pricing.
Making a hiring or tenant decision? Use an FCRA workflow.
FCRA workflows are built primarily for tenant screening and hiring decisions. If a result will help decide whether to hire someone or rent to them, the check has to run as an FCRA-regulated consumer report, with a permissible purpose, consent, accuracy controls and a dispute path for the person. Our standard search and API are not a consumer report. FCRA workflows run through FCRA Partner Access, for background check companies and screening platforms under a written FCRA agreement.
FCRA pricing is quoted per partner, so contact us for pricing.
Arrest records API questions
What is an arrest records API?
It lets your software look up arrest and jail-booking records by name instead of someone checking county jail websites one at a time. You send a surname and whatever else you know; you get back the matching bookings as JSON — booking date, custody status, the jail, and a link to the county’s own entry.
Does an arrest record mean the person was convicted?
No. A booking records that someone was taken into custody on a given day. It carries no verdict. Charges can be dropped, reduced or dismissed after a booking, and many are. If your question is whether someone was convicted, read the court case and its dispositions — the court records API page covers that record.
Which counties does the arrest records API cover?
The catalog lists 1,375 county jurisdictions, of which 992 are answering today. Depth varies a great deal from state to state. GET /v1/criminal/jurisdictions?recordKind=jail-roster, optionally with a state, returns the current list, and each search response reports which sources answered.
Does it return mugshots?
Each booking carries a mugshotUrl field, filled when the county publishes a booking photo and null when it does not. The field is a link to the photo, not image data in the response.
Why do some bookings have an age and no date of birth?
Because that is what most jail rosters publish. The API does not invent a birth date from an age. It returns the age, the date the age was stated, and dobPrecision "age", and it labels the match age_match rather than dob_match so you can see how strong the tie to your subject is.
Can I search arrests in one county only?
Yes. Add state and county to the query to keep the search to that county. Leave them out to search every jurisdiction for the name.
How much does an arrest records search cost?
$0.15 per search, dropping to $0.11 past 2,000 searches in a calendar month. One search returns every record type for the person, so bookings, prison records and court cases cost one search together. The first 25 searches are free, no card.
Can arrest records be used to screen job applicants or tenants?
Not from the standard search. Standard results are not a consumer report, and many states restrict how an arrest without a conviction may be used at all. Hiring and tenant decisions run as an FCRA workflow through FCRA Partner Access, for consumer reporting agencies and screening platforms under a written FCRA agreement.
Run your first arrest records search
25 free searches on one key. No card, no sales call.
The Offendersearch APIs
One account, one key, one bill — the sex offender registry and criminal records, side by side.
Sex offender registry
- Sex offender API — One call across 58 US sex offender registries, with scored matches and a citation on every record.
- Sex offender search API — Endpoints, request shapes, record fields, matching and batch, in detail.
- Sex offender database — The national registry data in one schema — photos, aliases, offenses, addresses.
- Registered offender database — What a registered offender record holds, and how its accuracy is measured.
- Bulk sex offender search — Screen a whole list of names in one upload or one API call.
- Sex offender registry API — Choose which of the 58 registries a search covers, and see which ones answered.
- Offender search API — The registry search and the criminal search side by side, on one key.
Criminal records
- Criminal records API — County, state and federal records — jail, prison, court and warrant — through one API.
- Criminal background check API — One cited answer per person for onboarding and screening flows.
- Criminal search API — The search endpoint itself: parameters, record types and coverage, call by call.
- Court records API — Criminal court cases with charges and a disposition on each charge.
- Inmate search API — State prison and county jail custody, with sentence, release and parole dates.
- Background check API — The registry and criminal layers together, on one key and one bill.
- Employment background check API — The registry and criminal data layer for HR, ATS and screening platforms.
- Employment screening API — The stages of a hiring pipeline, and where criminal and registry checks sit in it.
- Bulk criminal record search — Run a list of names against criminal records in one call.
- Statewide criminal search — One state at a time: prison, court and warrant systems that cover the whole state.
- Federal criminal records — Federal criminal records through the same API, and what a federal search covers.
Build with it
- API documentation — Quickstart, every endpoint, the record object and the OpenAPI spec.
- Sex offender map API — Clusters, pins and names for your own map, and the full record when one is opened.
- Background check API pricing — $0.15 a call, $0.11 past 2,000 a month, 25 free calls to start — worked out by volume.
- Background check API integration — Keys, the first call, async and webhooks, batch, monitoring and errors, step by step.
- Free background check API — 25 free calls on real data, no card — what is included and what comes after.
- Pay-as-you-go background check API — Per call, per report or subscription: the pricing models, with costs by volume.
- Background check API in Python — A working tutorial with requests: search, batch, async, errors and retries.
- Background check API in Node.js — A fetch client, response types, an Express webhook handler and retries.
- NSOPW API — Is there one? What exists, and a developer API for searching US registries.
- MCP server for offender search — Give Claude and other AI agents the same search as a tool.
- Integrations — Screening inside referral software — CarePort, ExtendedCare, Ensocare and Aidin.
- AI integration — Offender safety checks for AI agents and chatbots, with cited answers.
- Offendersearch vs offenders.io — A side-by-side comparison of the two registry APIs.
Screening and compliance
- Tenant background check — Screening applicants for a rental, and where an FCRA workflow is required.
- FCRA Partner Access — The FCRA workflow for hiring and tenant decisions — pricing by quote.
- FCRA-compliant background check data — Accuracy, disputes and permissible purpose for consumer reporting agencies.
- FCRA disputes API — Open, track and resolve a consumer dispute against a record.
- Sex offender monitoring — Watch a person or an address and get an alert when the registry changes.
- Tenant screening API — The registry and criminal layer for property software, with FCRA workflows for rental decisions.
- Non-FCRA background check API — What a public-records lookup may be used for, and when a decision needs FCRA instead.