Bank statement OCR for transaction reconciliation

A bank statement opens with account and period info, then a chronological transaction table and a reconciliation summary. Here is how to read it.

What a Bank Statement looks like

Bank Statement — sample layoutannotated
Account holder & bank
Whose account it is and which institution, plus a masked account number.
Statement period
The date range the statement covers.
Opening & closing balance
The balance at the start and end of the period — they should reconcile with all activity in between.
Transactions
Every line: date, description/payee, and amount (debit or credit).
Total deposits & withdrawals
Summed inflows and outflows for the period.
Fees & interest
Any service charges or interest earned during the cycle.

Illustrative layout for education. A real bank statement may vary by issuer.

Evaluate this workflow

For bookkeeping and document-intake teams

Preserve transaction signs and statement periods before importing rows.

Check before you accept a record

  • Keep debits negative and credits positive in transaction data.
  • Compare opening balance, deposits, withdrawals, and closing balance.
  • Check multi-page continuity and account last-four identifiers.

An exception to hold for review

A $100 balance mismatch requires source review. Extraction alone does not determine whether the statement is authentic.

Run a small evaluation

  1. Extract the statement and transaction rows.
  2. Reconcile signs, period boundaries, and balances against the source.
  3. Import reviewed rows and retain unmatched items.

Record the number of files submitted, failed files, required-field corrections, and minutes spent reviewing each file. Those observations tell you whether this workflow fits your documents; a sample response does not measure extraction accuracy.

Example reviewed September 16, 2026 against the configured field names. Fictional values, partial field set, and a suggested human workflow; not a recorded extraction or a promise of automatic approval.

A measured synthetic extraction

On September 16, 2026 Pacific time, we sent one labeled text PDF for this document type to our production extraction service. It returned HTTP 200 in 5.39 seconds, including network time. This was a backend request, not a test of signup, payment or the complete upload interface.

1 selected field comparison differed after the production field mapping. Successful delivery does not establish extraction accuracy.

Inspect the field differences
[
  {
    "path": "account_number_last4",
    "expected": "0000",
    "actual": null,
    "actualMissing": true
  }
]

Expected values were fixed before the run. Comparison uses exact values and types, checks the expected object fields and requires exact array lengths. A numeric string differs from a number; missing and null values differ. These easy, clearly labeled synthetic pages do not represent scanned documents, complex official forms or customer accuracy. One observation cannot establish typical latency.

Field contract correction

We replayed the same recorded response after correcting field aliases, declared tax-number types and bank last-four handling. This is an offline replay, not another extraction request. 0 selected field comparisons still differ from the original expected sample. The original benchmark stays available; unsupported distinctions and source wording are not invented to make the comparison pass.

Inspect the corrected mapping results

Download the 15-page synthetic input packetDownload expected and returned fields

Illustrative structured output

These synthetic values explain the field layout; they are not a measured extraction result or an accuracy benchmark. Actual coverage depends on your document.

{
  "bank_name": "Example Bank (fictional)",
  "account_holder": "Example Workshop",
  "account_number_last4": "0000",
  "statement_period_start": "2026-08-01",
  "statement_period_end": "2026-08-31",
  "beginning_balance": 1000,
  "total_deposits": 500,
  "total_withdrawals": 200,
  "ending_balance": 1300,
  "transactions": [
    {
      "date": "2026-08-05",
      "description": "Sample deposit",
      "amount": 500
    },
    {
      "date": "2026-08-10",
      "description": "Sample payment",
      "amount": -200
    }
  ]
}

Try the interactive sample without signupReview CSV, Excel, and JSON exportsSee the extraction API

Extract from your own bank statement — 3 free, no credit card

Want the Bank Statement extraction guide?

Get a free step-by-step guide to extracting and reviewing data from Bank Statements — plus tips for recurring workflows.

Free. No credit card. Unsubscribe anytime.

FAQ

What does a Bank Statement look like?

A bank statement opens with account and period info, then a chronological transaction table and a reconciliation summary. Here is how to read it. The annotated example above shows each region and what it contains.

Can I use this Bank Statement sample as a template?

Use it to understand the layout and fields. When you need the actual data off a real bank statement, upload it and get structured JSON/CSV back — no manual typing.

How many months of bank statements do lenders want?

Two to three months is typical for mortgages and business loans, though it varies by lender and product.

What is the difference between available balance and statement balance?

The statement balance is fixed at the end of the cycle; the available balance is your live balance minus pending holds.

This page shows an illustrative Bank Statement example for educational purposes and is not tax, legal, or financial advice.