Accuracy by bank
Each bank's figure is the share of its test statements we read with every row exact, stated as the lowest share the sample supports: the lower bound of a 95% interval, rounded down. We have measured 10 banks on 100 test statements and 4,030 rows. The test set is synthetic statements generated in each bank's layout with the truth generated beside them, so this figure measures our pipeline against that generated corpus, not accuracy on real client statements.
Measured on Oct 12, 2026 with parser 1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e on test set corpus/2026-10. How we measure
Every bank we have measured
Showing all 10 banks, most statements tested first.
0 rows across the whole test set were read with a wrong amount or sign: . Which statement and row (CSV)
| Status | Bank | Published figure | Weakest field | 95% interval | Wrong amount or sign | Details |
|---|---|---|---|---|---|---|
| Published | Bank of America | at least16.8%4 of 10 statements exact | Date 40.1%155 of 387 | 0 rows | ||
Balance check 4 of 8 Bank of America statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | Capital One | at least16.8%4 of 10 statements exact | Date 39.1%168 of 430 | 0 rows | ||
Balance check 4 of 8 Capital One statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | Citizens | at least16.8%4 of 10 statements exact | Date 38.5%158 of 410 | 0 rows | ||
Balance check 4 of 8 Citizens statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | Fifth Third | at least16.8%4 of 10 statements exact | Date 38.8%150 of 387 | 0 rows | ||
Balance check 4 of 8 Fifth Third statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | JPMorgan Chase | at least16.8%4 of 10 statements exact | Date 37.2%156 of 419 | 0 rows | ||
Balance check 4 of 8 JPMorgan Chase statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | PNC | at least16.8%4 of 10 statements exact | Date 40.6%171 of 421 | 0 rows | ||
Balance check 4 of 8 PNC statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | TD Bank | at least16.8%4 of 10 statements exact | Date 41.8%156 of 373 | 0 rows | ||
Balance check 4 of 8 TD Bank statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | Truist | at least16.8%4 of 10 statements exact | Date 38.2%164 of 429 | 0 rows | ||
Balance check 4 of 8 Truist statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | U.S. Bank | at least16.8%4 of 10 statements exact | Date 39.5%156 of 395 | 0 rows | ||
Balance check 4 of 8 U.S. Bank statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
| Published | Wells Fargo | at least16.8%4 of 10 statements exact | Date 38.5%146 of 379 | 0 rows | ||
Balance check 4 of 8 Wells Fargo statements in test set corpus/2026-10 tied out (50.0%). A continuity check, not an accuracy measurement. It catches a wrong amount, a missing row and a duplicated row, not a wrong date or description. | ||||||
is not in the test set yet
We have not measured it, so we show no figure for it. You can still convert one of its statements free, without an account: the balance check runs on any bank and tells you whether the rows add up to the balances printed on the statement. If we cannot read the layout, you find out before you pay anything.
We add banks in the order customers ask for them.
- Published, 10 statements and 300 rows or more
- Sample too small, counts only
- 95% interval
- Lower bound, the published figure
- Share of statements exact
The balance check on the test set
The same continuity check, on the statements this measurement read.
40 of 80 statements we could read tied out
50.0% of the statements in test set corpus/2026-10
A statement prints an opening balance, balances along the way and a closing balance. After we read a statement, we add its rows up against those printed balances, day by day where the bank prints a daily balance. That needs no truth file, so it runs on every statement we can read, on every bank, including the banks with no published figure.
It is a continuity check, not an accuracy measurement.
It catches
- A wrong amount or sign
- A missing row
- A duplicated row
It cannot catch
- A wrong date
- A wrong description
The balance check stands next to the test-set figure and never in its place. A statement that does not tie out is marked for review at the row where it breaks, and it is not counted against your plan's pages.
How we measure
Seven steps, in the order they run. Anyone with the counts below can repeat steps 4 and 5.
The test set
100 statements from 10 banks. Each one is a synthetic statement this run generated in that bank's layout. No statement a customer uploads ever enters the test set.
Where this test set's truth comes from
The truth for these statements is generated with them: the generator writes the rows first, renders them in the bank's layout and keeps the rows it wrote, and those rows are what we compare our reading against. A corpus of real statements would need a truth built independently of our output, a person recording every row or the bank's own export of the same period. This test set has neither.
Every row gets one verdict
We compare each row we read with the truth, and the row gets the verdict of its worst field.
- Exact
- Every field equals the truth.
- Formatting
- Same value, written differently, such as “SQUARE INC” against “Square Inc”. Counted as exact.
- Value
- A field differs: an amount, a sign, a date, a description or a check number.
- Missing
- A row on the statement that we did not produce.
- Extra
- A row we produced that is not on the statement, usually a header or footer line.
A statement is exact when none of its rows is value, missing or extra.
An interval over statements, not rows
Rows on one statement fail together: a layout we misread takes the whole statement with it. So the sample is the number of statements, not the number of rows, and we compute the 95% Wilson score interval over statements.
lower bound =p + z² / 2n − z √(p(1 − p) / n + z² / 4n²)1 + z² / n
p is exact statements divided by statements, n is the number of statements, z is 1.96 for 95%.
Worked example, JPMorgan Chase: 4 of 10 statements exact, so p = 0.40 and n = 10. Then z²/n = 0.384, z²/2n = 0.192 and the square-root term is 0.359, so the lower bound is (0.40 + 0.192 − 0.359) ÷ 1.384 = 0.168. JPMorgan Chase is published as at least 16.8%, not as the 40% we measured.
Rounded down, and a floor
We publish the lower bound rounded down to a whole percent, never up, so JPMorgan Chase's 16.82% is published as 16.8%. Where we show an interval to one decimal, we round it outward, the lower end down and the upper end up, so a shown bound never claims more than the math. A bank gets a figure from 10 statements and 300 rows; below that its row reads “Sample too small” with its counts. Rows exact and the weakest field are published as counts beside the figure, so the column you would retype is never hidden behind a good headline. Rows with a wrong amount or sign are published as a count, never as a rate: 0 of 4,030 would read as 100.00% and hide the rows that cost you an afternoon.
Every figure is versioned
Each figure names its test set (corpus/2026-10), the parser version that produced it (1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e) and the day it was measured (Oct 12, 2026). A new measurement is published as a new report. The old figures stay as they were published, so a number you quoted in a proposal can still be checked.
Re-run this measurement with
node scripts/accuracy.mjs --tag corpus/2026-10 --out reports/accuracy/corpus-2026-10/1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e.json.The balance check, reported separately
The upload figure above is computed without any truth file and catches different errors, so it is reported beside the test-set figure and never folded into it.
Check it yourself
Every count behind the figures above. Put a bank's statements and exact statements into the formula in step 4, round down, and you get the published figure.
Counts per bank, test set corpus/2026-10
| Bank | Statements | Exact | Rows | Rows exact | Wrong amount or sign | Lower bound | Published | Balance check |
|---|---|---|---|---|---|---|---|---|
| JPMorgan Chase | 10 | 4 | 419 | 144 | 0 | 16.81% | 16.8% | 4 of 8 |
| Bank of America | 10 | 4 | 387 | 140 | 0 | 16.81% | 16.8% | 4 of 8 |
| Wells Fargo | 10 | 4 | 379 | 134 | 0 | 16.81% | 16.8% | 4 of 8 |
| U.S. Bank | 10 | 4 | 395 | 141 | 0 | 16.81% | 16.8% | 4 of 8 |
| PNC | 10 | 4 | 421 | 153 | 0 | 16.81% | 16.8% | 4 of 8 |
| Truist | 10 | 4 | 429 | 146 | 0 | 16.81% | 16.8% | 4 of 8 |
| Capital One | 10 | 4 | 430 | 153 | 0 | 16.81% | 16.8% | 4 of 8 |
| TD Bank | 10 | 4 | 373 | 144 | 0 | 16.81% | 16.8% | 4 of 8 |
| Fifth Third | 10 | 4 | 387 | 133 | 0 | 16.81% | 16.8% | 4 of 8 |
| Citizens | 10 | 4 | 410 | 146 | 0 | 16.81% | 16.8% | 4 of 8 |
| 10 banks | 100 | 40 | 4,030 | 1,434 | 0 | 40 of 80 |
Lower bound: the 95% Wilson score lower bound, rounded down to two decimals. Balance check: the test-set statements whose rows add up to the balances the bank printed. The file adds the upper bounds and the test statement and row of each wrong amount or sign.
Download the counts (CSV)Recompute a figure
- If the bank has fewer than 10 statements or 300 rows, stop: its sample is too small to publish.
- Take the bank's statements as n and its exact statements divided by n as p.
- Put both into the formula in step 4 with z = 1.96.
- Round the result down to a whole percent. JPMorgan Chase: 4 of 10 gives 16.82%, published as 16.8%.