Bank Statement Extractor

Convierte PDFs de estados de cuenta bancarios en CSV/JSON limpios y con saldo verificado. Cada extracción se concilia con los saldos iniciales y finales del propio estado de cuenta: comprobablemente correcta, no solo parseada. Pago por estado de cuenta, sin suscripción. Parte del conjunto de herramientas de datos verificados de Businessquik (transparencia de precios hospitalarios, retiros de la FDA, señales de patentes, perfiles de ubicaciones de EE. UU.).

Documentación

Bank Statement PDF to CSV/JSON Converter (businessquik/bank-statement-extractor) Actor

Bank statement PDF to clean CSV/JSON with balance-verified accuracy: every statement is reconciled against its own opening and closing balances. No file retention. Built for bookkeepers, lenders, and AI agents.

Pricing

from $100.00 / 1,000 statement reconcileds

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 section below.

Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).

README

Bank Statement PDF to CSV/JSON Converter

Turn bank statement PDFs into clean, reconciled transaction data — dates, descriptions, signed amounts, and running balances — ready for QuickBooks, Xero, Excel, or your data pipeline.

Why this one

Balance-validated extraction. Most PDF extractors hand you rows and hope. This Actor recomputes the running balance across every transaction and checks it against the statement's own opening and closing balances:

  • RECONCILED — opening + all transactions = closing. The extraction is provably complete and correct.
  • EXTRACTED_WITH_MISMATCHES — rows extracted, but the math doesn't close; mismatchRows tells you exactly which rows to review.
  • EXTRACTED_UNVERIFIED — the statement doesn't print balances, so no check was possible.

You only pay the reconciliation fee when the check passes.

Your files are never stored. Statements are processed in memory and discarded. The only output is the transaction dataset in your own account. No file retention, no third-party calls.

Input

FieldDescription
pdfUrlsDirect links to one or more statement PDFs (signed S3/Drive/Dropbox links work)
pdfBase64Alternative: a single PDF inline as base64 — convenient from agents/API
outputFormatcsv-ready (one row per transaction, default) or json (nested per statement)
dateFormatiso, us, or eu
strictReconciliationMark non-reconciling statements as failed instead of returning best-effort rows

Output (csv-ready)

{
  "source": "https://.../statement-jan.pdf",
  "status": "RECONCILED",
  "date": "2026-01-14",
  "description": "ACH DEPOSIT PAYROLL ACME LLC",
  "amount": 2450.00,
  "balance": 5121.37,
  "page": 2
}

Export to CSV/Excel directly from the dataset tab, or pull via API.

Who this is for

  • Bookkeepers & accountants — client statement backlogs into your ledger without retyping
  • Lenders & underwriters — cash-flow analysis from applicant statements
  • AI agents (via MCP) — a callable tool that returns structured, verified transactions
  • Anyone migrating banks or reconstructing records for taxes

Notes & limits

  • Works on text-based PDFs (the kind your bank generates). Scanned/photographed statements need OCR — not yet supported; on the roadmap.
  • Layouts vary by bank. The parser handles the common single-column transaction formats (date … description … amount [balance]). If your bank's layout fails, open an issue with the layout shape (never send a real statement) and it gets fixed fast.
  • Output is provided as-is, without warranty, and is not accounting, tax, or financial advice. Verify reconciliation status before relying on extracted data.

Pricing

EventPrice
Run start$0.02
Per page processed$0.04
Per statement reconciled$0.10 (only when the balance check passes)

A typical 5-page statement: $0.32 — versus a $30+/month converter subscription or 30 minutes of retyping.

FAQ

Is my bank statement stored anywhere? No. Files are fetched into memory, parsed, and discarded. The only output is the transaction dataset in your own Apify account, which only you control.

How do I know the extraction is correct? Every statement is reconciled: opening balance + all transactions must equal the closing balance printed on the statement itself. status: "RECONCILED" means the math closes — the extraction is provably complete. You only pay the reconciliation fee when this check passes.

What if my bank's layout isn't supported? Open an issue describing the layout shape (columns, date format — never a real statement). Common-layout gaps are usually fixed within days.

Does it handle scanned statements? Not yet — text-based PDFs only (the kind your bank's website generates). OCR is on the roadmap.

Can I use this from an AI agent? Yes — the Actor is callable via MCP (see the API tab), and the pdfBase64 input means agents can pass files without a hosting step.

What does a typical statement cost? A 5-page statement: $0.02 (run) + $0.20 (pages) + $0.10 (reconciliation) = $0.32. No subscription.

Changelog

  • 2026-08-22 — Demo mode: run with empty input to see the output shape on a bundled synthetic statement.
  • 2026-08-20 — Launch: balance-reconciled extraction, EU/US formats, accounting negatives, multi-page statements.

More tools by Businessquik

Verified data tools built on official and public-mandate sources — no logins, no gray areas, no fragile scrapers:

Support: open an issue on this Actor's Issues tab — layout/format reports are usually fixed within days. Describe the shape of your file or query; never post real bank statements or sensitive data.

Actor input Schema

pdfUrls (type: array):

Direct links to one or more bank statement PDFs (e.g. a signed S3/Drive/Dropbox link). Files are processed in memory and never stored by this Actor.

pdfBase64 (type: string):

A single PDF supplied inline as a base64 string. Use this when calling from an agent or API without a hosting step.

outputFormat (type: string):

Shape of the transaction output pushed to the dataset.

dateFormat (type: string):

All dates are normalised to this format.

strictReconciliation (type: boolean):

When on, a statement whose transactions don't sum to the closing balance is marked FAILED_RECONCILIATION instead of returning silently wrong data.

Actor input object example

{
  "pdfUrls": [],
  "outputFormat": "csv-ready",
  "dateFormat": "iso",
  "strictReconciliation": false
}

Actor output Schema

results (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

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 = {
    "pdfUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("businessquik/bank-statement-extractor").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

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 = { "pdfUrls": [] }

# Run the Actor and wait for it to finish
run = client.actor("businessquik/bank-statement-extractor").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

echo '{
  "pdfUrls": []
}' |
apify call businessquik/bank-statement-extractor --silent --output-dataset

MCP server setup

{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,businessquik/bank-statement-extractor"
        }
    }
}

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/8vveA7QHkaQUDNto5/builds/P0ubmmHLPzNCNgrch/openapi.json