Skip to content

Extracting Structured Charges From a Criminal Complaint or Indictment

9 min read · updated August 11, 2026

Everything that happens to a charging document afterwards happens count by count. Counts are dismissed individually, amended individually, resolved individually. An extraction that produces onecharges string per document cannot be joined to any of that, and no amount of later processing recovers the structure.

One record per count, without exception

A count is the unit. Each one gets a record carrying its number, the statute or statutes cited, the offence name as the document states it, the alleged date or date range, the alleged location, the degree or class if stated, and the defendants to whom it applies. Everything is attributed to the document: the record says what is alleged, never what happened.

{
  "count": 3,
  "statute": { "jurisdiction": "US-federal", "code": "18 U.S.C.",
               "section": "1343", "subsection": null, "surface": "18 U.S.C. § 1343" },
  "offense_as_charged": "Wire fraud",
  "alleged_period": { "start": "2022-01-01", "end": "2022-11-30",
                      "qualifier": "on or about and between" },
  "alleged_location": "Kings County",
  "defendants": ["defendant_1", "defendant_2"],
  "special_allegations": [],
  "source": { "document": "indictment", "page": 6 }
}

Two structures routinely tempt a pipeline into merging counts and both should be resisted. Counts pleaded in the alternative charge the same conduct under two statutes, and they look like a duplicate; they are two counts and must stay two. And a single count may cite more than one statute — a substantive offence plus a provision on aiding and abetting, for instance — which is one count with an array of citations rather than two counts.

Special allegations and enhancement paragraphs are the third case. These are pleaded as their own numbered paragraphs following the count they attach to, and they read structurally like counts. Attach them to the count and mark the type; promoting one into a count inflates every count total in the matter.

The document type belongs on every record too, because a complaint, an information and an indictment are different instruments issued by different actors, and the counts in them are not equivalent for any purpose a downstream system cares about. A complaint frequently arrives with a sworn affidavit setting out the facts said to establish probable cause, which is attached to the charging document, has its own numbered paragraphs, and is not itself a list of counts. Split the bundle on document boundaries before extraction, or the affidavit’s paragraph numbers will be read as count numbers and you will produce a forty-count record from a two-count charge.

Anatomy of a statute citation

The citation is the most reusable field on the document, because it is what joins a charge to a code, to a classification, and to any other matter involving the same offence. So parse it rather than storing the string.

The components are jurisdiction, code or title, section, and subdivision, and the surface forms vary widely: a federal citation gives a title number before the code abbreviation and the section after a section symbol, while state citations name a code and a section with subdivisions in parentheses or after decimals. Doubled section symbols indicate multiple sections. Keep the surface form alongside the parsed components in every case — the surface form is what appears in later filings and is what a human will search for.

Do not attempt to look up an offence name from the section number and substitute it for what the document says. The charging document’s own description of the offence is a fact about the document; a name fetched from a code is an inference, and codes are amended, renumbered and repealed. If your pipeline enriches from a code table, keep the enrichment in separate fields and label it as such.

Alleged dates are ranges, not points

Charging documents rarely allege a precise instant, and the qualifying language is not decoration. “On or about” a stated date is a point with tolerance. “Between” two dates is a range. “On divers dates between” two dates alleges multiple occasions within a range. A schema with a single offense_date field converts all three into the same thing and discards the only part that distinguishes them.

Model an alleged period with a start, an end, and the qualifier verbatim, and validate the pair the way any date field is validated. Where only one date is stated, set start and end equal and keep the qualifier — the fact that the document said “on or about” is retrievable, and the fact that it did not is equally informative.

Counts and defendants are many-to-many

In a multi-defendant charging document the caption lists everyone and individual counts apply to subsets, usually flagged by a phrase such as “as to Defendant Two only” or by naming the defendants in the count text. A record shape with one defendant per document, or one defendant per count, cannot represent this.

Build a defendant table for the document with stable local identifiers, then reference those identifiers from counts — the ordinary multi-entity document schema shape. This also solves the name variance problem: the caption may give a full name with aliases, the counts may use a surname, and a later paragraph may use initials. One entity, several surface forms, all recorded.

Reconciling the caption against the counts is a cheap and useful check in its own right. A defendant named in the caption who appears in no count, or a name in a count that is not in the caption, is either a drafting artefact or an extraction error, and both are worth surfacing. It is the same shape of check as the exhibit reconciliation described in extracting exhibit lists.

What breaks

  • Counts numbered in words. “COUNT TWENTY-THREE” is common and sorts nowhere near count 23 unless normalised. Keep both forms.
  • A count spanning a page break. The statute citation is often the last line of a count and lands on the following page, separated from the count heading by a footer and a page number. Reading order again, and it belongs in PDF parsing rather than in the prompt.
  • A superseding document treated as an amendment. A superseding indictment replaces the earlier charging document wholesale, and its count numbers restart. Counts from the two must never be pooled; record the charging instrument identity on every count.
  • Identifying details in the text. These documents name people, and many contain initials in place of full names by convention. Whatever your pipeline does downstream, the identifiers in the text are personal data the moment they leave your infrastructure — see PII redaction.