Bank statement APIs: how they work, what they return and how to choose one

For developers and product teams at lenders and fintechs. It sets out the three kinds of bank data API, what a statement extraction API returns, and what to test before you choose one.

Key takeaways

  • A bank statement API takes a statement PDF or scan and returns the account details and balances, plus every transaction, as JSON. Many also run checks, such as whether the balance after each transaction adds up.
  • Bank data APIs come in three kinds. Account verification APIs confirm an account exists and belongs to your customer. Open banking APIs pull transactions or statements straight from the bank, with the customer's permission.
  • Check the response before you trust it. The opening balance plus money in minus money out must equal the closing balance. Each balance after a transaction must also follow from the one before.
  • Published prices run from per statement ($0.25 at Veryfi, $0.75 for Google's bank statement parser) to per 1,000 pages ($10 for Azure's prebuilt models) to quoted plans. Test on your own statements before comparing prices.
On this page
  1. Bank statement APIs vs account verification and open banking APIs
  2. How a bank statement API works
  3. What the response looks like
  4. How to choose a bank statement API
  5. Bank statement APIs compared
  6. Why one statement's JSON isn't enough to decide on
  7. Frequently asked questions

A bank statement API reads a statement PDF or scan. It returns the account details and the balances, plus every transaction, as JSON. Many also run checks, such as whether the balance after each transaction adds up. Lenders and fintechs call one when customers upload statements, so nobody retypes them. It differs from an account verification API, which confirms an account exists and belongs to your customer. It also differs from an open banking API, which pulls data straight from the bank with the customer's permission.

Vendor details below come from each vendor's own site and documentation, checked in September 2026. Links are in the sources at the end.

Which bank data API do you need?

If customers upload statements as PDFs or scans
Docsumo (our product) or another statement extraction API. Docsumo returns the account details and balances, plus every transaction, as JSON. It checks running balances and sends unsure fields to a reviewer.
If you need to confirm an account before moving money
An account verification API such as Plaid Auth, which returns verified account and routing numbers from a bank login. See instant bank account verification.
If customers will log in to their bank
An open banking API such as Plaid Transactions, which returns up to 24 months of transactions. Akoya returns statement PDFs from the customer's bank or brokerage.

Bank statement APIs vs account verification and open banking APIs#

Three kinds of API get called a "bank statement API" or a "bank verification API". They take different inputs and prove different things.

A statement extraction API takes the statement file, digital or scanned, and returns the account details and the balances, plus the transactions, as JSON. It suits statements that customers upload, including from banks that no open banking API reaches.

An account verification API takes account and routing numbers, or a bank login. It tells you whether the account exists, is open and belongs to the customer. Use it before you debit or pay an account.

An open banking API starts with the customer's permission, given at their bank. It returns transactions and balances from the bank, or the bank's own PDF statements. Use it when the customer will log in.

When a statement API says it verifies, it checks the statement file itself. The statement must be complete, the numbers must add up, and the account must belong to the applicant. For the checks lenders run on top, see bank statement verification software.

How a bank statement API works#

Many statement APIs are asynchronous, which means they don't answer right away. When your app uploads a file, it does not wait for the result.

  • Statement PDFs
  • Scans
  • Multi-month files
API
  1. 01Upload by API
  2. 02Extract fields and rows
  3. 03Reconcile balances
  4. 04Flag low-confidence fields
Webhook JSON to your app
From an uploaded statement to JSON in your app

Your app uploads the file and gets a document ID back straight away. The service reads the header, the summary and every transaction row, and joins tables that run across pages. The better ones then check that the balances add up and flag values they aren't sure about. Some hold those for a person to review. When the statement is done, a webhook tells your app to fetch the JSON. Polling for the status works too.

What the response looks like#

Field names differ between vendors. A useful response still carries the account, the period and the balances, then every transaction with the page it came from. It ends with the results of the checks.

Account
FieldExtracted valueConfidence
Account holderHarbor Street Bakery LLC
Address118 Harbor St, Portland, ME
Bank nameFirst Midwest Bank
Account number•••• 4821
Account typeBusiness checking
Statement period2026-07-01 → 2026-07-31
A statement being read, from the header and balances down to each transaction row. A statement API returns these same parts as JSON.

The response below uses the schema from our guide to converting bank statements to JSON.

{
  "document_type": "bank_statement",
  "bank_name": "Example Bank",
  "account_holder": "Acme Supply LLC",
  "account_number_last4": "4821",
  "account_type": "checking",
  "currency": "USD",
  "period_start": "2026-07-01",
  "period_end": "2026-07-31",
  "opening_balance": 12450.00,
  "total_credits": 6200.00,
  "total_debits": 10570.50,
  "closing_balance": 8079.50,
  "transactions": [
    {
      "date": "2026-07-02",
      "description": "ACH CREDIT STRIPE PAYOUT",
      "debit": null,
      "credit": 6200.00,
      "balance": 18650.00,
      "page": 1
    },
    {
      "date": "2026-07-03",
      "description": "CHECK 1045",
      "debit": 2150.00,
      "credit": null,
      "balance": 16500.00,
      "page": 1
    },
    {
      "date": "2026-07-15",
      "description": "ACH DEBIT PAYROLL",
      "debit": 8420.50,
      "credit": null,
      "balance": 8079.50,
      "page": 2
    }
  ],
  "checks": {
    "balances_reconcile": true,
    "running_balances_chain": true,
    "dates_within_period": true
  },
  "needs_review": [
    { "field": "transactions[2].description", "confidence": 0.64, "page": 2 }
  ]
}

Look for three things in the JSON that any vendor's API returns.

  • Amounts as numbers, not text. Money out and money in sit in two separate fields, or in one field with + and − signs. Never both.
  • A page for every transaction, so a reviewer can find the line on the statement.
  • Check results and flagged fields, so your app knows whether to use the data now or wait for a person.

Some statement APIs also return analysis. That includes categorized transactions, true revenue and average daily balance, which bank statement analysis explains. Docsumo's cash flow analytics are on the Enterprise plan. Its field names and the upload and webhook calls are in its API documentation.

How to choose a bank statement API#

Run each check on 50 to 100 of your own statements. Clean samples make every API look good.

  • Bank coverageStatements from the banks and credit unions your customers actually use, not just the largest banks.
  • Scans and photosFaint scans and phone photos, not only clean digital PDFs.
  • Tables across pagesTransactions that run across pages come back as one table, with nothing dropped or doubled at the page break.
  • Balance checksOpening and closing balances reconcile and every running balance is checked, so a misread amount can't pass silently.
  • Confidence scores and reviewUncertain values are flagged, and a person can check them against the source line before your app uses them.
  • WebhooksA callback when each statement is done, so your app doesn't have to poll.
  • SecurityA SOC 2 Type 2 report, encryption, data retention you control and a plain answer on whether your files train shared models.
  • Pricing modelPer page, per statement or per plan. Model it on your real page counts, because 12 months of statements from a busy account can run to dozens of pages.

Bank statement APIs compared#

Docsumo is our product, so it's first. It reads the statements your customers upload. It doesn't connect to bank accounts or make the credit decision. Its bank statement extraction joins transaction tables that run across pages, checks running balances and sends uncertain fields to a reviewer. Cross-document validation, which checks statements against the rest of the file, is on the Enterprise plan. It's cloud only, and results reach your app through the API and webhooks.

  • 99%field-level accuracy across 250+ document types
  • 94%+accuracy at Grid Finance
  • <1 minper complex bank statement at Grid Finance
ToolInputReturnsChecksPricing
Statement extraction APIs4 tools
DocsumoOur productPDFs and scansAccount detailsBalancesTransactionsRunning balances; unsure fields to reviewFree trial; quoted plans
OcrolusStatements, pay stubs, tax documentsExtracted dataAnalyticsFraud detection, cash flow and income analysisNot published
VeryfiPDFs and scansBalancesTransactionsFraud detection (add-on)$0.25 per statement ($500/mo minimum)
DocuClipperPDFs, scans, imagesTransactionsBalancesChecks against printed balancesFrom $20/mo for 60 pages (annual)
Cloud document AI2 tools
Google Document AIPDFs and imagesAccount detailsBalancesTransactionsNot described$0.75 per document
Azure Document IntelligencePrinted US statementsAccountTransactionsFeesNot described$10 per 1,000 pages
Open banking APIs2 tools
PlaidCustomer's bank loginTransactionsBank PDF statementsData comes from the bankNot published
AkoyaCustomer's permissionBank PDF statementsData comes from the bankNot published

For a wider list of statement tools, including bookkeeping converters and enterprise platforms, see the best bank statement extraction software.

Why one statement's JSON isn't enough to decide on#

We'd judge a statement API by how it handles the whole loan file, not one statement. A loan decision needs several documents to agree. So checks that compare documents matter more than one perfectly read page. Whichever API you pick, decide before you start building which system will run the checks that compare statements.

A statement API fits when customers hand you statements. It turns each PDF or scan into JSON that your app can check and use. To confirm an account before moving money, use an account verification API. When customers will log in to their bank, an open banking API gets transactions without any documents. One lender can use more than one, with account verification before funding and statements for underwriting.

Docsumo covers the statements. It reads them, checks the balances and sends uncertain fields to a reviewer, then passes the data to your app through the API and webhooks. Cross-document validation is on the Enterprise plan. More on the lending workflow in IDP for lending.

Book a demo with a few of your own bank statements, or start a free trial.

Frequently asked questions#

What is a bank statement API?

A web service that reads bank statements. You send it a PDF or scan. It returns the account holder, account number and statement period, then the balances and every transaction, as JSON. Many also return the results of their checks and mark values they are unsure of, so your app knows which values to use now.

What's the difference between a bank statement API and a bank account verification API?

A bank statement API reads statements your customer uploads. An account verification API confirms that an account exists, is open and belongs to your customer. It does this through a bank login or an account database, before you move money. See instant bank account verification.

How do I get bank transactions through an API?

Two ways. With the customer's permission, an open banking API such as Plaid Transactions pulls up to 24 months of transactions from their bank. If the customer uploads statements instead, a bank statement API extracts the transactions from the files.

Is there a free bank statement API?

Several have free tiers or trials. Docsumo, our product, has a free 14-day trial for up to 1,000 pages, with the API and webhooks included. Veryfi processes up to 100 documents a month free. Azure Document Intelligence's free tier covers 500 pages a month, but it reads only the first two pages of each file. On the open banking side, Plaid's Limited Production allows 200 live API calls per product.

Can a bank statement API read scanned statements?

Extraction APIs that use OCR (software that reads text from images) can read scans. But they make more mistakes on faint or tilted pages. So look for a score that shows how sure the software is, and a way for a person to check the uncertain fields. Open banking APIs avoid the problem by getting the data from the bank, but only for banks they connect to.

How do I check a bank statement API's output?

Reconcile it in code before your app uses it. Opening balance plus credits minus debits equals the closing balance, every running balance follows from the last, and every date falls inside the statement period. Converting bank statements to JSON has a Python example.

See Docsumo read your own documents

Bring a few real samples. We'll show the fields extracted, the checks that ran and what a reviewer would see.