Developer Access · Live

Bank statement converter API

Extract structured JSON transaction data from any bank statement PDF via a simple REST API. Built on the same parsing engine that powers PivotBank, 1000+ banks, multi-page support, zero-config integration.

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

    01

    Subscribe to Pro

    API access requires an active Pro subscription; the endpoint refuses keys belonging to any other account.

    02

    Create an API key

    Generate a key from your account page. It is shown once, and only its hash is stored.

    03

    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.

    04

    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 Pro
FAQ

Working 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.