Simple Integration
One endpoint. Structured JSON.
POST a PDF. Get back clean, structured transaction data. Every response includes bank name, statement period, and a full transaction array with normalised date, description, debit, credit, and balance fields.
- ✓Consistent field names across all banks
- ✓Null values for missing debit/credit (never ambiguous)
- ✓ISO date format output
- ✓Bank name and period auto-detected
- ✓Page count included for usage tracking
POST /api/v1/convert
Authorization: Bearer {API_KEY}
Content-Type: multipart/form-data
# Response: 200 OK
{
"bankName": "HSBC",
"accountNumber": "1234 5678",
"period": "Jan 2025, Mar 2025",
"pageCount": 3,
"transactionCount": 2,
"reconciliation": {
"verified": true,
"status": "ok",
"opening": 2384.21,
"closing": 6841.22,
"expectedClosing": 6841.22,
"difference": 0,
"totalIn": 4500.00,
"totalOut": 42.99
},
"transactions": [
{
"date": "2025-01-03",
"description": "AMAZON.CO.UK",
"debit": 42.99,
"credit": null,
"balance": 2341.22
},
{
"date": "2025-01-07",
"description": "SALARY - ACME LTD",
"debit": null,
"credit": 4500.00,
"balance": 6841.22
}
]
}How to call it
Subscribe to Pro
API access requires an active Pro subscription; the endpoint refuses keys belonging to any other account.
Create an API key
Generate a key from your account page. It is shown once, and only its hash is stored.
POST the PDF
Send the PDF to /api/v1/convert with an Authorization: Bearer header, either as multipart form-data in a "file" field or as a raw application/pdf body, up to 15 MB.
Read the JSON
A 200 response returns bankName, accountNumber, period, pageCount, transactionCount, a reconciliation object and a transactions array of date, description, debit, credit and balance.
Who uses the API
Accounting Software Integration
Send client PDFs to your own system and receive structured JSON ready to post directly to Xero, QuickBooks, or Sage ledgers, no manual re-keying.
Fintech & Lending
Automate affordability analysis for loan applications. Parse 3-12 months of applicant statements in seconds and extract income, recurring commitments, and balance trends.
Enterprise Automation
Integrate bank statement parsing into internal workflows, compliance checks, expense processing, audit support, or custom financial dashboards.
Pricing model
Pay per statement
Access
Included with Pro
Banks supported
1000+
The API is a Pro feature
Upgrade to Pro to create API keys and convert statements programmatically.
Upgrade to ProWorking with the API
How do I authenticate?
Send your key as a bearer token: Authorization: Bearer pvb_live_... Keys are created and revoked on this page, and the endpoint requires an active Pro subscription, so a valid key on a non-Pro account is refused with a 403.
How do I send the PDF?
Either as multipart/form-data with the file in a field called "file", or as a raw request body with Content-Type: application/pdf. Both are accepted on the same endpoint. The limit is 15 MB, checked against the declared length before the body is read, so an oversized upload is refused with a 413 rather than transferred first.
What comes back?
One JSON object: bankName, accountNumber, period and pageCount detected from the statement, transactionCount, a reconciliation object, and a transactions array. Each transaction has a date, a description, and debit, credit and balance fields, with null rather than zero where a column is genuinely absent. The reconciliation carries a verified boolean, true only when the opening balance plus every row lands exactly on the closing balance, along with the figures it was computed from, so a bad parse is detectable in code rather than in a reconciliation meeting a month later.
Does it read scanned statements?
No, and this is the one place the API is narrower than the web app. The browser runs OCR on a scan; the API parses the text layer only, and a statement with no usable text comes back as a 422 asking for a digital PDF. If your input includes scans, convert those in the browser or ask us about it.
What do the error codes mean?
401 for a missing, invalid or revoked key. 403 for a valid key on an account without Pro. 400 for a body that is not a readable PDF. 413 for over 15 MB. 422 for a PDF that parsed but yielded no usable text, which in practice means a scan.
How is usage counted?
One conversion per successful call, recorded against your account with the page count, the same way a conversion in the browser is. Nothing is counted for a call that errors.
Volume & Enterprise
Converting at volume?
The API is live and included with a Pro subscription. Create a key above and start posting statements; nothing here is a queue.
Get in touch if you are converting at volume, need a bespoke rate, or want to talk through an integration before you build it.
