Skip to content
munim/parser Get access

Bank statement parsing API · India

Statements in.
Ledger rows out.

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.

Statement.pdfSample

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

Upload. Parse. Get called back.

  1. Upload

    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

  2. Parse

    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

  3. Webhook

    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

Built for the statements Indian accountants actually receive.

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

Supported banks and statement formats
Bank PDF 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

Four calls and a webhook.

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

Confidence in every request.

Authenticated access
Your API key controls access to your project's uploads, jobs and results.
Safe request retries
Reuse the same idempotency key when retrying job creation to retrieve the existing job without creating another.
Verifiable notifications
Signed webhooks let you verify that a completion notification came from the parser service.
Validated files
File size, format and integrity are checked before a completed upload is accepted for processing.
Protected statement passwords
Passwords supplied for protected statements are encrypted when stored.
Controlled result access
Retrieve results with your API key. Returned download links expire after a short period.

Upload limits

Know your limits before uploading.

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.

Free trial
5 uploads totalOne-time allowance · launch target
Trial file size
5 MB per fileLaunch target
Paid file size
25 MiB per fileStandard early-access limit
Paid PDF length
200 pages per fileLaunch target
Paid CSV / Excel
50,000 data rows per fileLaunch target
Paid concurrent processing
5 jobs per customerLaunch target

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

Pay for extracted transactions.

A small trial to get started. Prepaid credits when you are ready to grow.

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.
Request trial access

Launch

For teams integrating and processing regularly.

₹1/ 100 credits

Prepaid · pilot pricing

  • 5 credits per transaction (₹0.05).
  • 200-credit document minimum (₹2).
  • ₹500 minimum top-up buys 50,000 credits.
  • 25 MiB maximum per file.
  • Failed parses and internal retries consume no paid credits.
Request Launch access

Scale

For larger workloads and committed volume.

Custom

Credit pricing agreed for your volume

  • Volume credit bundles and negotiated rates.
  • Document minimums agreed before purchase.
  • Higher file and processing limits by agreement.
  • Tell us your bank mix and monthly volume for a quote.
Discuss Scale

How Launch credits work

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.

Launch credits and price per successfully parsed document
TransactionsCreditsPrice
20200₹2
100500₹5
1,0005,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.