Home
/
Document Types
/
Bank Statements
DOC TYPE · BANK STATEMENTS

Bank statements, reconciled

Sensible reads the bank formats you see most with layout-based configurations written for that exact statement, and sends everything else through a general LLM configuration. Both return the same fields in the same shape, so your code never has to know which one ran.

A Cascade Bank checking statement for April 2024 with eleven transactions, beside the values Sensible extracted from it: an ending balance of 8,162.95, its page and row on the statement, and a passed running-balance check

cascade_checking_apr2024.pdf · 1 page · 11 transactions

Layout + LLM

Blended extraction pipeline

One schema

The same output from either path

SOC 2 + HIPAA

Certified infrastructure

Page + box

Source location on every value

Trusted by teams turning documents into production data

One April statement, worked end to end

A sample checking statement with eleven transactions and a table that breaks across a page. Four things happen to it on the way to JSON.

01

Header and account metadata located and typed from the top block.

02

All 11 transactions anchored across the table, including a page break mid-cycle.

03

A validation in the configuration checks beginning balance plus deposits minus withdrawals against the printed ending balance.

04

Typed JSON returned with a bounding box on every single value.

STATEMENT PERIOD
04/01/2024 – 04/30/2024
Beginning balance
$3,322.14
Total deposits (+)
+$6,294.32
Total withdrawals (−)
−$1,453.51
Ending balance
$8,162.95
11 transactions
✓ Balance check passed

Built for teams who reconcile real money.

Balances you can check

Write the arithmetic into the configuration as a validation. A statement that doesn’t add up comes back with the error attached.

Pixel-level provenance

Every extracted value carries its exact page and bounding box, back to the original PDF.

Templates plus LLM fallback

Mapped banks get a fast template. New layouts flow through an LLM template with the same output schema.

Under the Hood

A plain LLM prompt breaks on a real bank statement

Agentic parsers are fast to demo and slow to trust: they hallucinate pennies, lose rows past a context window, and hand you a number with no way to check it. Sensible runs a layout configuration when one exists for the format and a general LLM configuration when it doesn’t, and puts both through the same schema and validations.

Raw LLM prompting
Template / rules-only OCR
Sensible (layout + LLM)
Continuous tables past 30+ pages
✕
TEMPLATE-LOCKED
✓
Balance checks on the output
✕
✕
✓
Exact page + bounding box per value
✕
PAGE-LEVEL ONLY
✓
Reads a bank format it hasn’t seen before
✓
✕
✓
Same output schema across banks
Depends on the prompt
One per template
✓
Same answer on every re-run
✕
✓
On layout configurations
1
Known formats get a layout configuration

For the banks you see often, a SenseML configuration anchors on that statement’s own headers and columns, so the table reads the same way every time.

2
Continuous Multi-Page Table Anchors

SenseML table methods track table headers across page boundaries without dropping rows on multi-page statements.

3
Exact Audit Trails to Source Coordinates

Every single transaction row retains its exact bounding box and page index for compliance audits.

From rules to results: four steps between your PDF and a number you can trust

This is the pipeline underneath every extraction. Known formats are read by layout rules and everything else by the general LLM configuration. Both paths finish in the same validation step.

01

OCR & layout parse

Native text and scanned pages are both normalized into a coordinate-anchored layout tree; every character keeps its page and pixel position.

02

Layout-based field location

SenseML anchors locate the header block, balance summary, and transaction table using structural rules matched to the bank’s known format.

03

The general LLM configuration

A statement with no matching configuration is read by an LLM configuration that returns the same fields as the layout path.

04

Schema validation & type casting

Fields are cast to their declared types and run through the validations you wrote before the JSON comes back.

Production Reliability

Where bank statement parsing breaks in production

Long tables, sign conventions and combined accounts are where generic parsing goes wrong.

01

Multi-page transaction tables

Statements frequently span 10, 30, or 100+ pages with repeated headers, variable column widths, multi-line wire descriptions, and footnote breaks. Deterministic SenseML table anchors parse transactions continuously across breaks without losing row alignment.

02

Running balance arithmetic

Do all transaction credits and debits equal the stated period change? Does the running balance reconcile after every single row? Validations in the configuration check both, so an OCR misread shows up as an error instead of a wrong number downstream.

03

Signs, dates and money in or out

One bank prints debits in their own column, another adds DR, another uses parentheses, and on a UK statement 04/05 means 4 May. Sensible returns one signed amount and one date format however the bank printed them.

04

Multi-account package splitting

Banks frequently bundle commercial checking, operating reserves, and money market schedules into a single PDF packet. Sensible isolates each account schedule and extracts them into discrete, cleanly keyed sub-ledgers.

Automated Reconciliation

How the ledger math gets checked

A single OCR typo in a transaction amount ruins downstream debt-to-income and cash flow modeling. The checks are validations written into the configuration: beginning balance plus credits minus debits has to equal the ending balance, and each running balance has to follow from the row above it. A statement that fails comes back with the error attached.

Reconciliation status
CHASE-...8842
✓
Beginning balance found
Read from the account summary on page 1
$124,660.90
✓
Transactions sum to period totals
All 38 credits & debits sum exactly to +$42,500.00 / −$18,240.50
+$24,259.50
✓
Ending balance reconciles
Beginning balance + total deposits − total withdrawals = ending balance
$148,920.40
✓
Running balance continuous
Every row balance equals previous row plus transaction amount
38 / 38 rows pass
!
A check that fails
Transactions sum to +$42,500.00 but the summary reads +$45,200.00. The extraction comes back with a validation error, so it goes to review instead of into the model.
validation error
Customer review

I like the coding nature of Sensible’s interface because it makes it really easy to understand why an extraction is or isn’t doing what I expect. Their support team is excellent at helping with models, and they were really good at assisting us through the quite involved setup process.

G2 review, bank statement extraction customer
Use Cases

Built for high-volume financial workflows

Delivering verified financial feeds directly to underwriting models, ERPs, and risk engines.

SME Lending & MCA Underwriting

Calculate Debt Service Coverage Ratios (DSCR), monthly revenue velocity, average daily balances, and NSF instances directly from verified transaction feeds.

Lending & Credit

Automated Bookkeeping & ERP Sync

Feed cleared transaction tables directly into NetSuite, QuickBooks, or Xero with continuous bank reconciliation and double-entry validation.

Accounting & ERP

Mortgage & Income Verification

Instantly verify borrower cash reserves, check deposit sourcing, and validate recurring payroll income without human line-item reviews.

Mortgage & VOI

Corporate Treasury & Liquidity

Consolidate multi-bank balances across dozens of institutions into a unified cash visibility ledger with automated sweep auditing.

Treasury Ops
Common questions

Questions from engineering & risk teams

Starting with the one everyone's actually asking now that LLMs can read PDFs.

Can’t I just prompt GPT-4 or Claude on the PDF directly?+

You can, and it'll work great on page one of a demo. It also has no way to prove a balance is right, no fixed output schema across runs, and it silently drops or merges rows on long tables. Sensible uses LLMs too: statements from banks without their own configuration go through a general LLM configuration. Its output lands in the same schema as the layout path and runs through the same validations, so a number that doesn’t add up comes back flagged.

How does arithmetic validation catch OCR errors and hallucinations?+

The configuration includes validations that compare beginning balance, total credits, total debits and ending balance, and that check each running balance against the row before it. If OCR reads a $1,200.00 charge as $1,700.00, the totals stop matching and the extraction returns a validation error naming the check that failed.

How does Sensible handle multi-page bank statements where tables span 20+ pages?+

Sensible uses deterministic SenseML table definitions paired with layout-aware anchors. It recognizes column boundaries, multi-line transaction narratives, and page break headers, stitching rows together into a single continuous transaction array without skipping lines or misaligning debits and credits.

What happens when you hit a bank format we haven't templated yet?+

It goes to the general LLM configuration and returns the same schema as every other statement. If that format shows up often in your volume, you or our team can write a layout configuration for it in SenseML, and Sensible routes those statements to it from then on.

Can Sensible split statements that combine multiple accounts in one PDF?+

Yes. Commercial banking statements frequently package checking, savings, payroll, and sweep accounts into a single file. Sensible classifies and partitions the document into individual account schedules, returning discrete JSON objects with their own account numbers, balance summaries, and transaction tables.

How is financial data protected?+

Sensible is SOC 2 Type II certified and HIPAA compliant.

Try Sensible on your documents.

Bring the document your team dreads. If it works on that one, you'll know.

14-day free trial on the Growth Plan · No credit card