Bank statements in. Checked data out.
DocExtract reads a statement, pulls out every transaction, then tests the arithmetic. If the numbers don't add up, a person gets the file with the exact row highlighted.
How it works
Three steps, one API call.
Read the page
An open document model reads the page image and returns bank, period, balances and every transaction as structured JSON.
Check the math
Fixed rules test the result: opening plus transactions equals closing, each running balance follows the last, and printed totals match the rows.
Send doubts to a person
A file that fails comes back marked review, with a risk score and the row that broke, so a reviewer checks one line instead of the whole document.
The checks
All deterministic, so they don't depend on the model being right.
Reconciliation
Opening balance plus all transactions must equal the closing balance.
Running balance
Every row's balance must follow from the row before it. A break points at the edited or misread line.
Printed totals
Total deposits and withdrawals on the statement must match the sum of the rows.
Dates and duplicates
Dates inside the statement period and in order. Identical rows are flagged as a warning.
What it does not do
Read this before you rely on it.
- A failed check means "send to a human". Arithmetic can't tell a misread digit from a deliberate edit.
- An edit that keeps every balance consistent passes the checks. This is not fraud detection on its own.
- Image-level forensics (spotting pasted or altered pixels) is not built yet.
- It is a prototype. Accuracy has been tested only on clean, machine-made statements. Real scans and photos are untested.
- On a CPU-only server a page takes about a minute. The web app turns PDFs into page images in your browser; the API itself takes images.
Runs where your data lives
The model is open-weight and runs on your own server, so statements are not sent to a third-party AI service. You control retention, and the API requires a key.
Open the app