Free
For trying the parser on your own files.
₹0
One-time trial · no monthly reset
- 5 uploads total.
- 5 MB maximum per file.
- Accepted uploads use a trial slot, including files that cannot be parsed.
- Internal retries do not use extra slots.
Bank statement parsing API · India
Send a PDF, CSV or Excel statement from an Indian bank. Get back normalised transactions as JSON, with a signed webhook when the job finishes. No template-writing, no per-bank scraping.
One API for bank statements, Form 26AS and NCD schedules. Built for accounting software, finance teams and developers.
GET /v1/jobs/{id}/result
{
"date": "2025-01-15",
"amount": "250.00",
"description": "NEFT synthetic credit",
"metadata": {
"balance_after": "1250.00"
}
} 01 · How it works
Register your PDF, CSV or Excel file, send it to the returned upload URL, then confirm the upload. Files are checked before processing. Up to 25 MiB per file under standard early-access terms.
POST /v1/uploads
Create a parsing job. The bank format is detected for you, or you can specify a supported format. Receive normalised transactions and account metadata as JSON.
POST /v1/jobs
A job.completed event is delivered to your endpoint, signed with HMAC-SHA256. Fetch the result through a short-lived download URL, or poll the job if you prefer.
job.completed
02 · Coverage
Fifteen banks across PDF, CSV and Excel exports today, including several co-operative banks. Password-protected files are supported: pass the password with the job. The same API also accepts Form 26AS (PDF) and NCD schedules (XLSX).
| Bank | CSV | Excel | |
|---|---|---|---|
| HDFC Bank | Supported | Supported | Supported |
| ICICI Bankseveral PDF layouts | Supported | Supported | Supported |
| State Bank of India | Supported | Supported | Supported |
| Axis Bank | Supported | Supported | Supported |
| Kotak Mahindra Bank | Supported | Not supported | Supported |
| Yes Bank | Supported | Not supported | Supported |
| Bank of Baroda | Supported | Not supported | Supported |
| Punjab National Bank | Not supported | Not supported | Supported |
| Union Bank of India | Supported | Not supported | Not supported |
| Federal Bank | Supported | Not supported | Not supported |
| IDFC FIRST Bank | Supported | Not supported | Not supported |
| Indian Bank | Supported | Not supported | Not supported |
| Surat National Co-operative Bank | Supported | Not supported | Not supported |
| Sarvodaya Sahakari Bank | Supported | Not supported | Not supported |
| Sutex Co-operative Bank | Supported | Not supported | Not supported |
Upload formats accepted for bank statements: .pdf, .csv, .xls, .xlsx. Missing your bank? Tell us.
03 · The API
Authenticate with your API key. Upload a statement, create a job and retrieve structured JSON. Receive a signed webhook or poll for completion. Your API credentials and webhook setup are provided during onboarding.
Upload · shell
# 1. Register the upload (declare what you are sending)
curl -X POST "$PARSER_URL/v1/uploads" \
-H "Authorization: Bearer $PARSER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"document_kind": "bank_statement",
"filename": "statement.pdf",
"content_type": "application/pdf",
"size": 482113,
"sha256": "<hex sha-256 of the file>"
}'
# 201 -> { "id": "<upload_id>", "upload_url": "<upload URL>", "expires_at": "..." }
# 2. Send the file to the returned upload URL
curl -X PUT "<upload_url>" -H "Content-Type: application/pdf" \
--data-binary @statement.pdf
# 3. Mark it complete (suffix and MIME are checked again here)
curl -X POST "$PARSER_URL/v1/uploads/<upload_id>/complete" \
-H "Authorization: Bearer $PARSER_API_KEY"
# 200 -> { "id": "<upload_id>", "status": "ready" }Job & result · shell
# 4. Create the job (Idempotency-Key is required)
curl -X POST "$PARSER_URL/v1/jobs" \
-H "Authorization: Bearer $PARSER_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "upload_id": "<upload_id>" }'
# add "password": "..." for protected statements
# -> { "id": "<job_id>", "status": "queued", "document_kind": "bank_statement", ... }
# 5a. Poll if you would rather not take a webhook
curl "$PARSER_URL/v1/jobs/<job_id>" -H "Authorization: Bearer $PARSER_API_KEY"
# 5b. When the status is "succeeded", fetch the result
curl "$PARSER_URL/v1/jobs/<job_id>/result" -H "Authorization: Bearer $PARSER_API_KEY"
# -> { "download_url": "<short-lived>", "expires_in": ..., "schema_version": "2.0", ... }Result · JSON (illustrative)
{
"schema_version": "2.0",
"meta": {
"bank_name": "...", "ifsc_code": "...", "account_number": "XXXX1234",
"detected_currency": "INR",
"period": { "start": "2025-01-01", "end": "2025-01-31" },
"opening_balance": "1000.00", "closing_balance": "1250.00"
},
"transactions": [{
"date": "2025-01-15",
"amount": "250.00",
"description": "NEFT synthetic credit",
"metadata": { "balance_after": "1250.00", "transaction_id": "synthetic-txn-1" }
}]
}Verify the webhook · Node
import { createHmac, timingSafeEqual } from "node:crypto";
// Signature = "sha256=" + HMAC-SHA256(secret, `${timestamp}.${eventId}.${rawBody}`)
export function verify(req, rawBody, secret) {
const ts = req.headers["x-webhook-timestamp"];
const id = req.headers["x-webhook-event-id"];
const got = Buffer.from(req.headers["x-webhook-signature"] ?? "");
const want = Buffer.from(
"sha256=" + createHmac("sha256", secret).update(`${ts}.${id}.${rawBody}`).digest("hex"),
);
return got.length === want.length && timingSafeEqual(got, want);
}
// event_type: "job.completed"
// body.data: { job_id, status: "succeeded" | "failed_document" | "failed_internal", error_code }04 · Built for your integration
Upload limits
Try the API with a one-time allowance of five uploads, up to 5 MB per file. Paid uploads have a standard 25 MiB file limit. Trial quotas and the other launch targets below are confirmed during onboarding. Contact us if your statements or processing volume need higher limits.
Accepted bank statement formats: PDF, CSV, XLS and XLSX. Trial quotas, page, row and concurrency limits are launch targets. They are not yet enforced automatically.
05 · Pricing
A small trial to get started. Prepaid credits when you are ready to grow.
For trying the parser on your own files.
₹0
One-time trial · no monthly reset
For teams integrating and processing regularly.
₹1/ 100 credits
Prepaid · pilot pricing
For larger workloads and committed volume.
Custom
Credit pricing agreed for your volume
Credits used = max(200, 5 × extracted transactions).
The document minimum is not an additional fee. Uploading alone does not consume paid credits. Repeat requests for the same job are billed once.
| Transactions | Credits | Price |
|---|---|---|
| 20 | 200 | ₹2 |
| 100 | 500 | ₹5 |
| 1,000 | 5,000 | ₹50 |
Early access: trial quotas and higher limits are launch targets confirmed during onboarding. Launch pilot rates apply to supported bank statements. Final terms and applicable taxes are confirmed before purchase. Form 26AS and NCD schedules have separate pricing.