DocPro ยท Agent

PTAS DocPro Bank Statement Agent

PDF, scan or export from any bank: date, narration, amount and balance split out cleanly, with balances checked page to page.

Calculator resting on ledger sheets printed with columns of running figures, in warm sepia tones

Input

What the Bank Statement Agent reads

A statement is a ledger that has to reconcile against itself. Reading it correctly means proving that, not just lifting the rows.

Reads

Bank PDFs

Statements downloaded from net banking, in whichever column order and date convention that bank uses this year.

Reads

Scans and passbooks

Printed statements and stamped passbook pages, photographed or scanned, with image quality reported as confidence rather than refusal.

Reads

CSV, XLS and MT940 exports

Exports arrive already structured and still need the same enrichment and the same continuity proof, so they run through the same agent.

Detects

Columns and direction

Debit, credit, balance and value date identified per statement. Single-column layouts with Dr and Cr markers are resolved to a signed amount.

Detects

Date conventions

Day-first, month-first and two-digit years settled from the sequence of the whole statement, not guessed one row at a time.

Reads

Multi-currency and multi-account

Each transaction keeps its own currency. A statement covering several accounts is split into one ledger per account.

Output

What comes back for each row

Every transaction returns as a typed row, and the statement as a whole returns with a verdict on whether the rows add up. The figure is one page of seven.

Statement page 3 of 7 · Illustrative example

Narration Amount Balance
Opening balance carried forward — ₹ 18,42,910
NEFT MERIDIAN COMPONENTS UTR N2608141 − 2,70,220 ₹ 15,72,690
Bank charges — outward remittance − 590 ₹ 15,72,100
RTGS NORTHGATE LOGISTICS UTR N2608147 − 1,18,400 ₹ 14,53,700
Closing balance — carried to page 4 — ₹ 14,53,700
Balanced Opening plus every line read equals closing, and closing carries to the next page.

When that sum does not hold, the extraction is reported as incomplete rather than returned looking clean. It is usually a page that never arrived.

Balance proved

Opening plus every row equals closing, on every page.

Narration parsed

UTR, counterparty and invoice reference lifted out of free text.

Typed rows

Date, signed amount, balance, currency and transaction type.

Validation and confidence

The balance is the checksum

If the running balance does not carry from one page to the next, something was missed. The honest output is to say so rather than hand back a clean-looking file.

What the agent findsWhat happens
Opening plus rows does not equal closing on a page Statement returned as incomplete, with the page and the gap amount named
A page is missing from the PDF or scan Caught by the carry-forward check; the missing page number is reported
Debit or credit direction ambiguous on a row Resolved from the balance movement; flagged if the balance does not confirm it
Date format ambiguous, such as 04/08 against 08/04 Settled from the statement sequence; flagged when the sequence cannot settle it
Narration reference matches no open invoice Returned unmatched with the parsed reference, for reconciliation to resolve
Row score below your threshold That row goes to a reviewer with the field in doubt named; the rest of the statement proceeds

Confidence on a statement is per row, and per field within the row. A clean PDF scores near the top on everything. A photographed passbook scores well on dates and balances and lower on narration, because stamp ink and handwriting sit over it. The continuity proof is separate from confidence: a statement can read with high scores on every row and still fail to balance if a page never arrived.

Review is a control, and on statements it has one specific job: settle the rows the agent could not. A reviewer sees the row, the two candidate readings and the balance movement that argues for one of them. The choice is logged, and the balance proof is re-run with the corrected row before the statement is released. A held row is the check doing its work, not a reading that failed.

Illustrative output

One page of a statement, as reconciliation receives it

The second row of the page in the figure above, in full. Account, counterparties and amounts are invented for this page and are not customer data.

On the statement

Page 3 of 7Carried forward
Opening balance₹ 18,42,910
Row 2 as printedWithdrawal
NarrationNEFT MERIDIAN COMPONENTS UTR N2608141
Amount2,70,220.00
Balance15,72,690.00
Page footTo page 4
Closing balance₹ 14,53,700

Returned (illustrative)

{
  "document_type": "bank_statement",
  "account_last4": "4471",
  "period": "2026-08-01/2026-08-31",
  "page": 3,
  "pages_total": 7,
  "opening_balance": 1842910.00,
  "closing_balance": 1453700.00,
  "continuity": "balanced",
  "transactions": [
    {
      "row": 2,
      "value_date": "2026-08-14",
      "narration": "NEFT MERIDIAN COMPONENTS UTR N2608141",
      "amount": -270220.00,
      "balance": 1572690.00,
      "type": "neft_out",
      "counterparty": "Meridian Components",
      "reference": "N2608141",
      "confidence": {
        "value_date": 0.99,
        "amount": 0.99,
        "counterparty": 0.94,
        "reference": 0.97
      }
    }
  ],
  "review": []
}
The continuity field is the one reconciliation should read before anything else. If it says incomplete, the page and the gap are named in the same record, and no row from that page is treated as final until the gap is explained.

Downstream

After the rows are read

Typed rows are the input to reconciliation, not the result of it. These pages cover the matching and the posting.

At the volumes banks, NBFCs and insurers handle, the rows are usually delivered as a batch at month end rather than one statement at a time. Delivery into your ledger or treasury system uses a native, API, file or custom route, scoped during assessment. See DocPro Integrations.

FAQ

Questions Teams Ask

Which banks are supported?

Any bank, because there is no per-bank template to maintain. The agent works out the column layout, the date convention and the balance direction from the statement itself, so a bank nobody has mentioned before behaves like one we see daily. A genuinely new layout shows up as lower confidence on the affected columns, not as a refusal.

How do you know the extraction is complete?

The running balance is the proof. Opening plus the rows read has to equal closing on every page and across the statement. When it does not, the extraction is reported as incomplete rather than returned as if it were fine. That is how missing pages usually surface.

Can it read a scanned or photographed statement?

Yes, including passbook scans and pages photographed at an angle. Image quality affects confidence rather than causing a refusal, and low-confidence rows are flagged individually instead of the whole statement being rejected.

What is returned for each transaction?

Value date, narration, a signed amount, running balance, currency, a transaction type where it can be determined, and whatever was extractable from the narration: counterparty, reference, UTR. Each field carries its own confidence score, and the statement as a whole carries the continuity verdict.

Does it categorise transactions against our chart of accounts?

It types them: NEFT, RTGS, UPI, cheque, charge, interest, reversal, where the narration and the bank's own markers make the type clear. Mapping to your chart of accounts is reconciliation work and happens in FinSuite or your own system, using the typed rows and the parsed references.

Next step

Send the statement nothing else reads

The scanned one, the multi-currency one, the passbook. Upload one now, or bring a quarter of them to a demo.