Bank Statements OCR API

Veryfi’s bank statements OCR API reads a statement PDF and returns the bank, account holder, balances, and every transaction as JSON, plus a fraud score. No bank login required, and at 99.9% accuracy, with fort knox data privacy & security.

Get Started for Free Free Demo
Bank Statements OCR API

POST /api/v8/partner/bank-statements · Live

Statement in. JSON out.

Veryfi’s Bank Statements OCR API reads a statement PDF and returns the bank, account, balances, and each transaction as JSON via POST /api/v8/partner/bank-statements. Reconciliation, lending, and spend tools use that payload instead of keying the lines — and without the customer’s bank login. See supported statement fields and the Process a Bank Statement docs.

0 fields snapping into JSON

What is a bank statement?

A bank statement is the bank’s record of one account for a period. It names the holder, the account number, the opening balance, each deposit and withdrawal, and the closing balance.

Lenders, bookkeepers, and spend apps need those lines as data. The API above returns that statement as JSON, without the customer’s bank password.

Did you know

The closing balance is not typed in on its own. It is the opening balance plus every credit, minus every debit. When the lines do not foot, a page is missing or a figure was changed.

Let’s Veryfi It

Interactive sample for service illustration. Test drive Veryfi — 14-day free trial, or speak to a Veryfi Expert.

Chase
Make more of what’s yours
chase.com · Checking statement
STMT-CH-202609-018 1 Oct 2026
Period 1–30 Sep 2026
Account holder
Bart Simpson
210 S B St, San Mateo, CA 94401, United States
Statement period
1–30 Sep 2026
Statement date
1 Oct 2026
Account number
••4418

Your activity summary

Opening balance 3,410.22
Total deposits + 6,216.00
Total withdrawals − 857.01
Closing balance = 8,769.21

Transaction details

Date Description Credit Debit Vendor Category Match
03 Sep PAYROLL DEP NORTHSIDE MEDICAL 6,216.00 Northside Medical Income
05 Sep ZELLE TO M SIMPSON 75.00 Zelle Transfers
08 Sep POS PURCHASE WHOLE FOODS 10418 45.67 Whole Foods Groceries
09 Sep TST* BLUE BOTTLE COFFEE 8.45 Blue Bottle Restaurants
11 Sep UBER TRIP *8A2K19 18.20 Uber Travel
14 Sep AUTOPAY PACIFIC GAS ELECTRIC 128.40 PG&E Utilities
16 Sep COMCAST CABLE COMM 89.99 Comcast Utilities
19 Sep POS PURCHASE SAFEWAY 1193 62.31 Safeway Groceries
22 Sep ACH DEBIT GEICO AUTO 400.00 GEICO Insurance
25 Sep APPLE.COM/BILL 16.99 Apple Software
28 Sep MONTHLY MAINTENANCE FEE 12.00 Chase Bank fees
Page 1 of 1 Routing 021000021
Chase
Make more of what’s yours
chase.com · Checking statement
STMT-CH-202609-018 1 Oct 2026
Period 1–30 Sep 2026
Account holder
Bart Simpson
210 S B St, San Mateo, CA 94401, United States
Statement period
1–30 Sep 2026
Statement date
1 Oct 2026
Account number
••4418

Your activity summary

Opening balance 3,410.22
Total deposits + 2,416.00
Total withdrawals − 857.01
Closing balance = 4,969.21

Transaction details

Date Description Credit Debit Vendor Category Match
03 Sep PAYROLL DEP NORTHSIDE MEDICAL 2,416.00 Northside Medical Income
05 Sep ZELLE TO M SIMPSON 75.00 Zelle Transfers
08 Sep POS PURCHASE WHOLE FOODS 10418 45.67 Whole Foods Groceries
09 Sep TST* BLUE BOTTLE COFFEE 8.45 Blue Bottle Restaurants
11 Sep UBER TRIP *8A2K19 18.20 Uber Travel
14 Sep AUTOPAY PACIFIC GAS ELECTRIC 128.40 PG&E Utilities
16 Sep COMCAST CABLE COMM 89.99 Comcast Utilities
19 Sep POS PURCHASE SAFEWAY 1193 62.31 Safeway Groceries
22 Sep ACH DEBIT GEICO AUTO 400.00 GEICO Insurance
25 Sep APPLE.COM/BILL 16.99 Apple Software
28 Sep MONTHLY MAINTENANCE FEE 12.00 Chase Bank fees
Page 1 of 1 Routing 021000021

Bank Statements OCR API

Keep the password.
Take the PDF.

Unless they use open banking, banking integrators such as Plaid and Yodlee take the customer’s bank login and store those credentials in plain text. Those scrapers fail when a bank changes its sign-in page, and 88% of financial data breaches involve compromised credentials. Veryfi reads the uploaded statement PDF instead — without the customer’s bank password — at 99.9% accuracy, and speeds reconciliation by 7× with validation plus 2-way and 3-way matching.

They take the login

Integrators

88% of financial data breaches involve compromised credentials. When the bank changes the login, the scraper breaks.

You upload the PDF

Veryfi
  • 99.9%extraction accuracy
  • 7×faster reconciliation
  • Validation
  • 2-way match
  • 3-way match
Request: Bank Statement Data Extraction
import requests
url = "https://api.veryfi.com/api/v8/partner/bank-statements"
headers = {
'CLIENT-ID': '<API_KEY_VALUE>',
'AUTHORIZATION': 'apikey <USERNAME_VALUE>:<API_KEY_VALUE>'
}
payload = {'file_url': 'https://cdn...'}
response = requests.post(url, headers=headers, data=payload)
print(response.json())
Response: Structured JSON
{
"account_holder_name": "Mr Robot",
"account_holder_address": "210 S B St, San Mateo, CA 94401",
"bank_name": "The Royal Bank of Scotland",
"account_number": "1111111",
"routing_number": "16-10-00",
"beginning_balance": 1803.90,
"ending_balance": 300.20,
"currency_code": "GBP",
"transactions": [
{
"date": "2013-10-22 00:00:00",
"description": "AUTOMATED PAY IN 650274051211-CHB",
"debit_amount": 190.40,
"balance": 1803.90
},
{
"date": "2013-12-21 00:00:00",
"description": "DVLA",
"debit_amount": 280.00,
"balance": 2548.14
}
]
}

Developer Friendly API

The only API you will ever need to accurately extract key/value data in a standardized format you can trust across any geography, language, or format — enabling seamless international business expansion without lifting a finger.

Day-1 Ready Pre-Trained Bank Statements AI Model
SDKs & code samples in Python, Node.js, PHP, C#, Java, Go and more
Detailed API Docs + FAQs that make sense
Human support from experts at HQ in Silicon Valley

No bullshit. No months of training. No "contact sales" gatekeeping. Start impressing your customers today.

Supported Fields

Checking, savings, and credit-card statements extracted as JSON from POST /api/v8/partner/bank-statements, including per-account balances, transaction lines, and fraud signals, with summary rows on each account.

  • Account Info
    • Account Holder Info
      Account holder info is the person or business the statement is addressed to. Process a Bank Statement does not return an account_holder object. The name and the address are separate keys.What it is
      • The holder block at the top of the statement
      • Kept here so the sample name stays with the group
      • Not a response key of its own
      Where to find it
      • The mailing block, usually the upper left
      • Read Account holder name and Account holder address for the extracted values
      Read it with
      • Account number
      • Statement date
      John Smith
    • Account Holder Name
      account_holder_name
      Account holder name is the person or business the statement is addressed to.What it is
      • The name in the mailing block
      • A person on a consumer statement, a company on a business statement
      • Not the bank name
      Where to find it
      • The address block, usually above the street
      Read it with
      • Account holder address
      • Account number
      John Smith
    • Account Holder Address
      account_holder_address
      Account holder address is the mailing address printed for the account holder.What it is
      • Street, city, region, and postal code as one string
      • The holder's address, not the bank's
      • Useful for matching the statement to a customer record
      Where to find it
      • Under the holder name in the mailing block
      Stays separate from
      • Bank address, which is the institution
      123 Main St, Anytown, CA 12345
    • Period Start Date
      period_start_date
      Period start date is the first day of the statement cycle, in ISO 8601 format.What it is
      • The opening day of this statement, not a transaction date
      • Pairs with the period end date to bound the lines
      • Returned as a date, such as 2024-01-01
      Where to find it
      • The statement period line, often near the statement date
      Read it with
      • Period end date
      • Beginning balance
      2024-01-01
    • Period End Date
      period_end_date
      Period end date is the last day of the statement cycle, in ISO 8601 format.What it is
      • The closing day of this statement
      • The ending balance is as of this date
      • Not the due date and not the statement print date
      Where to find it
      • The statement period line, after the start date
      Read it with
      • Period start date
      • Ending balance
      2024-01-31
    • Routing Number
      routing_number
      Routing number is the bank routing number printed for this statement, usually the ABA number on a US account.What it is
      • The single routing number for the statement
      • Identifies the bank, not the account
      • A statement can also list more than one. Those live on routing numbers
      Where to find it
      • The account summary, often next to the account number
      Read it with
      • Routing numbers
      • Account number
      123456789
    • Routing Numbers
      routing_numbers
      Routing numbers is the list of routing numbers found on the statement. A single-bank statement often has one. A combined statement can have more.What it is
      • An array of routing number strings
      • The same idea as routing number, when the page prints more than one
      • Empty when none were read
      Where to find it
      • Account summary blocks, including extra accounts on the same PDF
      Read it with
      • Routing number
      • Account numbers
      [123456789, 987654321]
    • Account Number
      account_number
      Account number is the statement's primary account number. Banks often mask all but the last digits.What it is
      • The account this statement is for
      • May be masked, as in the sample ****1234
      • On a multi-account PDF, each account also has accounts[].number
      Where to find it
      • The account summary, near the holder name
      Read it with
      • Account numbers
      • Account number on account
      ****1234
    • Account Numbers
      account_numbers
      Account numbers is the list of account numbers found on the statement.What it is
      • An array of account number strings
      • One entry on a single-account statement, more when the PDF covers several
      • The masked form is kept as printed
      Where to find it
      • Each account header on the statement
      Read it with
      • Account number
      • Accounts, the per-account objects
      [****1234, ****5678]
    • Account Number on Account
      accounts[].number
      Account number on account is the account number inside one accounts[] object. Use it when a PDF contains more than one account.What it is
      • The number for this account in the accounts array
      • The same digits as account number when the statement has one account
      • The key to join this account's lines, balances, and summaries
      Where to find it
      • The account header for that account
      Read it with
      • Account beginning balance and Account ending balance
      • The transaction lines on that same account
      ****1234
    • Account Type
      account_type
      Account type is the kind of account, such as checking, savings, or credit.What it is
      • The product name the bank prints, not a Veryfi enum you have to map first
      • Checking and savings are deposit accounts. Credit is a card or line
      • Useful before you apply deposit rules versus card rules
      Where to find it
      • Next to the account number, or in the account title
      Read it with
      • Minimum due, which is typical on a credit account
      • Currency code
      Checking
    • Account VAT Number
      account_vat_number
      Account VAT number is the tax identifier printed for the account holder, used on business statements outside the US.What it is
      • The holder's VAT or tax id, when the statement prints one
      • Not the bank's VAT number
      • Often blank on a US consumer checking statement
      Where to find it
      • The account header or the holder block on a VAT invoice-style statement
      Stays separate from
      • Bank VAT number
      GB123456789
    • IBAN Number
      iban_number
      IBAN is the International Bank Account Number for the statement, when the bank prints one.What it is
      • The international account identifier, country code first
      • Used on non-US and some multi-currency statements
      • Blank when the statement only prints a domestic account number
      Where to find it
      • The account summary, often labeled IBAN
      Read it with
      • SWIFT code
      • Account IBAN, the same value on accounts[] when the PDF has several accounts
      GB29NWBK60161331926819
    • Account IBAN
      accounts[].iban_number
      Account IBAN is the IBAN on one accounts[] object. A combined statement can print a different IBAN per account.What it is
      • The per-account IBAN
      • Matches iban number when there is only one account
      • Empty on a domestic US checking account that has no IBAN
      Where to find it
      • That account's header
      Read it with
      • IBAN number
      • Account number on account
      GB29NWBK60161331926819
    • SWIFT Code
      swift
      SWIFT code is the bank identifier used for international wires. The response key is swift.What it is
      • The BIC / SWIFT of the bank, typically 8 or 11 characters
      • Identifies the bank for a cross-border payment, not the account
      • Blank when the statement does not print one
      Where to find it
      • Near the IBAN, or in the bank's international-payments block
      Read it with
      • IBAN number
      • Bank name
      NWBKGB2L
    • Due Date
      due_date
      Due date is the payment due date, in ISO 8601 format. It is common on credit-card and line-of-credit statements.What it is
      • The date the minimum payment is due
      • Not the period end date and not a transaction date
      • Empty on a checking statement that has no payment due
      Where to find it
      • The payment summary, near minimum due
      Read it with
      • Minimum due
      • Statement date
      2024-02-15
    • Statement Date
      statement_date
      Statement date is the date the bank issued the statement, in ISO 8601 format.What it is
      • The print or issue date
      • Often a day or two after the period end date
      • Not the due date
      Where to find it
      • The header, near the statement number
      Read it with
      • Statement number
      • Period end date
      2024-02-01
    • Statement Number
      statement_number
      Statement number is the identifier the bank assigns to this statement.What it is
      • The statement id printed by the bank
      • Useful for telling this cycle apart from the next one
      • Not the Veryfi document id
      Where to find it
      • The header, often labeled Statement number
      Stays separate from
      • Document ID, which Veryfi assigns
      202401-001
    • Currency Code
      currency_code
      Currency code is the ISO 4217 code for the amounts on the statement, such as USD or GBP.What it is
      • The currency of the balances and the lines
      • Inferred from the statement when the letters are not printed
      • One code for the statement. Per-line currency is not a separate key
      How to use it
      • Apply it before you post amounts into a ledger that mixes currencies
      Read it with
      • Beginning balance and Ending balance
      • Credit and debit amounts on each line
      USD
    • Learn more …
  • Totals
    • Beginning Balance
      beginning_balance
      Beginning balance is the balance at the start of the statement period.What it is
      • The opening balance for this cycle
      • Should match the prior statement's ending balance
      • The statement-level number. Each account also has its own on accounts[]
      Where to find it
      • The summary, usually the first balance in the activity block
      Read it with
      • Account beginning balance
      • Ending balance
      $2,500.00
    • Account Beginning Balance
      accounts[].beginning_balance
      Account beginning balance is the opening balance for one account inside accounts[]. A combined statement has one per account.What it is
      • The opening balance for that account only
      • Matches beginning balance when the PDF has a single account
      • The number to reconcile that account's lines
      Where to find it
      • That account's summary, before the first transaction
      Read it with
      • Account ending balance
      • The credit and debit amounts on that account
      $2,500.00
    • Ending Balance
      ending_balance
      Ending balance is the balance at the end of the statement period.What it is
      • The closing balance for this cycle
      • Beginning balance plus credits minus debits, when the statement foots
      • The statement-level number. Each account also has its own
      Where to find it
      • The summary, after the transaction list
      Read it with
      • Account ending balance
      • Beginning balance
      $1,875.50
    • Account Ending Balance
      accounts[].ending_balance
      Account ending balance is the closing balance for one account inside accounts[].What it is
      • The closing balance for that account only
      • Matches ending balance on a single-account statement
      • The figure the next statement's beginning balance should equal
      Where to find it
      • That account's summary, after its lines
      Read it with
      • Account beginning balance
      • The running Balance on the last line
      $1,875.50
    • Minimum Due
      minimum_due
      Minimum due is the minimum payment for this cycle. It is typical on a credit-card statement and empty on many checking statements.What it is
      • The smallest payment the issuer asks for
      • Not the ending balance and not the statement total
      • A number, in the statement currency
      Where to find it
      • The payment box, next to the due date
      Read it with
      • Due date
      • Account type
      $50.00
    • Summaries
      summaries
      Summaries is the statement-level list of summary rows, such as total deposits. This key is deprecated. Read accounts[].summaries instead. The sample stays an empty list.What it is
      • An array of name and total pairs
      • Deprecated on the statement root. The current key is accounts[].summaries
      • Still returned so older clients keep working
      How to use it
      • New integrations should ignore this key and read Account summaries
      Read it with
      • Account summaries
      • Summary name and Summary total
      []
    • Account Summaries
      accounts[].summaries
      Account summaries is the current summary list, on each account. The docs say to use this instead of the deprecated top-level summaries key. An account with no summary block returns an empty list, which is this sample.What it is
      • An array of summary rows for that account
      • Each row has a name and a total
      • The replacement for top-level summaries
      Where to find it
      • The activity summary for that account, such as deposits, withdrawals, or fees
      Read it with
      • Summary name
      • Summary total
      []
    • Summary Name
      accounts[].summaries[].name
      Summary name is the label on one summary row, such as Deposits or Withdrawals. The parent list is empty when the statement prints no summary block. This sample is the label when a row is present.What it is
      • The title the bank prints for that total
      • Not a Veryfi category. It is the words on the statement
      • Paired with summary total on the same row
      Where to find it
      • The account summary table, in the label column
      Read it with
      • Summary total
      Deposits
    • Summary Total
      accounts[].summaries[].total
      Summary total is the amount on one summary row. This sample is the deposits total that matches the credit line on this statement.What it is
      • The number next to the summary name
      • A rollup, not a single transaction
      • In the statement currency
      Where to find it
      • The account summary table, in the amount column
      Read it with
      • Summary name
      • The credit and debit lines that should add up to it
      $500.00
    • Learn more …
  • Document Metadata
    • Document ID
      id
      Document ID is the unique number Veryfi assigns to this statement. It is not printed on the PDF.What it is
      • The id you use to get, update, or delete the document
      • Stable for this upload
      • Not the bank's statement number
      How to use it
      • Store it with your record so you can fetch the statement later
      Stays separate from
      • Statement number
      • External ID
      8120321
    • External ID
      meta.external_id
      External ID is your own id for this statement. Send it as meta.external_id. The request parameter external_id is deprecated. The response still includes a top-level external_id with the same value.What it is
      • A non-empty string you choose, such as ext-abc123
      • How you map the Veryfi document back to your system
      • Not printed on the statement
      How to use it
      • Set meta.external_id on upload. Read it back from meta.external_id
      • The older top-level external_id on the request is deprecated
      Read it with
      • Document ID
      ext-abc123
    • Document Type
      Document type names this product. Process a Bank Statement does not return a document_type key. The endpoint itself is the bank-statement processor. The sample stays bank-statement.What it is
      • The kind of document this page is about
      • Not a field in the response schema
      • You already know the type because you called the bank-statements endpoint
      How to use it
      • Route on the endpoint, not on a document_type value
      Read it with
      • Meta source, which says how the file was submitted
      bank-statement
    • Created Date
      created_date
      Created date is when Veryfi stored the document. It is not printed on the statement.What it is
      • The processing timestamp
      • Not the statement date and not a transaction date
      • There is no separate processed_at key. This is that time
      How to use it
      • Use it for your own audit log of when the file was extracted
      Read it with
      • Updated date
      • Statement date
      2024-01-09 22:36:11
    • Updated Date
      updated_date
      Updated date is when the document record last changed. On a fresh extract it matches created date.What it is
      • The last write time on the Veryfi document
      • Moves if the document is updated later
      • Not a date from the statement
      How to use it
      • Detect a document that was edited after the first extract
      Read it with
      • Created date
      2024-01-09 22:36:11
    • Processed At
      Processed at is the time the file finished extracting. The response has no processed_at key. That timestamp is created date. The sample stays the ISO time from the draft.What it is
      • The moment processing finished
      • Not a response key
      • The same instant as created date, written with a timezone
      How to use it
      • Read Created date
      Read it with
      • Created date
      2024-01-09T22:36:11.814Z
    • PDF URL
      pdf_url
      PDF URL is a signed link to the PDF Veryfi generated from the upload. It is not printed on the statement.What it is
      • A URL that expires 15 minutes after the response
      • Resigned on every later GET
      • The normalized PDF, not necessarily the original upload bytes
      How to use it
      • Download it promptly, or fetch the document again for a fresh link
      Read it with
      • Image thumbnail URL
      https://scdn.veryfi.com/...
    • Image Thumbnail URL
      img_thumbnail_url
      Image thumbnail URL is a signed link to the preview image Veryfi made for the upload.What it is
      • A short-lived URL, same expiry rule as the PDF URL
      • A preview, not the full-resolution page
      • Not printed on the statement
      How to use it
      • Show it in a review queue. Fetch the document again when the link has expired
      Read it with
      • PDF URL
      • Page width and Page height
      https://scdn.veryfi.com/...
    • Meta Model
      meta.model
      Meta model is the version of the model that processed the statement. It is not printed on the PDF.What it is
      • A version string, such as 1.62.00
      • Lets you tell which model produced this JSON
      • Useful when you compare extracts over time
      How to use it
      • Log it next to the document id when you audit a result
      Read it with
      • Document OCR score
      1.62.00
    • Meta Tags
      meta.tags
      Meta tags are the labels attached to the document. The sample is an empty list. Tags you send on upload come back here.What it is
      • An array of strings
      • Yours to set. They are not read off the statement
      • Empty when you did not send any
      How to use it
      • Send meta.tags on the request to group statements in your own workflow
      Read it with
      • External ID
      []
    • Meta Duplicates
      meta.duplicates
      Meta duplicates lists other documents in your account that match this upload. An empty list means no prior copy was found.What it is
      • Each match has an id and a url
      • A second upload of the same statement shows up here
      • Not printed on the statement
      How to use it
      • Hold a statement that matches one you already processed
      Read it with
      • Fraud types, which can include duplicate
      []
    • Document OCR Score
      meta.ocr_score
      Document OCR score is the average OCR confidence for the whole statement, from 0 to 1. A score of 0.99 is about 99%. It is not printed on the PDF.What it is
      • One number for the file, separate from the per-page score
      • A quality signal, not a guarantee on every field
      • Lower scores usually mean blur, a skew, or a low-contrast scan
      How to use it
      • Review extracts under your own threshold before they post
      Read it with
      • Page OCR score
      0.99
    • Page OCR Score
      meta.pages[].ocr_score
      Page OCR score is the average OCR confidence for one page, from 0 to 1. The sample page scores 0.99.What it is
      • One score per page, under meta.pages
      • A weak page can hide inside a strong document average
      • Not printed on the statement
      How to use it
      • Send a multi-page PDF's weak page to review even when the document score looks fine
      Read it with
      • Document OCR score
      • Page width and Page height
      0.99
    • Original File Name
      meta.original_file_name
      Original file name is the name of the file that was uploaded. It is not read from the statement.What it is
      • The filename you sent, or the name on the URL
      • Useful in a review queue so a person can find the source file
      • Not a statement number
      How to use it
      • Show it next to the document id. Do not parse account data out of it
      Read it with
      • Meta source
      statement.pdf
    • Meta Source
      meta.source
      Meta source says how the file was submitted. The default is api.What it is
      • A channel such as api, api.web, api.email, or lens
      • Not something printed on the statement
      • Lets you tell an API upload from a Lens capture
      How to use it
      • Split analytics by channel. The extract fields are the same
      Read it with
      • Original file name
      api
    • Page Width
      meta.pages[].width
      Page width is the processed page width in pixels. Together with page height it is the coordinate space for anything you draw back on the scan. It is not printed on the statement.What it is
      • Pixel width of the page Veryfi processed. 612 is a letter-size PDF point width
      • One value per page
      • Not the physical width of the paper in inches
      How to use it
      • Scale regions onto the original page
      Read it with
      • Page height
      612
    • Page Height
      meta.pages[].height
      Page height is the processed page height in pixels. 792 with a width of 612 is a letter-size page.What it is
      • Pixel height of the page Veryfi processed
      • One value per page, under meta.pages
      • Not printed on the statement
      How to use it
      • Keep overlays aligned with the scan
      Read it with
      • Page width
      792
  • Bank Info
    • Bank Name
      bank_name
      Bank name is the institution that issued the statement.What it is
      • The words in the bank logo or header
      • Not the routing number and not the SWIFT code
      • The same bank can appear once even when the PDF has several accounts
      Where to find it
      • The top of the first page, with the logo
      Read it with
      • Bank address
      • Routing number
      First National Bank
    • Bank Address
      bank_address
      Bank address is the address of the bank, not the account holder's mailing address.What it is
      • The institution's address as printed
      • Often a PO box or a corporate address
      • Separate from the holder address
      Where to find it
      • The footer, or under the bank name
      Stays separate from
      • Account holder address
      456 Financial Ave, Banking City, NY 10001
    • Bank Website
      bank_website
      Bank website is the URL printed for the bank.What it is
      • The site the statement tells the customer to visit
      • Not inferred from the bank name
      • Empty when the statement does not print one
      Where to find it
      • The header or the customer-service footer
      Read it with
      • Bank name
      www.firstnationalbank.com
    • Bank VAT Number
      bank_vat_number
      Bank VAT number is the tax identifier printed for the bank. It shows up on statements that include VAT.What it is
      • The bank's VAT id, not the account holder's
      • Often blank on a US consumer statement
      • A string, kept as printed
      Where to find it
      • The bank's legal block, near the bank address
      Stays separate from
      • Account VAT number
      GB987654321
    • Learn more …
  • Transaction Line-Items
    • Line #
      Line # is the human line number on the statement, starting at 1 in this sample. The response has no line-number key. Position is order, which starts at 0.What it is
      • The row a person would count down the page
      • Not a response key
      • The first printed line is order 0
      How to use it
      • Read Order and add 1 if you display a 1-based line number
      Read it with
      • Order
      1
    • Order
      accounts[].transactions[].order
      Order is where the transaction sits on the statement. The first line is 0.What it is
      • A zero-based position
      • The reading order down the page, not a bank sequence number
      • Stable for this extract so you can sort the lines back
      Where to find it
      • Derived from the row position. It is not a printed column
      Read it with
      • Date of transaction
      • Line item as text
      0
    • Transaction Id
      accounts[].transactions[].transaction_id
      Transaction id is the identifier printed on the line, when the bank includes one.What it is
      • The bank's id for this line, such as a reference or trace
      • Not the Veryfi document id
      • Empty when the line has no id of its own
      Where to find it
      • On the transaction row, often a reference column
      Stays separate from
      • Document ID
      • Receipt ID, which this endpoint does not return
      TXN12345678
    • Receipt ID
      Receipt ID is a linked receipt in the draft. Process a Bank Statement does not return a receipt id. The sample stays 393864421. A rule can write one into custom fields.What it is
      • An id from a receipt product, not from this statement schema
      • Not a response key on this endpoint
      • Vendor and category are the enrichment this endpoint does return
      How to use it
      • Match the line to a receipt in your own system, or store the id in Custom fields
      Read it with
      • Vendor
      • Custom fields
      393864421
    • Date of Transaction
      accounts[].transactions[].date
      Date of transaction is the date of the line, in ISO 8601 format.What it is
      • The date the transaction happened, as the statement prints it
      • Not always the day it posted
      • A date, such as 2024-01-15
      Where to find it
      • The date column on the transaction row
      Read it with
      • Posted date
      • Period start date and Period end date
      2024-01-15
    • Posted Date
      accounts[].transactions[].posted_date
      Posted date is the date the transaction posted, in ISO 8601 format. It can be a day after the transaction date.What it is
      • The posting date, when the statement prints one
      • The date the balance usually changes
      • Empty when the statement has a single date column
      Where to find it
      • A second date column, often labeled Posted
      Read it with
      • Date of transaction
      • Balance
      2024-01-16
    • Card Number
      accounts[].transactions[].card_number
      Card number is the card tied to this line, usually masked. It shows up on card statements and on debit-card purchases.What it is
      • The card for this transaction, not the deposit account number
      • Often only the last four digits
      • Empty on a line that is not a card purchase
      Where to find it
      • A card column, or inside the description
      Stays separate from
      • Account number
      ****1234
    • Credit Amount
      accounts[].transactions[].credit_amount
      Credit amount is the money added by this line. A purchase line leaves it empty and fills debit amount instead.What it is
      • The credit for this transaction only
      • Deposits, refunds, and incoming transfers
      • Not a signed amount. Debits are a separate key
      Where to find it
      • The credit column, or a positive amount when the statement uses one column
      Read it with
      • Debit amount
      • Balance
      $500.00
    • Debit Amount
      accounts[].transactions[].debit_amount
      Debit amount is the money taken by this line. The DoorDash purchase in the sample is a debit of $45.67.What it is
      • The debit for this transaction only
      • Purchases, withdrawals, and fees
      • Not a negative credit. Credits are a separate key
      Where to find it
      • The debit column
      Read it with
      • Credit amount
      • Description
      $45.67
    • Balance
      accounts[].transactions[].balance
      Balance is the running balance after this line's credit or debit is applied.What it is
      • The balance printed on this row
      • Not the statement ending balance, unless this is the last line
      • Empty when the statement does not print a running balance
      Where to find it
      • The balance column on the transaction row
      Read it with
      • Credit amount or Debit amount
      • Account ending balance
      $1,234.56
    • Description
      accounts[].transactions[].description
      Description is the text the bank prints for the line.What it is
      • The narrative, such as a merchant and a reference
      • The source for vendor and category enrichment
      • Not the full raw row. That is line item as text
      Where to find it
      • The description column
      Read it with
      • Vendor
      • Category
      PURCHASE DoorDash Order #ABC123
    • Line Item as Text
      accounts[].transactions[].text
      Line item as text is the OCR text of the whole transaction row, date and amount included.What it is
      • The line as it was read, before it was split into columns
      • Useful when a parsed amount looks wrong
      • The key is text, on the transaction
      Where to find it
      • The full row on the page
      Read it with
      • Description
      • Debit amount
      01/15/2024 DoorDash Order #ABC123 -$45.67
    • Custom Fields
      accounts[].transactions[].custom_fields
      Custom fields are values your rules and regular expressions write onto the line. The sample is an empty object because this statement has no rules applied.What it is
      • A dictionary you define. It is not printed as its own column
      • Built by applying your rules to the extracted line
      • Where a receipt id or an internal code can land if you add a rule
      How to use it
      • It is not on the statement. Read it after your rules run
      Read it with
      • Description
      • Transaction id
      {}
    • Learn more …
  • Document Intelligence
    • Category
      accounts[].transactions[].category
      Category is the spend category Veryfi assigns to the line. The DoorDash purchase maps to Restaurants / Dining / Meals. See the Bank Statements API article for how categories work.What it is
      • A category name, not the raw description
      • Assigned from the line. You can pass your own category list on the request
      • Empty when the line was not categorized
      How to use it
      • It is enrichment. It is not a column the bank printed
      Read it with
      • Vendor
      • Description
      Restaurants / Dining / Meals
    • Vendor
      accounts[].transactions[].vendor
      Vendor is the merchant Veryfi reads from the line. The sample description names DoorDash. See the Bank Statements API article.What it is
      • The counterparty, cleaned out of the description
      • DoorDash rather than the full PURCHASE DoorDash Order string
      • Empty when no merchant was found, such as a fee with no name
      How to use it
      • Enrichment on the transaction. It is not a separate printed column
      Read it with
      • Category
      • Description
      DoorDash
  • Fraud Detection
    • Fraud Score
      fraud.score
      Fraud score is how confident the fraud detector is in its prediction, from 0 to 1. This sample statement scores 0.08, a low score. It is not printed on the PDF.What it is
      • A review signal for the file, not a balance
      • Higher means more of the fraud checks fired
      • Read it with color and types so you know why
      How to use it
      • Hold or review above your own threshold. Do not treat the number as a yes or no by itself
      Read it with
      • Fraud color
      • Fraud types
      0.08
    • Fraud Color
      fraud.color
      Fraud color is the band for the score. Green means the file looks legitimate, yellow means review, and red means fraud. This sample is green.What it is
      • One of green, yellow, or red
      • A triage label for the same signals as the score
      • Not printed on the statement
      How to use it
      • Route green to straight-through, and yellow or red to a person
      Read it with
      • Fraud score
      green
    • Fraud Types
      fraud.types
      Fraud types name the checks that marked the file. The list is empty on this sample, which matches the green score. Values include LCD photo, screenshot, digital tampering, duplicate, and fraudulent pdf.What it is
      • The reasons behind the score
      • More than one type can appear
      • Empty when nothing fired
      How to use it
      • Show the list to a reviewer instead of only the color
      Read it with
      • LCD photo
      • Digital tampering
      []
    • LCD Photo
      fraud.pages[].is_lcd
      LCD photo is true when a page looks like a photo of a screen. The value on this sample page is false. The field is an object with a score and a value. The sample is the value.What it is
      • True or false, once per page
      • A screen recapture of a statement
      • You may also see LCD photo in fraud types
      How to use it
      • It is not printed on the statement. Read fraud.pages[].is_lcd.value
      Read it with
      • AI generated
      • Fraud types
      false
    • AI Generated
      fraud.pages[].ai_generated
      AI generated is true when a page looks synthetically produced. This sample page is false. The field is an object with a score and a value.What it is
      • True or false, once per page
      • A signal to review, alongside the fraud score
      • Not a claim that a green statement was drawn by a model
      How to use it
      • Read fraud.pages[].ai_generated.value. It is not printed on the statement
      Read it with
      • Fraud score
      • LCD photo
      false
    • Handwriting
      fraud.pages[].handwriting
      Handwriting lists ink artifacts on a page, each with a region, a type, and a score. A printed statement has an empty list, which is this sample.What it is
      • Regions that look handwritten, not a list of field names
      • One array per page, under fraud.pages
      • Empty when the page looks printed
      How to use it
      • A handwritten balance on a bank statement is a reason to look at the image
      Read it with
      • Digital tampering
      []
    • Digital Tampering
      fraud.pages[].digital_tampering
      Digital tampering lists edited regions on a page, each with a region, a type, and a score. This sample is empty.What it is
      • Places the image looks altered
      • Per page, under fraud.pages
      • Empty when no region was flagged
      How to use it
      • Open the PDF and compare the flagged region with the extracted amount
      Read it with
      • Fraud types
      • Warnings
      []
    • Warnings
      fraud.warnings
      Warnings are messages that help catch errors or fraud on the processed statement. Each one has a type and a message. This sample is an empty list.What it is
      • Typed checks such as a totals mismatch or a missing date
      • A message a reviewer can read, plus the type code
      • Empty when none of those checks fired
      How to use it
      • They are not printed on the statement. Surface the message next to the score
      Read it with
      • Fraud score
      • Ending balance
      []
    • Learn more …

SOC 2 Type II · Live

Global Bank-Grade Security & Compliance

Veryfi SOC 2 Type II compliant Certified seal

SOC 2 Type II

CERT · VERIFIED

Certified. GDPR, CCPA, and ITAR compliant.

HIPAA Compliance

HIPAA · BAA

We sign BAAs. PHI handled under HIPAA safeguards.

99.995% Uptime SLA

SLA · SAMPLED

Dedicated NVIDIA DGX — not shared cloud GPUs.

Deployment Flexibility

REGION · READY

Cloud API, hybrid, or on-premise when required.

GDPR

GDPR · READY

EU data protection. Lawful processing and subject rights.

Audit Trail

API · LOGGED

Every API call logged and timestamped for regulators.

Built for the banks that can’t afford “good enough.”

Try Bank Statement Extraction

Use Cases

Same POST /api/v8/partner/bank-statements payload, different workflows. Jump from a card or start with what Veryfi extracts from a bank statement.

What else?

  • Smart Transaction Categorization

    Veryfi's intelligent categorization engine automatically sorts transactions into meaningful categories, essential for companies building spend analytics products. The system includes a comprehensive default Chart of Accounts with categories like Advertising & Marketing, Office Supplies & Software, Meals & Entertainment, and Travel expenses for immediate use.

    Users have complete customization control through the web portal, where they can add, rename, or remove categories to match their business needs. These configurations seamlessly integrate across both Bank Statement and Invoice & Receipt processing APIs, ensuring consistent categorization throughout your document extraction workflow. Read More

  • Transaction Vendor Name Extraction

    Automatically identifies and extracts merchant/vendor names from transactions, enabling spend management platforms to evolve from basic expense tracking into strategic financial intelligence systems that drive real business value and operational efficiency. Read More

  • Transaction Line Items Extraction

    Automatically extracts detailed transaction data (level 3 data) from bank statements, capturing essential information including transaction ID, date, card number, credit/debit amounts, and full description text. Our AI-powered system processes each line item to identify the merchant, transaction type, and provides intelligent categorization for seamless integration into expense management and accounting systems. Beyond basic transaction details, the extraction includes document intelligence features that automatically categorize transactions (like "Restaurants / Dining / Meals") and identify vendors (such as "DoorDash"), transforming raw bank statement data into structured, actionable financial insights for better spend analysis and reporting.

  • Web Uploader

    Upload documents directly through our web portal at app.veryfi.com for instant processing and data extraction. This drag-and-drop solution supports bulk uploads of receipts, invoices, and bank statements with real-time processing updates and results available in JSON, CSV, and PDF formats. Perfect for businesses seeking a no-code solution to digitize financial documents.

  • Bank Statement PDF to Excel Converter

    Turn PDF bank statements into Excel ready documents so you can accelerate month-end closing, turning hours of manual data entry into minutes of automated precision. Try Bank Statement PDF to Excel Converter

  • Bank Statement PDF to OFX Converter

    Turn PDF bank statements into OFX (Open Financial Exchange) ready documents so you can accelerate month-end closing with easy import of transactions directly into QuickBooks, Xero, or other accounting software with OFX files, turning hours of manual data entry into minutes of automated precision. Try Bank Statement PDF to OFX Converter