# Indian Bank Statement PDF to Excel, CSV & Tally XML (`realistic_puma/indian-bank-statement-parser`) Actor

Convert Indian bank statement PDFs (SBI, HDFC, ICICI, Axis, Kotak & more) into clean transactions with balance checks, confidence scores, Excel/CSV and Tally XML. Handles password-protected and scanned PDFs. Files are not retained.

- **URL**: https://apify.com/realistic_puma/indian-bank-statement-parser.md
- **Developed by:** [Golla Narendar](https://apify.com/realistic_puma) (community)
- **Stats:** 2 total users, 1 monthly users, 42.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 transaction extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Indian Bank Statement PDF → Excel, CSV & Tally XML

Turn any Indian bank statement PDF into clean, **balance-verified** transactions in seconds — ready for Excel, Google Sheets, your accounting software or **direct import into TallyPrime / Tally ERP 9**.

Built for **chartered accountants, bookkeepers, loan/DSA agents, lenders, tax preparers and developers** who are tired of re-typing statements or fixing broken copy-paste.

### Why this one

- ✅ **Top Indian banks recognised automatically**: SBI, HDFC, ICICI, Axis, Kotak, PNB, Bank of Baroda, Canara, Union Bank, IDFC FIRST — plus a **generic parser** for co-operative, regional rural and other banks.
- ✅ **Running-balance check on every row**: previous balance − debit + credit must equal the printed balance. Rows that don't add up are flagged, so you know exactly what to review.
- ✅ **Confidence score** per file (0–1) — feed it into your automation and only send low-confidence files for human review.
- ✅ **Password-protected PDFs** (the usual bank e-statement passwords) — give the password once per run.
- ✅ **Scanned / photocopied statements** via built-in OCR.
- ✅ **Tally XML**: one Payment/Receipt voucher per transaction against your bank ledger and a counter ledger (default *Suspense*) for re-classification.
- ✅ **Multi-line narrations, Dr/Cr suffixes, overdraft balances, newest-first statements** handled.
- 🔒 **No retention**: PDFs are processed in memory and never stored by the Actor. See *Privacy* below.

### How to use

1. Upload one or more statement PDFs (or paste HTTPS links).
2. If they're password-protected, enter the password.
3. Click **Start**. Download results from the **Output** tab:
   - the dataset (one row per transaction) as Excel, CSV, JSON or via API;
   - `file-N.xlsx`, `file-N.csv`, `file-N-tally.xml` and a `SUMMARY` record in the key-value store.

### Sample output (one dataset item)

```json
{
  "file": "file-1",
  "bank": "HDFC",
  "date": "2026-04-03",
  "valueDate": "2026-04-03",
  "narration": "UPI/578381399028/DUMMY TELECOM/PAYMENT/okaxis/ICIC",
  "ref": "578381399028",
  "debit": 1202.0,
  "credit": null,
  "balance": 234149.67,
  "balanceCheck": "ok",
  "confidence": 1.0,
  "page": 1,
  "flags": []
}
```

`SUMMARY` (per file): bank, parser used, pages, OCR pages, transaction count, opening/closing balance, total debits/credits, balance-continuity pass rate, whether *opening + credits − debits = closing*, confidence and warnings.

### Input

| Field | Description |
|---|---|
| Statement PDFs | Upload PDFs (text or scanned) |
| PDF URLs | Or HTTPS links (API / automation) |
| PDF password | Optional, stored encrypted, never logged |
| Bank | Auto-detect (default) or force one |
| Extra output files | Excel, CSV, Tally XML |
| OCR scanned pages | On by default |
| Tally bank ledger / counter ledger / company | Ledger names used in the XML |

### Tally import

Gateway of Tally → **Import → Vouchers** → choose `file-N-tally.xml`. The bank ledger and counter ledger named in the input must already exist in the company. Every voucher is balanced (debit = credit).

### Pricing

Pay only for transactions extracted — **$1.00 per 1,000 transactions** (that's about 2–3 cents for a typical 1-page statement). Files that can't be parsed produce no rows and cost nothing beyond the small run start fee.

### Privacy & data retention

- The PDF is downloaded into the Actor's memory, parsed, and discarded. It is **never written** to the dataset, key-value store or logs.
- Logs contain only counts, bank name and confidence — **never** names, narrations, account numbers or amounts.
- The password field is marked secret (encrypted by Apify) and is not logged.
- Files uploaded through the input form are deleted from your storage after the run where the platform permits (*Delete uploaded PDFs* option).
- The **results** (dataset and output files) live in *your* Apify account under Apify's normal storage retention; delete them whenever you like. Download and delete runs if you process client data.
- Use only statements you are authorised to process.

### Limitations

- Statement layouts change; if a bank changes its format the generic parser takes over and the confidence score will tell you. Report a layout and it will be added.
- OCR accuracy depends on scan quality. Always check rows flagged `mismatch`.
- Credit-card statements and passbook photos are not supported yet.

### FAQ

**Is my data used for training?** No. Nothing is retained.
**Which languages?** English-language statements (all major Indian banks issue English e-statements).
**Can I call it from Zapier/Make/n8n or my code?** Yes — use the Apify API or integrations with `pdfUrls`.

# Actor input Schema

## `statementFiles` (type: `array`):

Upload bank statement PDFs (text or scanned). Uploaded files are removed after the run where the platform allows it.

## `pdfUrls` (type: `array`):

Alternatively, direct HTTPS links to statement PDFs (for API/automation use).

## `password` (type: `string`):

Password for protected statements (Indian banks often use e.g. first 4 letters of name + DDMM of birth). Stored encrypted, never logged. Applies to all files in this run.

## `bank` (type: `string`):

Leave on Auto-detect unless detection picks the wrong bank.

## `outputFormats` (type: `array`):

Files saved to the key-value store in addition to the dataset (which you can also export as JSON/CSV/Excel).

## `enableOcr` (type: `boolean`):

Run CPU OCR (Tesseract) on pages that have no text layer. Slower; turn off for born-digital PDFs only.

## `tallyBankLedger` (type: `string`):

Ledger in your Tally company that represents this bank account.

## `tallySuspenseLedger` (type: `string`):

Ledger used for the other side of each voucher (re-classify after import).

## `tallyCompany` (type: `string`):

If set, the XML targets this company (SVCURRENTCOMPANY).

## `maxPagesPerFile` (type: `integer`):

Safety limit for very large PDFs.

## `deleteUploadedFiles` (type: `boolean`):

Best-effort removal of files uploaded through this form from your key-value store.

## Actor input object example

```json
{
  "bank": "auto",
  "outputFormats": [
    "xlsx",
    "csv",
    "tally"
  ],
  "enableOcr": true,
  "tallyBankLedger": "Bank Account",
  "tallySuspenseLedger": "Suspense",
  "maxPagesPerFile": 300,
  "deleteUploadedFiles": true
}
```

# Actor output Schema

## `transactions` (type: `string`):

No description

## `files` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("realistic_puma/indian-bank-statement-parser").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("realistic_puma/indian-bank-statement-parser").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call realistic_puma/indian-bank-statement-parser --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,realistic_puma/indian-bank-statement-parser"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/X52PXWMyeDxwGyM1c/builds/9mA7jbdL7VxMfyVWX/openapi.json
