Extracting Exhibit Lists From a Trial Filing
9 min read · updated August 11, 2026
An exhibit list is a table, and tables extract well, which is why this job looks finished long before it is. The value is not the table. It is the comparison between the table and the exhibits the rest of the filing actually relies on, because the exhibit cited in an argument and missing from the list is the thing somebody needs to know about today.
The exhibit number is not the key
Exhibit numbering is party-scoped, and the conventions vary by court and by case. Plaintiff exhibits numbered and defence exhibits lettered is one common scheme. Prefixed numbering — P-1 against D-1 — is another. Joint exhibits often take their own prefix. Some courts number sequentially across all parties instead, precisely to avoid the ambiguity.
The consequence is that “Exhibit 14” is not an identifier. The key is the pair of party designation and number, and your schema needs both even when the document in front of you only uses one party’s scheme — because the next document in the matter will use the other. Store the surface form as well, since citations elsewhere in the filing will match on the surface form rather than on your normalisation.
{
"exhibit_id": { "party": "plaintiff", "number": "14", "surface": "Pl. Ex. 14" },
"description": "Email chain, R. Iyer to T. Bowen, 12–19 Jan 2022",
"bates": { "prefix": "ACME", "start": 1123, "end": 1131 },
"status": "admitted",
"objection": "hearsay; relevance",
"list_source": { "document": "Joint Pretrial Order", "page": 17, "row": 14 }
}Where the list is embedded in a larger filing — a joint pretrial order, a motion with an accompanying index — the same matter will have several exhibit lists in circulation at once, produced at different dates by different parties. Recording which document a row came from, on the row, is what lets you answer the only question anyone asks of a merged table: which list said this. A row without its source is unusable the moment a second list arrives, and a second list always arrives.
Status columns and what they mean
Most lists carry more than description. The columns that recur are a Bates range, a date offered, an objection, whether the exhibit was admitted, and the date of admission. These are not interchangeable states: marked for identification, offered, admitted and admitted for a limited purpose are four different things, and the list frequently records them by a mark in a column rather than by a word.
That means part of this extraction is mark detection rather than text reading, with the same three-state discipline that a checkbox needs: a marked cell, an empty cell, and a column that is not on this form. Handwritten clerk annotations are common on lists filed after trial begins, and they are frequently the most current information on the page. Where the printed column says one thing and a handwritten note says another, extract both and flag the disagreement rather than resolving it.
Bates ranges give you a cheap internal check. A start greater than an end is a misread. A prefix that differs from every other row’s prefix is worth a flag. And two exhibits whose ranges overlap is either a production error or an extraction error, and is worth surfacing either way.
The cross-check that finds the gap
Now the part that makes the page worth writing. Exhibits are cited throughout a filing in a small set of forms: Ex. 14, Exhibit 14, Pl. Ex. 14, Exs. 12-18, sometimes with the description in parentheses. Collect every citation from the body text with its location, normalise it to the same party-and-number key, and diff the two sets.
- Cited but not listed. An exhibit the argument depends on that does not appear on the formal list. This is the finding the whole exercise exists to produce.
- Listed but never cited. Less urgent, but it identifies exhibits that may have been carried forward from an earlier draft or belong to a claim that has gone.
- Cited with a description that does not match. The body says “Exhibit 14, the inspection report” and the list says Exhibit 14 is an email chain. Usually a renumbering that was not carried through everywhere.
Do the citation harvest with a pattern match rather than a model. The citation forms are a small, closed set; a regular expression finds them exhaustively and cheaply, and it does not hallucinate an exhibit number. Reserve the model for the description matching in the third case, where the comparison is genuinely semantic.
Ranges, duplicates and amended lists
Ranges in body text have to be expanded before the diff, and the expansion has cases. Exs. 12-18 is seven exhibits. Exs. 12, 14-16 and 19 is five. A lettered range from Exhibit H to Exhibit L is five, and expanding it requires knowing that the scheme is alphabetic, which is why the party scope has to be resolved before expansion. A range that crosses schemes — it happens in sloppy filings — should be flagged rather than guessed at.
Duplicate numbers within a single list nearly always mean an amended list where one row was replaced and the old one not removed, or a merge of two parties’ lists into one table. Keep both rows, flag the collision, and record the list document’s own identity and date on every row — an amended pretrial order supersedes the earlier one wholesale, and rows from the two must never be pooled. This is the same document-set discipline described for supplemental interrogatory responses.
Why the table itself is hard
Exhibit lists are among the worse-behaved tables in litigation documents, for reasons that are structural rather than incidental:
- Descriptions wrap. One exhibit’s description runs to four lines while the adjacent columns hold one. A row-per- visual-line reading turns one exhibit into four, three of them with no number.
- The header does not repeat. On the second and later pages the columns continue unlabelled, so a page-at-a-time extraction has no idea which column is the Bates range and which is the date.
- Descriptions contain commas and dates. Any delimiter-based parsing splits the description into phantom columns, and any date parser reaches into the description and pulls out a date that belongs to the exhibit’s content, not to its admission.
- Merged cells for grouped exhibits. A single Bates range spanning several exhibit rows, or one objection applying to a block, is expressed as a vertically merged cell that flattens into the first row only.
None of these is solved by a better prompt; they are layout problems and belong to the ingestion stage, which is why a table-aware parse that emits cells with row and column indices is worth more here than any amount of instruction. The general treatment is in merged-cell table extraction, columns that shift on the second page and document table schema.