DocPro · Bank Statement Agent

Bank statement parser that reads PDFs, scans, and phone photos — and gives you transactions, not text.

Send a statement from any bank in any format. The agent figures out the bank, parses every row into a typed transaction, checks the math against opening and closing balances, and returns JSON your underwriting system can use straight away. No regex per bank. No re-keying. No second OCR vendor on top.

Bank statement OCR vs. ADE

What you actually get back changes everything downstream.

Bank statement OCR is solved technology. The hard part is what comes after — figuring out which column is the debit, which line is a balance carry-forward, and whether the totals add up. The agent does that work, every time.

Legacy OCR What an OCR API gives you

  • A wall of text with column boundaries you have to rebuild for every bank.
  • Date strings in six different formats. You write the parser.
  • Multi-page PDFs with repeating headers that confuse row extraction.
  • No classification. No reconciliation. No confidence score per row.

DocPro Agent What the bank statement agent returns

  • Typed JSON rows: date, description, debit, credit, balance, mode, category.
  • Dates normalised to ISO 8601. Amounts as numbers, not strings.
  • A reconciliation check: opening + sum(transactions) = closing, or it gets flagged.
  • Multi-page handling that ignores reprinted headers and footer disclaimers.
  • Confidence score per row, plus account metadata as its own block.
  • Auto-classified transactions: salary, EMI, vendor, GST, UPI, transfer, ATM, fee.
What the agent extracts

Every field a credit policy or audit trail actually needs.

You can ask for less. You can ask for more. The default schema below covers what most lending, KYC, and reconciliation workflows ask for on day one.

Account metadata

Account holder name, masked account number, IFSC or SWIFT, branch, statement period, statement type (savings, current, OD, NRE).

account_holderifscaccount_typeperiod_from

Balances

Opening balance, closing balance, average monthly balance computed from the statement itself, and a reconciliation flag that fails loudly if the math does not close.

opening_balanceclosing_balanceambreconciled

Transactions

Date, narration as printed, parsed counterparty, debit, credit, running balance, transaction reference, and the channel (NEFT, RTGS, IMPS, UPI, ATM, cheque, cash).

txn_datecounterpartydebitmode

Auto-classification

Each row is tagged with one of about 30 categories — salary, rent, EMI, vendor payment, GST, refund, cash withdrawal, interest credit, charge. You can override the taxonomy.

categorysubcategory

Risk flags

Returned cheques, bounce charges, ECS failures, minimum balance penalties, and any negative-balance days. The flags surface as their own list — no need to grep the narration.

bouncesmin_bal_breach_days

Summary block

Total credits, total debits, count of salary credits, average inflow, dispersion of dates, and a stability score for income — the numbers credit policy teams ask for first.

total_creditssalary_inflowsincome_stability

How the agent works

From a PDF you got over email to clean JSON, in a single call.

  1. Ingest

    Send the file as multipart upload or base64. Multi-page PDFs, scans, photos, password-protected PDFs — all the same endpoint.

  2. Identify

    The agent detects the bank and the statement layout. No need to tell it whether the statement is from SBI or Kotak.

  3. Extract & reason

    Rows are read top to bottom across pages, columns aligned, dates normalised, amounts cast to numbers, categories assigned.

  4. Validate

    The balance math is checked. Anomalies are flagged. Low-confidence rows route to a human review queue if you want one.

One endpoint

Send a statement. Receive structured JSON.

A single REST call. SDKs ship for Python, Node.js, Java, and .NET. Webhooks if you prefer async.

Where teams put this to work

Built for the workflows that wait on bank statements.

If your team blocks on parsing bank statements before a decision can be made, the agent shortens the loop.

Credit underwriting & lending

Six to twelve months of statements parsed, classified, and summarised. Income stability, EMI burden, salary regularity, and bounce history land in your scorecard the moment the borrower uploads files.

Used by digital lenders, NBFCs, MSME loan teams

KYC top-up & income verification

When AA consent flows do not cover the customer — joint accounts, walk-in branches, offline cases — the agent handles the scanned statement they uploaded instead. Same JSON, same fields.

Used by banks, fintech onboarding teams

Bank reconciliation

Match the statement against your ledger entries without a finance analyst typing rows into Excel. Pair this agent with our AP Automation module and reconciliation runs end to end without intervention.

Used by mid-market finance teams

Audit & forensic sampling

Auditors get standardised transaction-level data across every client in the audit pack. Sampling, anomaly checks, and related-party flagging stop being a copy-paste exercise.

Used by CA firms, internal audit teams

98–99.5%
Row-level accuracy · native PDF
94–97%
Row-level accuracy · photo / scan
< 12s
Typical 12-month statement
Security & compliance

Bank statements are sensitive. We treat them that way.

Region-pinned data residency, encryption end to end, and no training on your customer data. The boring details that matter when legal reviews the contract.

Encrypted in flight and at rest

TLS 1.2+ in transit, AES-256 at rest. Password-protected PDFs unlocked in memory; passwords are not retained.

Data stays in your region

Pin processing to ap-south-1, eu-west-1, or us-east-1. On-premise and air-gapped deployments available for regulated environments.

DPA before document one

We sign a data processing agreement before the first statement moves. No customer data is used to train shared models. Retention is configurable down to zero.

Common questions

Questions we get from credit, risk, and engineering teams.

Is this just bank statement OCR with a different name?

No. OCR returns a wall of text and leaves you to figure out which numbers are debits, which are credits, and which one is the running balance. The bank statement agent returns each transaction as a typed row with date, description, debit, credit, running balance, mode, and a category tag. It also checks that opening balance plus the sum of transactions matches the closing balance and flags the statement if it does not.

Can it handle scanned statements and phone photos?

Yes. The pipeline handles skewed scans, low-resolution images, rotated pages, and photos taken with a phone camera. Quality affects confidence, not parsing. Low-confidence rows get routed to the review queue rather than posted as bad data.

What about password-protected PDFs?

You can pass the password with the request and the agent unlocks the PDF in memory. Nothing is stored in cleartext. The password is purged the moment extraction completes.

How accurate is it on long, messy statements?

On native PDFs from the supported banks, transaction-level accuracy lands between 98% and 99.5%. On photographed and low-resolution scanned statements, it drops to roughly 94% to 97% depending on lighting. Every field carries a confidence score, so your workflow can auto-accept high-confidence rows and route the rest to a reviewer.

Does it replace account aggregator (AA) consent flows?

It complements them. Account aggregator is the right path when the borrower has digital banking and consents to share. The agent handles the long tail: scanned statements, walk-in customers, joint accounts where AA coverage is patchy, and offline workflows where consent flows are not practical.

How do we integrate it?

One REST endpoint. Upload the file, optionally pass a password, receive structured JSON. SDKs ship for Python, Node.js, Java, and .NET. Webhooks are available for async batches. Most teams have it wired into their loan-origination or KYC system inside a day.

Where is the data stored?

In the cloud region you pick on AWS, Azure, or Google Cloud. On-premise and air-gapped deployments are available for regulated environments. We sign a DPA before the first statement moves.

What does pricing look like?

Per page processed, with volume tiers. Indicative pricing: around ₹3 to ₹6 per page in the 100k–1M monthly band, lower above that. Sandbox runs are free — send a batch and we share back the JSON and a unit price for your real volume.

Try it on your own statements

Send us a real statement. Get the JSON back tomorrow.

No demo environment. No fake sample files. Send a real statement from your hardest bank format, in any quality, and we share the parsed JSON within a working day. No credit card. No sales call to run the first batch.