Understanding charges
Every case carries `charges[]` in the source's words, and `normalized.cases[].charges[]` carries the classification. Read both.
The charge as published: `cases[].charges[]`
| Field | Type | Meaning |
|---|---|---|
description | string ("" when none) | The charge as the source wrote it: "COCAINE - POSSESSION", "BURG HABIT INTEND OTH FELONY". Some court sources put a case caption or a court name here; the normalized charge then carries notACharge: true. |
statute | string ("") | The citation as published: "35-43-2-1", "2903.02", "22990003". Formats differ by state. |
severity | felony · misdemeanor · infraction · null | As published. null means not published — not minor. |
disposition | string ("") | The outcome as published: "convicted", "adjudicated", "GA", "DISM/RELEASED TO AUTHORITIES", "wanted". Understanding dispositions. |
dispositionDate, offenseDate | ISO date · null | When the outcome was entered; when the offense is alleged to have occurred. |
plea | string ("") | Where published. |
counts | integer · null | Number of counts where published; null when unstated. |
The charge classified: `normalized.cases[].charges[]`
| Field | Vocabulary | Meaning |
|---|---|---|
category | supervision, homicide, sex_offense, robbery, domestic_violence, dui, assault, weapons, burglary, fraud, theft, drug_distribution, drug_possession, traffic, public_order, other | What kind of offense the charge text describes. Also a filter (filters.chargeCategories) and a facet. |
severity | felony, misdemeanor, infraction, unknown | The class, from the source where published or derived — severityBasis says how: published, statute_code, statute_table, case_type, charge_text. |
outcome | convicted, pending, dismissed, nolle_prosequi, acquitted, deferred_or_diverted, vacated, warrant, transferred, closed_unspecified, administrative, unknown | The disposition text mapped to a closed outcome. |
convicted | true, false, null | true for convicted; false for acquitted, dismissed, nolle prosequi, deferred/diverted, vacated; null when the outcome does not decide it. |
degree, custodyEvent | degree text; booked, released, bonded, held, transferred, null | Extra detail where the source gives it. |
notACharge | boolean | The source's description was a caption or a court name, not a charge. |
rule | string | Which rule produced the classification — only with include: ["normalizedDetail"]. |
Record-level roll-ups sit beside them: normalized.topSeverity, normalized.chargeCategories[], normalized.outcomes[], normalized.hasConviction, normalized.convictionCount, normalized.latestOffenseDate / latestDispositionDate / latestFiledDate.
Searching by charge
The filters object narrows a search on the normalized fields: recordCategory, severity (with severityBasis), outcome, convictedOnly, chargeCategories, custodyStatus, offenseDate / filedDate / dispositionDate ranges, lookbackYears, hasPhoto, sources, statute, chargeText, excludeVacatedOrSealed. include: ["facets"] returns counts per value. Full reference: Filtering & locations.
{ "query": { "lastName": "Rivera", "firstName": "Jordan", "state": "TX" },
"filters": { "chargeCategories": ["theft", "fraud"], "severity": ["felony"], "convictedOnly": true, "lookbackYears": 7 },
"include": ["facets"] }What to expect in the data
- Published
severityis missing more often than present;normalized…severityfills it where a statute table or case type allows and says so inseverityBasis. - Dates in the core charge fields are ISO or
null. Dates in the extended groups (booking.*,warrant.*,cases[].offenseDate…) are ISO when they parse and otherwise the source's own text — parse defensively. - One case can carry several charges with different outcomes;
normalized.outcomes[]lists them all.