API Documentation

Turn a PDF bank statement from any country into structured JSON, CSV or XLSX with a single POST request. Unknown formats are learned automatically, scanned PDFs get OCR, and results are balance-chain verified. 50 pages/month free.

Quick Start

1. Create a free account and get your API key.

Start Free

Authentication

Use one of the following methods in every request:

Bearer JWT

Authorization: Bearer <your_jwt_token>

API Key

X-Api-Key: pex_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Extract PDF

POST/extract

Upload a PDF and receive the transaction list as JSON or CSV. Accepts file upload or URL.

Form Fields

FieldTypeDescription
fileFilePDF file (max 20 MB)
urlstringPDF URL (alternative to file)
webhookUrlstringURL called when processing completes
formatstringOutput format: json (default), csv or xlsx

cURL Example

curl -X POST https://api.bankstatementparser.net/extract \
  -H "X-Api-Key: pex_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@statement.pdf"
200Success — known format
{
  "requestId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "bankKey": "bank_v1",
  "pageCount": 2,
  "transactionCount": 45,
  "transactions": [
    {
      "date": "2024-01-15",
      "valueDate": "2024-01-15",
      "description": "MARKET PAYMENT",
      "processNo": "TRN000123456",
      "amount": -250.00,
      "balance": 4750.00
    }
  ]
}
202Queued — unknown format
{
  "queueId": "a1b2c3d4-...",
  "status": "queued",
  "message": "Unknown PDF format. Queued for profile generation."
}

Dispute / Page Refund

If a PDF was processed incorrectly, you can report it within 14 days. If approved, the used page credit is refunded.

POST/api/refund/requestSubmit dispute — JWT required
// Request body
{
  "usageLogId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",  // requestId from /extract
  "reason": "Got 8 transactions instead of 15, page 2 was skipped"
}

// 200 OK
{ "message": "Bildiriminiz alındı." }
GET/api/refund/my-requestsMy dispute requests
[
  {
    "id": "...",
    "usageLogId": "3fa85f64-...",
    "reason": "...",
    "pageCount": 3,
    "status": "Pending",  // Pending | Approved | Rejected
    "adminNote": null,
    "createdAt": "2026-06-26T10:00:00Z"
  }
]

Rate Limits

RuleLimit
Demo (no API key) — per IP per day5 req/day
/api/auth/*5 req/min
/extract20 req/min
Other endpoints100 req/min