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
| Capability | API |
|---|---|
| Native parsers for 8 Indonesian banks | Sub-second deterministic parsing |
| AI fallback for everything else | Quantum AI vision for unsupported / heavily-modified statements |
| Password-protected PDFs | Decrypt-in-memory; password never stored |
| Multi-account single-PDF | Auto-split into sibling analyses |
| Consolidation | Group N statements (per customer / per application) into a single ledger view |
| Categorisation | Auto-categorize transactions; analyst corrections become rules |
| Anomaly detection | Balance mismatch, sudden activity, possible tampering |
| Affordability + authenticity scoring | Pre-computed scores ready for loan underwriting |
| Webhooks | analysis.completed etc. |
Supported banks (native parsers)
Native parsers are deterministic — high accuracy, sub-second, no AI inference cost. Eight banks supported:
| Bank | Code | Statement formats covered |
|---|---|---|
| BCA | BCA | Personal, Tahapan, KlikBCA, mobile-banking PDF |
| Mandiri | MANDIRI | Personal, livinmandiri.id mobile, corporate |
| BRI | BRI | BRImo, internet banking PDF, manual print |
| BNI | BNI | Personal, BNI Mobile, internet banking |
| Permata | PERMATA | Personal, PermataMobile X, corporate |
| Danamon | DANAMON | D-Bank PRO, internet banking |
| BTN | BTN | Personal, BTN Mobile |
| OCBC | OCBC | OCBC 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
| Concept | What it is |
|---|---|
| Analysis | One parsed statement. Has an account, a period, and a transaction list. |
| Transaction | One ledger row. Date, description, debit/credit, running balance, category. |
| Consolidation group | A collection of analyses (multiple statements, often one customer's accounts) merged into a single ledger. |
| Category | Transaction tag — salary, food, transfer_internal, loan_repayment, etc. |
| Category rule | User-defined override: "if description contains 'GOFOOD', categorize as food". Applies bulk. |
| Anomaly | Flagged transaction (balance mismatch, sudden burst, possible doctored row). |
| Confidence | 0–100, per-analysis. |
| Affordability score | Pre-computed repayment-capacity heuristic. |
| Authenticity score | 0–100, PDF tampering likelihood. |
Common integration shape
Loan underwriting
- 1POST
/api/analyses/uploadUpload 3–6 months of statements.Multi-file supported; a consolidation group is created automatically. - 2Async processing.Parsing completes — the `analysis.completed` webhook fires.
- 3GET
/api/consolidations/{id}/consolidatedPull the merged ledger + metrics. - 4Use the affordability score, average balance, total inflow, and anomalies as inputs to your underwriting decision.
Endpoints at a glance
| Group | Endpoints |
|---|---|
| Upload | POST /api/analyses/upload |
| Analyses | GET/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 |
| Consolidations | GET/POST /api/consolidations · GET /api/consolidations/{id} · GET /api/consolidations/{id}/consolidated |
| Webhooks | GET/POST /api/webhooks · POST /api/webhooks/{id}/rotate-secret · GET /api/webhooks/{id}/deliveries |
| API keys | GET/POST /api/api-keys |
| Health | GET /api/healthz |
Production considerations
| Concern | Answer |
|---|---|
| Data residency | Uploaded PDFs and parsed ledger data live in id-jkt-1. PDFs are sealed at rest with AES-256-GCM. Never replicated cross-border. |
| Retention | Original PDFs: 90 days by default (sealed); configurable up to 7 years from Dashboard → Settings → Retention. Parsed ledger + analysis results: retained indefinitely (regulated record). |
| Parser tier | Eight 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 limits | Upload: 60 per 10 min per org. Password retry: 10 per 5 min per analysis. Re-extraction: included in upload rate. |
| Idempotency | Upload deduplicates on SHA-256 of file content within 24h — identical bytes return the original analysisId without re-charging. |
| Audit | Every upload, password submission, analysis delete, transaction category edit, consolidation create is audit-logged. Immutable (Postgres triggers enforce append-only), 7 years. |
| Webhook signing | HMAC-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). |
| Branding | All AI parsing surfaces as Quantum AI in customer-facing payloads and dashboards. Internal model stack not exposed. |