📘 Public beta · Endpoints are stable; OpenAPI specs and SDKs ship monthly. See changelog →
Products
Bank Statement
Overview
Bank Statement

Bank Statement Platform

Upload an Indonesian bank statement PDF. Get back a clean transaction ledger with running balances, categorisations, anomaly flags, affordability metrics, and an authenticity score.

What it does

CapabilityAPI
Native parsers for 8 Indonesian banksSub-second deterministic parsing
AI fallback for everything elseQuantum AI vision for unsupported / heavily-modified statements
Password-protected PDFsDecrypt-in-memory; password never stored
Multi-account single-PDFAuto-split into sibling analyses
ConsolidationGroup N statements (per customer / per application) into a single ledger view
CategorisationAuto-categorize transactions; analyst corrections become rules
Anomaly detectionBalance mismatch, sudden activity, possible tampering
Affordability + authenticity scoringPre-computed scores ready for loan underwriting
Webhooksanalysis.completed etc.

Supported banks (native parsers)

Native parsers are deterministic — high accuracy, sub-second, no AI inference cost. Eight banks supported:

BankCodeStatement formats covered
BCABCAPersonal, Tahapan, KlikBCA, mobile-banking PDF
MandiriMANDIRIPersonal, livinmandiri.id mobile, corporate
BRIBRIBRImo, internet banking PDF, manual print
BNIBNIPersonal, BNI Mobile, internet banking
PermataPERMATAPersonal, PermataMobile X, corporate
DanamonDANAMOND-Bank PRO, internet banking
BTNBTNPersonal, BTN Mobile
OCBCOCBCOCBC ONE Mobile, internet banking

For other banks (CIMB Niaga, Maybank Indonesia, foreign-bank Indo branches), the AI parser handles them. Accuracy is generally ~95% on first parse; analyst corrections lift it to 99%+.

Tell us your bank if accuracy matters

If you process high volumes from a bank not on the native-parser list, we'll build a native parser. Email sales@quantumelixir.tech with 30+ sample statements (sanitized) — typical native-parser dev + validation is 2–3 weeks.

Core concepts

ConceptWhat it is
AnalysisOne parsed statement. Has an account, a period, and a transaction list.
TransactionOne ledger row. Date, description, debit/credit, running balance, category.
Consolidation groupA collection of analyses (multiple statements, often one customer's accounts) merged into a single ledger.
CategoryTransaction tag — salary, food, transfer_internal, loan_repayment, etc.
Category ruleUser-defined override: "if description contains 'GOFOOD', categorize as food". Applies bulk.
AnomalyFlagged transaction (balance mismatch, sudden burst, possible doctored row).
Confidence0–100, per-analysis.
Affordability scorePre-computed repayment-capacity heuristic.
Authenticity score0–100, PDF tampering likelihood.

Common integration shape

Loan underwriting

  1. 1
    POST/api/analyses/upload
    Upload 3–6 months of statements.
    Multi-file supported; a consolidation group is created automatically.
  2. 2
    Async processing.
    Parsing completes — the `analysis.completed` webhook fires.
  3. 3
    GET/api/consolidations/{id}/consolidated
    Pull the merged ledger + metrics.
  4. 4
    Use the affordability score, average balance, total inflow, and anomalies as inputs to your underwriting decision.

Endpoints at a glance

GroupEndpoints
UploadPOST /api/analyses/upload
AnalysesGET/DELETE /api/analyses · GET/DELETE /api/analyses/{id} · POST /api/analyses/{id}/password · POST /api/analyses/{id}/retry
Transactions(inline in analysis detail) · PATCH /api/transactions/{id}/category
ConsolidationsGET/POST /api/consolidations · GET /api/consolidations/{id} · GET /api/consolidations/{id}/consolidated
WebhooksGET/POST /api/webhooks · POST /api/webhooks/{id}/rotate-secret · GET /api/webhooks/{id}/deliveries
API keysGET/POST /api/api-keys
HealthGET /api/healthz

Production considerations

ConcernAnswer
Data residencyUploaded PDFs and parsed ledger data live in id-jkt-1. PDFs are sealed at rest with AES-256-GCM. Never replicated cross-border.
RetentionOriginal PDFs: 90 days by default (sealed); configurable up to 7 years from Dashboard → Settings → Retention. Parsed ledger + analysis results: retained indefinitely (regulated record).
Parser tierEight banks served by native parsers (~99.5% accuracy, sub-second). All others fall through to Quantum AI vision parsing (3–8s, ~95% accuracy). See Supported banks →.
Rate limitsUpload: 60 per 10 min per org. Password retry: 10 per 5 min per analysis. Re-extraction: included in upload rate.
IdempotencyUpload deduplicates on SHA-256 of file content within 24h — identical bytes return the original analysisId without re-charging.
AuditEvery upload, password submission, analysis delete, transaction category edit, consolidation create is audit-logged. Immutable (Postgres triggers enforce append-only), 7 years.
Webhook signingHMAC-SHA256 over the raw body, header X-BankStmt-Signature: sha256=<hex>. Secret is shown once at registration and never persisted server-side — rotate via POST /api/webhooks/{id}/rotate-secret (24h grace window on the old secret).
BrandingAll AI parsing surfaces as Quantum AI in customer-facing payloads and dashboards. Internal model stack not exposed.

Read next