Error 404
Page Not Found
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
From 7826043c6981082c61c3aa712711baa06ce59ca9 Mon Sep 17 00:00:00 2001
From: Sebastien Rousseau
-
+
We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
+We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
diff --git a/_posts/index.md b/_posts/index.md index 0ff0d56..885b565 100644 --- a/_posts/index.md +++ b/_posts/index.md @@ -22,8 +22,8 @@ banner_alt: "Bank Statement Parser — High-Throughput Financial Document ParsinAn open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
-View Treasury Playbook +View Treasury Playbook @@ -141,7 +141,7 @@ banner_alt: "Bank Statement Parser — High-Throughput Financial Document ParsinHigh-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
-View Architecture Blueprint +View Architecture Blueprint @@ -153,8 +153,8 @@ banner_alt: "Bank Statement Parser — High-Throughput Financial Document ParsinDeploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
-Install Bank Statement Parser +Install Bank Statement ParserContinue to {target}.
+Error 404
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
Error 404
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
Engineering & Leadership
Principal engineer building high-assurance, privacy-first financial infrastructure and cryptographic document tooling.
With nineteen years of hands-on systems engineering across tier-1 investment banking, clearing gateways, and treasury infrastructures in London and international financial hubs, Sebastien specializes in high-throughput document tokenization, payment message harmonization, and post-quantum cryptographic security.
Engineering & Leadership
Principal engineer building high-assurance, privacy-first financial infrastructure and cryptographic document tooling.
With nineteen years of hands-on systems engineering across tier-1 investment banking, clearing gateways, and treasury infrastructures in London and international financial hubs, Sebastien specializes in high-throughput document tokenization, payment message harmonization, and post-quantum cryptographic security.
Inclusive Engineering
Dedicated to achieving WCAG 2.2 Level AAA compliance across all digital documentation and interactive financial tooling.
Bank Statement Parser is committed to digital accessibility, conforming strictly to WCAG 2.2 Level AAA guidelines:
nav, main, article, footer) and ARIA live regions.Inclusive Engineering
Dedicated to achieving WCAG 2.2 Level AAA compliance across all digital documentation and interactive financial tooling.
Bank Statement Parser is committed to digital accessibility, conforming strictly to WCAG 2.2 Level AAA guidelines:
nav, main, article, footer) and ARIA live regions.Developer Reference
Complete programming interfaces, types, and error handling for Rust, Python, and CLI pipelines.
Bank Statement Parser exposes deterministic, zero-allocation interfaces across both native Rust and PyO3-powered Python bindings. Every function executes strictly in-process with zero network telemetry, complete memory safety, and mathematical balance verification.
Integrate the native Rust crate directly into your backend services for maximum CPU throughput, sub-millisecond document parsing, and zero heap duplication:
Core data types provided by the native crate:
| Type / Symbol | Signature | Description |
|---|---|---|
Parser | struct Parser | Thread-safe parser engine supporting zero-copy byte slice and file ingestion. |
ParserBuilder | struct ParserBuilder | Configures parallel threads, balance invariants, and dialect heuristics. |
Statement | struct Statement | Normalized document model containing account ID, balances, currency, and transactions. |
Transaction | struct Transaction | Individual ledger item with booking date, value date, signed amount, and narrative. |
StatementFormat | enum StatementFormat | Output target variants: Json, Csv, Ofx, Qif, and Camt053. |
Pre-compiled binary wheels for Linux, macOS, and Windows provide native Rust speed directly inside Python data science, pandas, and web application workflows:
Core parsers and analytical tools exported by the module:
| Symbol | Type / Signature | Purpose & Description |
|---|---|---|
BankStatementParser | Class | Primary document engine for PDF layout extraction, OCR fallback, and multi-format routing. |
Bai2Parser | Class | Dedicated state machine parser for BAI2 corporate cash management files. |
CamtParser | Class | High-speed XML parser for ISO 20022 CAMT.052, CAMT.053, and CAMT.054 statements. |
Pain001Parser | Class | Parser for ISO 20022 PAIN.001 customer credit transfer payment instructions. |
Mt940Parser / Mt942Parser | Class | SWIFT MT940 end-of-day and MT942 intraday tag-based message parsers. |
ParquetStreamWriter | ContextManager | Streams batches of transactions directly to Apache Parquet with Snappy/Zstd compression. |
reconcile_payments_and_statements | Function | Two-way automated reconciliation matching payment orders against statement postings. |
inspect_pdf_forensics | Function | Audits PDF statements for font discrepancies, metadata modifications, and tampering findings. |
analyze_statement_transactions | Function | Computes cash flow summaries, average daily balances, NSF fees, and recurring cadences. |
All processing pipelines isolate corrupt documents, unsupported regional dialects, and balance arithmetic discrepancies into typed error exceptions without panics or unhandled crashes:
Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys. Sensitive financial documents and banking statements remain strictly confined within your own compute environment.
Developer Reference
Complete programming interfaces, types, and error handling for Rust, Python, and CLI pipelines.
Bank Statement Parser exposes deterministic, zero-allocation interfaces across both native Rust and PyO3-powered Python bindings. Every function executes strictly in-process with zero network telemetry, complete memory safety, and mathematical balance verification.
Integrate the native Rust crate directly into your backend services for maximum CPU throughput, sub-millisecond document parsing, and zero heap duplication:
Core data types provided by the native crate:
| Type / Symbol | Signature | Description |
|---|---|---|
Parser | struct Parser | Thread-safe parser engine supporting zero-copy byte slice and file ingestion. |
ParserBuilder | struct ParserBuilder | Configures parallel threads, balance invariants, and dialect heuristics. |
Statement | struct Statement | Normalized document model containing account ID, balances, currency, and transactions. |
Transaction | struct Transaction | Individual ledger item with booking date, value date, signed amount, and narrative. |
StatementFormat | enum StatementFormat | Output target variants: Json, Csv, Ofx, Qif, and Camt053. |
Pre-compiled binary wheels for Linux, macOS, and Windows provide native Rust speed directly inside Python data science, pandas, and web application workflows:
Core parsers and analytical tools exported by the module:
| Symbol | Type / Signature | Purpose & Description |
|---|---|---|
BankStatementParser | Class | Primary document engine for PDF layout extraction, OCR fallback, and multi-format routing. |
Bai2Parser | Class | Dedicated state machine parser for BAI2 corporate cash management files. |
CamtParser | Class | High-speed XML parser for ISO 20022 CAMT.052, CAMT.053, and CAMT.054 statements. |
Pain001Parser | Class | Parser for ISO 20022 PAIN.001 customer credit transfer payment instructions. |
Mt940Parser / Mt942Parser | Class | SWIFT MT940 end-of-day and MT942 intraday tag-based message parsers. |
ParquetStreamWriter | ContextManager | Streams batches of transactions directly to Apache Parquet with Snappy/Zstd compression. |
reconcile_payments_and_statements | Function | Two-way automated reconciliation matching payment orders against statement postings. |
inspect_pdf_forensics | Function | Audits PDF statements for font discrepancies, metadata modifications, and tampering findings. |
analyze_statement_transactions | Function | Computes cash flow summaries, average daily balances, NSF fees, and recurring cadences. |
All processing pipelines isolate corrupt documents, unsupported regional dialects, and balance arithmetic discrepancies into typed error exceptions without panics or unhandled crashes:
Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys. Sensitive financial documents and banking statements remain strictly confined within your own compute environment.
Engine Internals
High-throughput tokenization, deterministic stream parsing, and ISO 20022 message synthesis with zero runtime allocations.
Bank Statement Parser is architected around a deterministic, four-stage extraction and validation pipeline. Every stage executes in-process with zero outbound telemetry, zero heap allocation in the critical path, and strict mathematical balance verification before emitting ISO 20022 messages.
Zero-copy memory mapping (mmap) of input statement bytes with instant magic-byte format detection (PDF, CSV, OFX, MT940, CAMT.053).
Spatial coordinate mapping and multi-column tabular boundary reconstruction, preserving text flow across complex multi-page financial tables.
Zero Heap AllocationsCanonical standardization of 24 global date dialects, ISO 4217 currencies, and mod-97 IBAN checksum verification.
ISO 20022 BTC MappingMathematical invariant verification (Opening + ΣCredits - ΣDebits = Closing) before emitting validated JSON or ISO 20022 XML.
The trace below demonstrates the sub-millisecond execution lifecycle of the four-stage engine processing a multi-page PDF statement into validated ISO 20022 CAMT.053 XML:
The ingestion subsystem interfaces directly with the host filesystem via memory-mapped files (mmap), bypassing kernel-to-userspace buffer duplication. Byte slices are analyzed using non-backtracking magic-byte sniffers:
%PDF- and reads the cross-reference table (xref) directly from the trailer offset.OFXHEADER SGML tags or XML prologue <?xml version="1.0" to branch into streaming parser trees.:20:, :25:, :28C:) to route into deterministic line tokenizers.For unstructured formats such as digital PDF statements, standard text extraction destroys critical vertical alignment. Bank Statement Parser utilizes a deterministic coordinate-clustering engine:
BT, ET, Tj, TJ, Tm).
Extracted raw string tokens are converted into strongly-typed canonical primitives:
DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, and multi-lingual month names) into ISO 8601 UTC timestamps.1.234,56 vs 1,234.56), preserving scale as exact 64-bit fixed-point integers to eliminate IEEE 754 floating-point rounding drift.Before any extracted statement is emitted, the engine evaluates strict balance invariants to guarantee data integrity:
Upon invariant satisfaction, the engine streams the normalized data tree into target schemas:
camt.053.001.08 Bank-to-Customer Statement XML messages ready for direct core banking and treasury ingest.Engine Internals
High-throughput tokenization, deterministic stream parsing, and ISO 20022 message synthesis with zero runtime allocations.
Bank Statement Parser is architected around a deterministic, four-stage extraction and validation pipeline. Every stage executes in-process with zero outbound telemetry, zero heap allocation in the critical path, and strict mathematical balance verification before emitting ISO 20022 messages.
Zero-copy memory mapping (mmap) of input statement bytes with instant magic-byte format detection (PDF, CSV, OFX, MT940, CAMT.053).
Spatial coordinate mapping and multi-column tabular boundary reconstruction, preserving text flow across complex multi-page financial tables.
Zero Heap AllocationsCanonical standardization of 24 global date dialects, ISO 4217 currencies, and mod-97 IBAN checksum verification.
ISO 20022 BTC MappingMathematical invariant verification (Opening + ΣCredits - ΣDebits = Closing) before emitting validated JSON or ISO 20022 XML.
The trace below demonstrates the sub-millisecond execution lifecycle of the four-stage engine processing a multi-page PDF statement into validated ISO 20022 CAMT.053 XML:
The ingestion subsystem interfaces directly with the host filesystem via memory-mapped files (mmap), bypassing kernel-to-userspace buffer duplication. Byte slices are analyzed using non-backtracking magic-byte sniffers:
%PDF- and reads the cross-reference table (xref) directly from the trailer offset.OFXHEADER SGML tags or XML prologue <?xml version="1.0" to branch into streaming parser trees.:20:, :25:, :28C:) to route into deterministic line tokenizers.For unstructured formats such as digital PDF statements, standard text extraction destroys critical vertical alignment. Bank Statement Parser utilizes a deterministic coordinate-clustering engine:
BT, ET, Tj, TJ, Tm).
Extracted raw string tokens are converted into strongly-typed canonical primitives:
DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, and multi-lingual month names) into ISO 8601 UTC timestamps.1.234,56 vs 1,234.56), preserving scale as exact 64-bit fixed-point integers to eliminate IEEE 754 floating-point rounding drift.Before any extracted statement is emitted, the engine evaluates strict balance invariants to guarantee data integrity:
Upon invariant satisfaction, the engine streams the normalized data tree into target schemas:
camt.053.001.08 Bank-to-Customer Statement XML messages ready for direct core banking and treasury ingest.Performance Metrics
Empirical throughput and memory benchmarks comparing Bank Statement Parser against legacy Python and Java parser engines.
Benchmarked on Apple Silicon (M-series) and Linux x86_64 server hardware across 50,000 multi-page banking statements.
Empirical performance comparison processing standard 10-page commercial PDF bank statements with 150 transaction rows:
| Parser Engine | Language | Throughput (Pages/sec) | Memory (RSS) | Balance Check |
|---|---|---|---|---|
| Bank Statement Parser | Rust / Native | 174 pages/sec | 18 MB | Mathematical (100%) |
| PDFMiner.six | Python (Pure) | 3.8 pages/sec | 145 MB | None (Raw text) |
| Camelot (Lattice) | Python / OpenCV | 1.2 pages/sec | 380 MB | None (Visual only) |
| Tabula (Java) | Java / JVM | 8.4 pages/sec | 512 MB | None (Table grid) |
| Apache PDFBox | Java / JVM | 14.1 pages/sec | 290 MB | None (Text layout) |
Linear thread scalability benchmark across AMD EPYC 7763 (64-core) cloud instance ingesting batch directories:
The parser utilizes cache-friendly memory layouts, zero heap allocations in inner tokenizer loops, and SIMD vectorization for delimiter and byte scanning.
Performance Metrics
Empirical throughput and memory benchmarks comparing Bank Statement Parser against legacy Python and Java parser engines.
Benchmarked on Apple Silicon (M-series) and Linux x86_64 server hardware across 50,000 multi-page banking statements.
Empirical performance comparison processing standard 10-page commercial PDF bank statements with 150 transaction rows:
| Parser Engine | Language | Throughput (Pages/sec) | Memory (RSS) | Balance Check |
|---|---|---|---|---|
| Bank Statement Parser | Rust / Native | 174 pages/sec | 18 MB | Mathematical (100%) |
| PDFMiner.six | Python (Pure) | 3.8 pages/sec | 145 MB | None (Raw text) |
| Camelot (Lattice) | Python / OpenCV | 1.2 pages/sec | 380 MB | None (Visual only) |
| Tabula (Java) | Java / JVM | 8.4 pages/sec | 512 MB | None (Table grid) |
| Apache PDFBox | Java / JVM | 14.1 pages/sec | 290 MB | None (Text layout) |
Linear thread scalability benchmark across AMD EPYC 7763 (64-core) cloud instance ingesting batch directories:
The parser utilizes cache-friendly memory layouts, zero heap allocations in inner tokenizer loops, and SIMD vectorization for delimiter and byte scanning.
Release History
Deterministic versioning history, security audits, and functional enhancements across every release.
All notable changes to Bank Statement Parser are documented in this file following strict Semantic Versioning.
py/empty-except) in scripts/post-build.py and tightened exception handling in scripts/validate_spdx_headers.py.llms-full.txt alongside llms.txt for single-request LLM and coding agent ingestion.SOURCE_DATE_EPOCH builds and URL classification.rousseau-mbp-m1) in KEYS.asc and .github/allowed_signers.ssg 0.0.69, and pruned 40 unused legacy template files.KEYS.asc into valid OpenSSH allowed-signers format and honoured SOURCE_DATE_EPOCH in sitemap.xml generation.scripts/post-build.py by permitting whitespace and attributes in closing script tags.BreadcrumbList structured data across all subpages.sitemap.xml and canonical permalinks to trailing directory slashes and excluded 404/ and offline/ utility routes.ParquetStreamWriter) and batch export alongside plain-text ledger models (hledger, beancount, ledger-cli).reconcile_payments_and_statements), treasury analytics, and PDF forensics..hr-blurred:after in base layout template.Release History
Deterministic versioning history, security audits, and functional enhancements across every release.
All notable changes to Bank Statement Parser are documented in this file following strict Semantic Versioning.
sitemap.xml, redirected /faq/ and /contribute/ to /faqs/ and /contributing/, and served the 404 page for missing URLs.ssg 0.0.72.py/empty-except) in scripts/post-build.py and tightened exception handling in scripts/validate_spdx_headers.py.llms-full.txt alongside llms.txt for single-request LLM and coding agent ingestion.SOURCE_DATE_EPOCH builds and URL classification.rousseau-mbp-m1) in KEYS.asc and .github/allowed_signers.ssg 0.0.69, and pruned 40 unused legacy template files.KEYS.asc into valid OpenSSH allowed-signers format and honoured SOURCE_DATE_EPOCH in sitemap.xml generation.scripts/post-build.py by permitting whitespace and attributes in closing script tags.BreadcrumbList structured data across all subpages.sitemap.xml and canonical permalinks to trailing directory slashes and excluded 404/ and offline/ utility routes.ParquetStreamWriter) and batch export alongside plain-text ledger models (hledger, beancount, ledger-cli).reconcile_payments_and_statements), treasury analytics, and PDF forensics..hr-blurred:after in base layout template.Get in Touch
Engage with our core engineering team for custom banking dialects, high-throughput SLAs, or enterprise licensing.
Have a specialized bank statement format, high-volume batch requirement, or proprietary ERP integration?
Get in Touch
Engage with our core engineering team for custom banking dialects, high-throughput SLAs, or enterprise licensing.
Have a specialized bank statement format, high-volume batch requirement, or proprietary ERP integration?
Continue to https://bankstatementparser.com/contributing/.
+Community & Code
Guidelines for bug reporting, code contributions, DCO sign-offs, and test-driven verification.
Thank you for your interest in contributing to Bank Statement Parser. We welcome contributions for new regional statement dialects, zero-copy performance optimizations, parser rulebook definitions, and documentation improvements.
Bank Statement Parser is built in Rust with companion Python bindings. Ensure you have the stable Rust toolchain and Python 3.10+ installed:
Every pull request must pass the automated test suite, clippy linter checks, and formatting verification. 100% test coverage on new parsing dialects is required:
To protect privacy and comply with data sovereignty regulations, never submit real-world bank statements containing Personally Identifiable Information (PII) or authentic account details:
| Data Field | Invariant Requirement | Verification Method |
|---|---|---|
| IBAN Checksums | Must use valid ISO 7064 Mod-97 test numbers | Verified by test_sample_data_valid.rs |
| SWIFT / BIC | Structurally valid 8 or 11-char test BICs | ISO 9362 structural regex validation |
| Customer PII | Synthetic names, anonymized street addresses | Zero real customer records permitted |
| Currencies | Standard ISO 4217 currency identifiers (EUR, GBP, USD) | Matched against official currency table |
All contributions must follow Conventional Commits, be SSH/GPG signed, and carry a Developer Certificate of Origin (DCO) Signed-off-by trailer:
Community & Code
Guidelines for bug reporting, code contributions, DCO sign-offs, and test-driven verification.
Thank you for your interest in contributing to Bank Statement Parser. We welcome contributions for new regional statement dialects, zero-copy performance optimizations, parser rulebook definitions, and documentation improvements.
Bank Statement Parser is built in Rust with companion Python bindings. Ensure you have the stable Rust toolchain and Python 3.10+ installed:
Every pull request must pass the automated test suite, clippy linter checks, and formatting verification. 100% test coverage on new parsing dialects is required:
To protect privacy and comply with data sovereignty regulations, never submit real-world bank statements containing Personally Identifiable Information (PII) or authentic account details:
| Data Field | Invariant Requirement | Verification Method |
|---|---|---|
| IBAN Checksums | Must use valid ISO 7064 Mod-97 test numbers | Verified by test_sample_data_valid.rs |
| SWIFT / BIC | Structurally valid 8 or 11-char test BICs | ISO 9362 structural regex validation |
| Customer PII | Synthetic names, anonymized street addresses | Zero real customer records permitted |
| Currencies | Standard ISO 4217 currency identifiers (EUR, GBP, USD) | Matched against official currency table |
All contributions must follow Conventional Commits, be SSH/GPG signed, and carry a Developer Certificate of Origin (DCO) Signed-off-by trailer:
Continue to https://bankstatementparser.com/faqs/.
+Questions & Answers
Comprehensive guidance covering specifications, zero-telemetry local execution, performance, and commercial licensing.
Bank Statement Parser is engineered entirely in high-assurance native Rust with zero-copy stream processing, SIMD-accelerated string scanners, and direct memory layout mapping. By avoiding intermediate object allocations and skipping heavy browser engines or JVM runtimes, the tokenizer parses complex PDF text streams and multi-megabyte CSV files in under 0.8 ms per statement on standard multi-core hardware.
The parser provides native, deterministic parsers for eight primary banking standards worldwide:
The engine implements strict deterministic error boundaries. When an ambiguous date format or corrupted record is encountered, the parser isolates the specific record rather than failing the entire document batch. It attaches a structured diagnostic warning to the output while verifying opening and closing balance arithmetic to alert compliance operators if amounts fail reconciliation.
Yes. When compiled with the optional --features ocr flag, Bank Statement Parser leverages local, offline optical character recognition models. Scanned bitmap PDFs or image statements (TIFF, PNG) are converted to bounding-box coordinates and passed to the lexical tokenizer without transmitting any image data over the network.
Zero network egress, guaranteed. Bank Statement Parser is 100% self-contained and operates exclusively in local memory. It contains zero telemetry, zero analytics beacons, zero crash reporters, and zero background network calls. All document ingestion, tokenization, and schema validation execute strictly within your local process sandbox.
Security teams can verify our zero-egress guarantee through multiple standard controls: running the binary inside a network-isolated Linux namespace (unshare -n), deploying within a Docker container configured with --network none, or inspecting socket activity via strace / lsof. In all scenarios, zero socket binds or DNS resolutions occur.
No. Bank Statement Parser operates strictly in volatile memory. Statement byte buffers are allocated during stream processing and immediately scrubbed upon completion. No temporary files, swap caches, or intermediate scratch artifacts are written to persistent disk unless explicitly directed by the caller via the --output parameter.
Every release includes a machine-readable CycloneDX Software Bill of Materials (SBOM) and SHA256 checksums recorded in SHA256SUMS. All Git release tags and binaries are signed using SSH maintainer keys published in KEYS.asc. You can verify any asset using shasum -a 256 -c SHA256SUMS.
Add the dependency to your Cargo.toml:
[dependencies]
bankstatementparser = "0.0.2" Then parse any statement file into strongly-typed structures:
use bankstatementparser::Parser;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parser = Parser::new();
let statement = parser.parse_file(Path::new("statement.pdf"))?;
println!("Account: {}, Balance: {}", statement.account_id, statement.closing_balance);
Ok(())
} Pre-compiled binary wheels (compiled with PyO3 and Maturin) are distributed on PyPI for Linux, macOS (Apple Silicon and Intel), and Windows. No Rust compiler is required on your servers. Install via pip:
pip install bankstatementparser And use it in Python:
from bankstatementparser import parse_statement
statement = parse_statement("statement.pdf")
print(f"Transactions parsed: {len(statement.transactions)}") Yes. Minimal, non-root container images are published on GitHub Container Registry. Mount your local statement directory to run extraction in an isolated container:
docker run --rm -v $(pwd):/data ghcr.io/sebastienrousseau/bankstatementparser:latest --input /data/statement.pdf --format json The CLI and SDK include a Rayon-based work-stealing parallel engine. Processing thousands of statement files scales linearly across available CPU threads without lock contention. Passing --threads 8 allows 10,000 statements to be ingested, normalized, and validated in under 8.2 seconds.
Yes. The project is dual-licensed under the Apache License 2.0 and the MIT License. You are permitted to select either license, enabling full commercial use, private modification, and closed-source redistribution without copyleft obligations.
During extraction, every account IBAN is verified against ISO 7064 Mod-97 checksums, and bank identifiers are validated against ISO 9362 BIC structures. The engine enforces double-entry arithmetic proofs (Opening Balance + Credits - Debits == Closing Balance). If a balance mismatch is detected, a deterministic reconciliation discrepancy record is emitted.
Yes. In addition to native parsers for major global banking institutions, Bank Statement Parser supports external YAML/JSON configuration files. Treasury teams can define custom table coordinates, regular expression transaction anchors, and date/currency mappings without modifying the underlying engine.
We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Try searching for broader terms such as “Docker”, “ISO 20022”, “Python”, or “OCR”.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Questions & Answers
Comprehensive guidance covering specifications, zero-telemetry local execution, performance, and commercial licensing.
Bank Statement Parser is engineered entirely in high-assurance native Rust with zero-copy stream processing, SIMD-accelerated string scanners, and direct memory layout mapping. By avoiding intermediate object allocations and skipping heavy browser engines or JVM runtimes, the tokenizer parses complex PDF text streams and multi-megabyte CSV files in under 0.8 ms per statement on standard multi-core hardware.
The parser provides native, deterministic parsers for eight primary banking standards worldwide:
The engine implements strict deterministic error boundaries. When an ambiguous date format or corrupted record is encountered, the parser isolates the specific record rather than failing the entire document batch. It attaches a structured diagnostic warning to the output while verifying opening and closing balance arithmetic to alert compliance operators if amounts fail reconciliation.
Yes. When compiled with the optional --features ocr flag, Bank Statement Parser leverages local, offline optical character recognition models. Scanned bitmap PDFs or image statements (TIFF, PNG) are converted to bounding-box coordinates and passed to the lexical tokenizer without transmitting any image data over the network.
Zero network egress, guaranteed. Bank Statement Parser is 100% self-contained and operates exclusively in local memory. It contains zero telemetry, zero analytics beacons, zero crash reporters, and zero background network calls. All document ingestion, tokenization, and schema validation execute strictly within your local process sandbox.
Security teams can verify our zero-egress guarantee through multiple standard controls: running the binary inside a network-isolated Linux namespace (unshare -n), deploying within a Docker container configured with --network none, or inspecting socket activity via strace / lsof. In all scenarios, zero socket binds or DNS resolutions occur.
No. Bank Statement Parser operates strictly in volatile memory. Statement byte buffers are allocated during stream processing and immediately scrubbed upon completion. No temporary files, swap caches, or intermediate scratch artifacts are written to persistent disk unless explicitly directed by the caller via the --output parameter.
Every release includes a machine-readable CycloneDX Software Bill of Materials (SBOM) and SHA256 checksums recorded in SHA256SUMS. All Git release tags and binaries are signed using SSH maintainer keys published in KEYS.asc. You can verify any asset using shasum -a 256 -c SHA256SUMS.
Add the dependency to your Cargo.toml:
[dependencies]
bankstatementparser = "0.0.2" Then parse any statement file into strongly-typed structures:
use bankstatementparser::Parser;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parser = Parser::new();
let statement = parser.parse_file(Path::new("statement.pdf"))?;
println!("Account: {}, Balance: {}", statement.account_id, statement.closing_balance);
Ok(())
} Pre-compiled binary wheels (compiled with PyO3 and Maturin) are distributed on PyPI for Linux, macOS (Apple Silicon and Intel), and Windows. No Rust compiler is required on your servers. Install via pip:
pip install bankstatementparser And use it in Python:
from bankstatementparser import parse_statement
statement = parse_statement("statement.pdf")
print(f"Transactions parsed: {len(statement.transactions)}") Yes. Minimal, non-root container images are published on GitHub Container Registry. Mount your local statement directory to run extraction in an isolated container:
docker run --rm -v $(pwd):/data ghcr.io/sebastienrousseau/bankstatementparser:latest --input /data/statement.pdf --format json The CLI and SDK include a Rayon-based work-stealing parallel engine. Processing thousands of statement files scales linearly across available CPU threads without lock contention. Passing --threads 8 allows 10,000 statements to be ingested, normalized, and validated in under 8.2 seconds.
Yes. The project is dual-licensed under the Apache License 2.0 and the MIT License. You are permitted to select either license, enabling full commercial use, private modification, and closed-source redistribution without copyleft obligations.
During extraction, every account IBAN is verified against ISO 7064 Mod-97 checksums, and bank identifiers are validated against ISO 9362 BIC structures. The engine enforces double-entry arithmetic proofs (Opening Balance + Credits - Debits == Closing Balance). If a balance mismatch is detected, a deterministic reconciliation discrepancy record is emitted.
Yes. In addition to native parsers for major global banking institutions, Bank Statement Parser supports external YAML/JSON configuration files. Treasury teams can define custom table coordinates, regular expression transaction anchors, and date/currency mappings without modifying the underlying engine.
We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Try searching for broader terms such as “Docker”, “ISO 20022”, “Python”, or “OCR”.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Specifications Matrix
Deterministic multi-standard document ingestion with automated schema normalization across 8 financial formats, Parquet streaming, and ledger exports.
Bank Statement Parser provides deterministic, zero-telemetry ingestion and mathematical balance verification across eight primary banking standards worldwide. Every format is normalized into strongly-typed Transaction and Statement models ready for ERP integration, corporate treasury, automated reconciliation, and OLAP analytics.
| Format | Standard / Specification | Extraction Method | Validation Engine |
|---|---|---|---|
| PDF Statements | Adobe PDF 1.4–2.0 (Vector & Scanned) | Spatial coordinate tokenizer & local OCR/vision fallback | Mathematical balance verification & IBAN Mod-97 checksum |
| CSV & Delimited | RFC 4180 with Dialect Auto-Detect | Statistical delimiter, decimal, and date header inference | Column type inference & date format normalization |
| BAI2 Cash Management | Bank Administration Institute (BAI2) | Deterministic record state machine (Records 01–99) | Account status balance codes & record 88 continuation validation |
| SWIFT MT940 | SWIFT Standards Release 2026 (End-of-Day) | Tag-based state machine parser (:20:, :25:, :60F:, :61:, :62F:) | Opening/closing balance arithmetic (Fields 60F/62F) |
| SWIFT MT942 | SWIFT Standards Release 2026 (Interim) | Intraday credit/debit transaction stream parser | Field 34F floor limit & summary amount reconciliation |
| ISO 20022 CAMT | camt.052, camt.053, and camt.054 (v2–v12) | Zero-copy XML streaming parser | W3C XML Schema (XSD) & opening/closing balance proofs |
| ISO 20022 PAIN.001 | pain.001.001.03–11 (Customer Credit Transfer) | Deterministic XML payment initiation parser | Payment control sum & transaction count verification |
| OFX & Quicken QFX | Open Financial Exchange (1.02–2.2 SGML & XML) | Robust tree parser with SGML unclosed-tag repair | Standard banking DTD & transaction UID deduplication |
ISO 20022 is the global standard for electronic data interchange between financial institutions. Bank Statement Parser supports canonical cash management messages (CAMT) and payment initiation instructions (PAIN.001) across all published versions (v2 through v12):
The parser provides native tag-based state machines for legacy SWIFT MT formats without reliance on regular expressions:
/EREF/ (End-to-End Reference), /PREF/ (Payment Reference), /REMI/ (Remittance Info), /IBAN/, and /BIC/.BAI2 is the North American standard created by the Bank Administration Institute for corporate account reporting. Bank Statement Parser deterministically parses the hierarchical record sequence:
Open Financial Exchange (OFX) and Quicken Financial Exchange (QFX) formats are widely used by retail and commercial banks across North America and Europe:
BANKMSGSRSV1, STMTTRNRS, and STMTRS aggregates.FITID (Financial Institution Transaction ID) hashing prevents duplicate booking entries during multi-account batch ingestion.CSV is the most ubiquitous yet least standardized financial format. Bank Statement Parser implements a statistical dialect inference engine that automatically determines:
,), semicolon (;), tab (\t), or pipe (|).YYYY-MM-DD), European (DD/MM/YYYY), and US (MM/DD/YYYY) formats inferred from semantic date distributions.1,234.56 vs. 1.234,56).Financial institutions frequently deliver statements in PDF format. Bank Statement Parser provides a dual-mode engine for complete document recovery:
In addition to strongly-typed JSON and CSV, Bank Statement Parser supports industrial streaming analytics and plain-text accounting ledger pipelines:
ParquetStreamWriter): High-performance, columnar Parquet export with snappy or zstd compression. Supports streaming hundreds of thousands of transactions directly to disk or S3 with constant memory usage.hledger, beancount, and ledger-cli double-entry bookkeeping systems.bankstatementparser[parquet] and bankstatementparser[polars] extras.Specifications Matrix
Deterministic multi-standard document ingestion with automated schema normalization across 8 financial formats, Parquet streaming, and ledger exports.
Bank Statement Parser provides deterministic, zero-telemetry ingestion and mathematical balance verification across eight primary banking standards worldwide. Every format is normalized into strongly-typed Transaction and Statement models ready for ERP integration, corporate treasury, automated reconciliation, and OLAP analytics.
| Format | Standard / Specification | Extraction Method | Validation Engine |
|---|---|---|---|
| PDF Statements | Adobe PDF 1.4–2.0 (Vector & Scanned) | Spatial coordinate tokenizer & local OCR/vision fallback | Mathematical balance verification & IBAN Mod-97 checksum |
| CSV & Delimited | RFC 4180 with Dialect Auto-Detect | Statistical delimiter, decimal, and date header inference | Column type inference & date format normalization |
| BAI2 Cash Management | Bank Administration Institute (BAI2) | Deterministic record state machine (Records 01–99) | Account status balance codes & record 88 continuation validation |
| SWIFT MT940 | SWIFT Standards Release 2026 (End-of-Day) | Tag-based state machine parser (:20:, :25:, :60F:, :61:, :62F:) | Opening/closing balance arithmetic (Fields 60F/62F) |
| SWIFT MT942 | SWIFT Standards Release 2026 (Interim) | Intraday credit/debit transaction stream parser | Field 34F floor limit & summary amount reconciliation |
| ISO 20022 CAMT | camt.052, camt.053, and camt.054 (v2–v12) | Zero-copy XML streaming parser | W3C XML Schema (XSD) & opening/closing balance proofs |
| ISO 20022 PAIN.001 | pain.001.001.03–11 (Customer Credit Transfer) | Deterministic XML payment initiation parser | Payment control sum & transaction count verification |
| OFX & Quicken QFX | Open Financial Exchange (1.02–2.2 SGML & XML) | Robust tree parser with SGML unclosed-tag repair | Standard banking DTD & transaction UID deduplication |
ISO 20022 is the global standard for electronic data interchange between financial institutions. Bank Statement Parser supports canonical cash management messages (CAMT) and payment initiation instructions (PAIN.001) across all published versions (v2 through v12):
The parser provides native tag-based state machines for legacy SWIFT MT formats without reliance on regular expressions:
/EREF/ (End-to-End Reference), /PREF/ (Payment Reference), /REMI/ (Remittance Info), /IBAN/, and /BIC/.BAI2 is the North American standard created by the Bank Administration Institute for corporate account reporting. Bank Statement Parser deterministically parses the hierarchical record sequence:
Open Financial Exchange (OFX) and Quicken Financial Exchange (QFX) formats are widely used by retail and commercial banks across North America and Europe:
BANKMSGSRSV1, STMTTRNRS, and STMTRS aggregates.FITID (Financial Institution Transaction ID) hashing prevents duplicate booking entries during multi-account batch ingestion.CSV is the most ubiquitous yet least standardized financial format. Bank Statement Parser implements a statistical dialect inference engine that automatically determines:
,), semicolon (;), tab (\t), or pipe (|).YYYY-MM-DD), European (DD/MM/YYYY), and US (MM/DD/YYYY) formats inferred from semantic date distributions.1,234.56 vs. 1.234,56).Financial institutions frequently deliver statements in PDF format. Bank Statement Parser provides a dual-mode engine for complete document recovery:
In addition to strongly-typed JSON and CSV, Bank Statement Parser supports industrial streaming analytics and plain-text accounting ledger pipelines:
ParquetStreamWriter): High-performance, columnar Parquet export with snappy or zstd compression. Supports streaming hundreds of thousands of transactions directly to disk or S3 with constant memory usage.hledger, beancount, and ledger-cli double-entry bookkeeping systems.bankstatementparser[parquet] and bankstatementparser[polars] extras.Installation & Guide
Installation instructions for Rust, Python, Docker, and CLI alongside step-by-step extraction quickstarts.
Bank Statement Parser is an open-source, high-throughput financial document engine engineered in Rust with native Python bindings. Follow this guide to install the binary, process multi-format statement documents, or embed the SDK directly into your application stack.
Native library integration and standalone CLI compiled directly from source for maximum CPU throughput.
cargo install bankstatementparser Pre-compiled PyO3 binary wheels for Linux, macOS (Apple Silicon and Intel), and Windows with optional Parquet extras.
pip install bankstatementparser
# Optional: Apache Parquet and Polars streaming support
pip install "bankstatementparser[parquet]"
-pip install "bankstatementparser[polars]" Minimal, non-root container image published on GitHub Container Registry for air-gapped CI/CD execution.
docker pull ghcr.io/sebastienrousseau/bankstatementparser:latest Pre-built standalone CLI binary distributed via official Homebrew tap for immediate terminal workstation access.
brew install sebastienrousseau/tap/bankstatementparser The standalone binary provides fast parsing for individual bank statement files across digital PDF, CSV, OFX, and QIF formats, emitting standard JSON, CSV, or ISO 20022 CAMT.053 XML:
For high-volume transaction processing, enable multi-threaded batch ingestion to parse entire directories in parallel:
Add the dependency to your Cargo.toml:
Parse any statement into strongly-typed transaction structs with compile-time memory safety:
Extract and validate transaction records within your Python data science and finance workflows with zero native compilation:
Every extraction pipeline executes exclusively within local process memory. Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys:
Minimal, non-root container image published on GitHub Container Registry for air-gapped CI/CD execution.
docker pull ghcr.io/sebastienrousseau/bankstatementparser:latest Pre-built standalone CLI binary distributed via official Homebrew tap for immediate terminal workstation access.
brew install sebastienrousseau/tap/bankstatementparser The standalone binary provides fast parsing for individual bank statement files across digital PDF, CSV, OFX, and QIF formats, emitting standard JSON, CSV, or ISO 20022 CAMT.053 XML:
For high-volume transaction processing, enable multi-threaded batch ingestion to parse entire directories in parallel:
Add the dependency to your Cargo.toml:
Parse any statement into strongly-typed transaction structs with compile-time memory safety:
Extract and validate transaction records within your Python data science and finance workflows with zero native compilation:
Every extraction pipeline executes exclusively within local process memory. Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys:
Financial Document Engineering · Open Source
An open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
View Treasury PlaybookEngine Architecture
Industrial-grade financial parsing combining memory-safe Rust execution, native Python bindings, and dual Apache/MIT licensing.
Deterministic state machines parse digital and scanned PDFs, irregular CSV layouts, SGML OFX/QFX, BAI2 cash management, and SWIFT MT940/MT942 messages without brittle regex or external cloud OCR.
Strict mathematical balance validation ensures opening balance plus net credits and debits precisely equals closing balance to the penny before record emission.
Normalize disparate bank statements directly into canonical ISO 20022 CAMT.053 XML envelopes, Apache Parquet streams, or strongly-typed JSON schemas ready for ERP, GL, and accounting ingestion.
The Processing Pipeline
Stream PDF bytes, CSV feeds, BAI2 files, or SWIFT MT940/MT942 messages into memory-safe zero-copy buffers.
Sub-millisecond stream loadingDeterministic lexical analysis identifies account metadata, booking dates, line items, and structured :86: sub-tags.
Deterministic layout analysisArithmetic balance reconciliation confirms credit/debit integrity, checks PDF forensics, and validates IBAN checksums.
Mod-97 and balance proofsOutput strongly-typed JSON, streaming Apache Parquet, Plain-Text Ledgers (hledger, beancount), or ISO 20022 messages.
Ready for ERP, Lakehouse & GL
High-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
View Architecture BlueprintDeveloper Quickstart
Deploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Zero-Telemetry Privacy
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Clear Answers
No. Bank Statement Parser is 100% self-contained and operates entirely on your local machine or private cloud server. It contains zero analytics, zero telemetry, and zero outbound network calls, ensuring complete compliance with GDPR, HIPAA, GLBA, and banking confidentiality regulations.
Bank Statement Parser natively supports eight primary banking formats: ISO 20022 CAMT (camt.052, camt.053, camt.054), ISO 20022 PAIN.001 (Credit Transfer), SWIFT MT940 and MT942 messages, BAI2 (Bank Administration Institute), Open Financial Exchange (OFX 1.x/2.x and QFX), CSV files (with automatic delimiter and date detection), and digital/scanned PDF statements.
For digital and vector PDFs, the engine extracts structured text streams directly with zero loss. For scanned image statements, an optional local OCR module performs deterministic optical layout parsing with zero external cloud API dependencies.
Yes. Bank Statement Parser is dual-licensed under the Apache-2.0 and MIT open-source licenses. You can freely integrate it into commercial SaaS products, enterprise backends, and internal financial pipelines.
Developer Quickstart
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
Install Bank Statement ParserFinancial Document Engineering · Open Source
An open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
View Treasury PlaybookEngine Architecture
Industrial-grade financial parsing combining memory-safe Rust execution, native Python bindings, and dual Apache/MIT licensing.
Deterministic state machines parse digital and scanned PDFs, irregular CSV layouts, SGML OFX/QFX, BAI2 cash management, and SWIFT MT940/MT942 messages without brittle regex or external cloud OCR.
Strict mathematical balance validation ensures opening balance plus net credits and debits precisely equals closing balance to the penny before record emission.
Normalize disparate bank statements directly into canonical ISO 20022 CAMT.053 XML envelopes, Apache Parquet streams, or strongly-typed JSON schemas ready for ERP, GL, and accounting ingestion.
The Processing Pipeline
Stream PDF bytes, CSV feeds, BAI2 files, or SWIFT MT940/MT942 messages into memory-safe zero-copy buffers.
Sub-millisecond stream loadingDeterministic lexical analysis identifies account metadata, booking dates, line items, and structured :86: sub-tags.
Deterministic layout analysisArithmetic balance reconciliation confirms credit/debit integrity, checks PDF forensics, and validates IBAN checksums.
Mod-97 and balance proofsOutput strongly-typed JSON, streaming Apache Parquet, Plain-Text Ledgers (hledger, beancount), or ISO 20022 messages.
Ready for ERP, Lakehouse & GL
High-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
View Architecture BlueprintDeveloper Quickstart
Deploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Zero-Telemetry Privacy
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Clear Answers
No. Bank Statement Parser is 100% self-contained and operates entirely on your local machine or private cloud server. It contains zero analytics, zero telemetry, and zero outbound network calls, ensuring complete compliance with GDPR, HIPAA, GLBA, and banking confidentiality regulations.
Bank Statement Parser natively supports eight primary banking formats: ISO 20022 CAMT (camt.052, camt.053, camt.054), ISO 20022 PAIN.001 (Credit Transfer), SWIFT MT940 and MT942 messages, BAI2 (Bank Administration Institute), Open Financial Exchange (OFX 1.x/2.x and QFX), CSV files (with automatic delimiter and date detection), and digital/scanned PDF statements.
For digital and vector PDFs, the engine extracts structured text streams directly with zero loss. For scanned image statements, an optional local OCR module performs deterministic optical layout parsing with zero external cloud API dependencies.
Yes. Bank Statement Parser is dual-licensed under the Apache-2.0 and MIT open-source licenses. You can freely integrate it into commercial SaaS products, enterprise backends, and internal financial pipelines.
Developer Quickstart
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
Install Bank Statement ParserAn open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
-View Treasury Playbook +View Treasury PlaybookHigh-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
-View Architecture Blueprint +View Architecture BlueprintDeploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
-Install Bank Statement Parser +Install Bank Statement ParserWe provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
+We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Static Architecture
Why Bank Statement Parser documentation is statically generated for uncompromising security, WCAG AAA accessibility, and instant loading.
This site is natively compiled using the high-performance Static Site Generator (SSG) written in Rust.
_posts/*.md) with Tera templates (_layouts/*.html).Static Architecture
Why Bank Statement Parser documentation is statically generated for uncompromising security, WCAG AAA accessibility, and instant loading.
This site is natively compiled using the high-performance Static Site Generator (SSG) written in Rust.
_posts/*.md) with Tera templates (_layouts/*.html).Network Disconnected
Documentation is cached locally via service worker for uninterrupted offline engineering.
Bank Statement Parser documentation has been cached for offline availability. Check your internet connection to refresh live data feeds.
Network Disconnected
Documentation is cached locally via service worker for uninterrupted offline engineering.
Bank Statement Parser documentation has been cached for offline availability. Check your internet connection to refresh live data feeds.
Trust & Governance
Our foundational commitment: zero tracking, zero analytics, zero external network requests, and complete local processing.
Last updated: 1 September 2026
Bank Statement Parser is built on a strict zero-telemetry, zero-cookie architecture:
Trust & Governance
Our foundational commitment: zero tracking, zero analytics, zero external network requests, and complete local processing.
Last updated: 1 September 2026
Bank Statement Parser is built on a strict zero-telemetry, zero-cookie architecture:
Zero-Telemetry Model
Strict zero-telemetry guarantees, memory safety verification, and Sigstore-signed releases for compliance-critical pipelines.
Financial statement data demands strict confidentiality, rigorous boundary isolation, and deterministic mathematical verification. Bank Statement Parser is architected from the foundation up to operate securely within air-gapped sovereign environments.
Bank Statement Parser binds no listening network ports and initiates no outbound TCP, UDP, or HTTP connections. All parsing, coordinate tokenization, and schema validation execute entirely within local process memory.
| Security Vector | Implementation Standard | Verification Audit |
|---|---|---|
| Network Socket Access | Zero outbound or listening sockets initialized | Enforced via eBPF / seccomp system call filter |
| Heap Memory Sanitization | Zero sensitive statement data written to temporary disks | Cleared immediately upon statement struct deallocation |
| Third-Party SaaS Telemetry | Zero third-party analytics or error tracking SDKs | Static binary symbol inspection in CI |
| Subresource Integrity | SHA-384 cryptographic digests on all assets | Enforced by W3C Content Security Policy (CSP) |
Every release artifact is cryptographically signed and independently auditable using SLSA Level 3 build provenance. A CycloneDX SBOM is published with every release to track transitive dependencies and vulnerability CVE states:
The system is purpose-built for financial institutions, hedge funds, sovereign banks, and regulated audit firms requiring verifiable isolation from public cloud APIs.
Zero-Telemetry Model
Strict zero-telemetry guarantees, memory safety verification, and Sigstore-signed releases for compliance-critical pipelines.
Financial statement data demands strict confidentiality, rigorous boundary isolation, and deterministic mathematical verification. Bank Statement Parser is architected from the foundation up to operate securely within air-gapped sovereign environments.
Bank Statement Parser binds no listening network ports and initiates no outbound TCP, UDP, or HTTP connections. All parsing, coordinate tokenization, and schema validation execute entirely within local process memory.
| Security Vector | Implementation Standard | Verification Audit |
|---|---|---|
| Network Socket Access | Zero outbound or listening sockets initialized | Enforced via eBPF / seccomp system call filter |
| Heap Memory Sanitization | Zero sensitive statement data written to temporary disks | Cleared immediately upon statement struct deallocation |
| Third-Party SaaS Telemetry | Zero third-party analytics or error tracking SDKs | Static binary symbol inspection in CI |
| Subresource Integrity | SHA-384 cryptographic digests on all assets | Enforced by W3C Content Security Policy (CSP) |
Every release artifact is cryptographically signed and independently auditable using SLSA Level 3 build provenance. A CycloneDX SBOM is published with every release to track transitive dependencies and vulnerability CVE states:
The system is purpose-built for financial institutions, hedge funds, sovereign banks, and regulated audit firms requiring verifiable isolation from public cloud APIs.
Legal Framework
Clear, transparent terms governing the use of Bank Statement Parser open source software and enterprise documentation.
Bank Statement Parser is distributed under the dual Apache License 2.0 and MIT License.
You may use, modify, distribute, and integrate the software into commercial and open-source applications subject to the terms of either license.
Legal Framework
Clear, transparent terms governing the use of Bank Statement Parser open source software and enterprise documentation.
Bank Statement Parser is distributed under the dual Apache License 2.0 and MIT License.
You may use, modify, distribute, and integrate the software into commercial and open-source applications subject to the terms of either license.
Message Dispatched
Your inquiry has been securely routed to our engineering team. We will respond within one business day.
We have received your inquiry regarding Bank Statement Parser. A systems engineer will respond within one business day.
Message Dispatched
Your inquiry has been securely routed to our engineering team. We will respond within one business day.
We have received your inquiry regarding Bank Statement Parser. A systems engineer will respond within one business day.
Production Blueprints
High-throughput statement extraction powering corporate treasury automation, automated reconciliation, SME credit underwriting, and forensic audit screening.
High-throughput statement extraction powers critical automated financial backends with zero cloud dependencies, air-gapped security, and deterministic precision.
Enterprise treasuries manage accounts across dozens of global banking partners (Citi, JPMorgan Chase, BNP Paribas, HSBC, Deutsche Bank). Each bank issues disparate statement formats with varying column orders, multi-currency balance headers, and non-standard narrative formatting. Bank Statement Parser unifies incoming statement feeds into canonical ISO 20022 camt.053 XML and JSON structures for real-time liquidity management.
| Operational Dimension | Legacy Manual / OCR Workflow | Bank Statement Parser Engine |
|---|---|---|
| Processing Latency | 30–45 minutes per multi-page statement | < 5 milliseconds per statement |
| Balance Verification | Manual human calculation or unverified | Mathematical proof (Opening + Transactions = Closing) |
| Liquidity Visibility | T+1 or T+2 retrospective reporting | Continuous real-time intraday cash positioning |
| Transcription Error Rate | 2.1% – 3.5% human keying errors | 0.00% deterministic spatial coordinate extraction |
Finance operations teams reconcile millions of bank transaction lines against general ledger (GL) entries every fiscal period. Irregular descriptions, truncated transaction codes, and disparate currency notations typically create enormous manual exception queues. Bank Statement Parser normalizes reference numbers, counterparty names, and structured remittance data to drive straight-through processing (STP) rates above 99.8%.
| Reconciliation Metric | Generic PDF Scraper | Bank Statement Parser Engine |
|---|---|---|
| Payee Normalization | Raw truncated strings with bank noise | Clean entity names with stripped routing prefixes |
| Reference Code Extraction | Brittle regex frequently drops end tokens | Coordinate-aware token bounding for full invoice codes |
| STP Match Rate | 60% – 75% (heavy manual review) | 99.8% automated straight-through processing |
| Multi-Currency Handling | String-level assumptions | ISO 4217 validation with decimal-exact precision |
Modern commercial lenders and merchant cash advance platforms require rapid, accurate extraction of 12 to 24 months of applicant bank statements. The engine calculates net operating cash flows, recurring revenue, non-sufficient funds (NSF) events, and average daily balances in milliseconds—enabling instant credit decisions while applicants are still on the lender's application portal.
| Underwriting Parameter | Human Document Review | Bank Statement Parser |
|---|---|---|
| Turnaround Time | 24 to 72 hours per dossier | < 500 milliseconds for 24 months |
| Dossier Volume | Sampled 3 months due to cost | 12–24 months fully ingested and analyzed |
| Document Tampering Detection | Subjective visual check | Mathematical invariant verification detects doctored numbers |
| Cost per Application | $25 – $50 in human labor | $0.00 (Self-hosted native engine) |
Forensic accountants and AML investigators examine thousands of historical bank statements during restructuring, corporate acquisitions, bankruptcy inquiries, and regulatory investigations. The parser's air-gapped, zero-network architecture guarantees that sensitive banking data never leaves local customer infrastructure or secure enclaves.
| Investigation Capability | Cloud OCR Services | Bank Statement Parser |
|---|---|---|
| Data Sovereignty & Privacy | Customer data sent to external cloud APIs | 100% on-premises / air-gapped execution |
| Historical Batch Throughput | Limited by cloud API rate-limits & cost | 10,450 pages/minute on workstation hardware |
| IBAN & BIC Validation | Unchecked strings with OCR transcription drift | ISO 13616 Mod-97 and ISO 9362 structural validation |
| Evidentiary Audit Trail | Lossy, potentially hallucinated text | Deterministic byte-exact coordinate provenance |
Bank Statement Parser deploys flexibly across enterprise architectures: as a standalone native CLI binary, a zero-overhead microservice sidecar in Kubernetes clusters, or an embedded library in Python, Rust, and WebAssembly applications.
Production Blueprints
High-throughput statement extraction powering corporate treasury automation, automated reconciliation, SME credit underwriting, and forensic audit screening.
High-throughput statement extraction powers critical automated financial backends with zero cloud dependencies, air-gapped security, and deterministic precision.
Enterprise treasuries manage accounts across dozens of global banking partners (Citi, JPMorgan Chase, BNP Paribas, HSBC, Deutsche Bank). Each bank issues disparate statement formats with varying column orders, multi-currency balance headers, and non-standard narrative formatting. Bank Statement Parser unifies incoming statement feeds into canonical ISO 20022 camt.053 XML and JSON structures for real-time liquidity management.
| Operational Dimension | Legacy Manual / OCR Workflow | Bank Statement Parser Engine |
|---|---|---|
| Processing Latency | 30–45 minutes per multi-page statement | < 5 milliseconds per statement |
| Balance Verification | Manual human calculation or unverified | Mathematical proof (Opening + Transactions = Closing) |
| Liquidity Visibility | T+1 or T+2 retrospective reporting | Continuous real-time intraday cash positioning |
| Transcription Error Rate | 2.1% – 3.5% human keying errors | 0.00% deterministic spatial coordinate extraction |
Finance operations teams reconcile millions of bank transaction lines against general ledger (GL) entries every fiscal period. Irregular descriptions, truncated transaction codes, and disparate currency notations typically create enormous manual exception queues. Bank Statement Parser normalizes reference numbers, counterparty names, and structured remittance data to drive straight-through processing (STP) rates above 99.8%.
| Reconciliation Metric | Generic PDF Scraper | Bank Statement Parser Engine |
|---|---|---|
| Payee Normalization | Raw truncated strings with bank noise | Clean entity names with stripped routing prefixes |
| Reference Code Extraction | Brittle regex frequently drops end tokens | Coordinate-aware token bounding for full invoice codes |
| STP Match Rate | 60% – 75% (heavy manual review) | 99.8% automated straight-through processing |
| Multi-Currency Handling | String-level assumptions | ISO 4217 validation with decimal-exact precision |
Modern commercial lenders and merchant cash advance platforms require rapid, accurate extraction of 12 to 24 months of applicant bank statements. The engine calculates net operating cash flows, recurring revenue, non-sufficient funds (NSF) events, and average daily balances in milliseconds—enabling instant credit decisions while applicants are still on the lender's application portal.
| Underwriting Parameter | Human Document Review | Bank Statement Parser |
|---|---|---|
| Turnaround Time | 24 to 72 hours per dossier | < 500 milliseconds for 24 months |
| Dossier Volume | Sampled 3 months due to cost | 12–24 months fully ingested and analyzed |
| Document Tampering Detection | Subjective visual check | Mathematical invariant verification detects doctored numbers |
| Cost per Application | $25 – $50 in human labor | $0.00 (Self-hosted native engine) |
Forensic accountants and AML investigators examine thousands of historical bank statements during restructuring, corporate acquisitions, bankruptcy inquiries, and regulatory investigations. The parser's air-gapped, zero-network architecture guarantees that sensitive banking data never leaves local customer infrastructure or secure enclaves.
| Investigation Capability | Cloud OCR Services | Bank Statement Parser |
|---|---|---|
| Data Sovereignty & Privacy | Customer data sent to external cloud APIs | 100% on-premises / air-gapped execution |
| Historical Batch Throughput | Limited by cloud API rate-limits & cost | 10,450 pages/minute on workstation hardware |
| IBAN & BIC Validation | Unchecked strings with OCR transcription drift | ISO 13616 Mod-97 and ISO 9362 structural validation |
| Evidentiary Audit Trail | Lossy, potentially hallucinated text | Deterministic byte-exact coordinate provenance |
Bank Statement Parser deploys flexibly across enterprise architectures: as a standalone native CLI binary, a zero-overhead microservice sidecar in Kubernetes clusters, or an embedded library in Python, Rust, and WebAssembly applications.
Error 404
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
Error 404
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
Error 404
The financial documentation resource you requested could not be located on this server.
The requested financial documentation page does not exist or has been moved.
Engineering & Leadership
Principal engineer building high-assurance, privacy-first financial infrastructure and cryptographic document tooling.
With nineteen years of hands-on systems engineering across tier-1 investment banking, clearing gateways, and treasury infrastructures in London and international financial hubs, Sebastien specializes in high-throughput document tokenization, payment message harmonization, and post-quantum cryptographic security.
Engineering & Leadership
Principal engineer building high-assurance, privacy-first financial infrastructure and cryptographic document tooling.
With nineteen years of hands-on systems engineering across tier-1 investment banking, clearing gateways, and treasury infrastructures in London and international financial hubs, Sebastien specializes in high-throughput document tokenization, payment message harmonization, and post-quantum cryptographic security.
Inclusive Engineering
Dedicated to achieving WCAG 2.2 Level AAA compliance across all digital documentation and interactive financial tooling.
Bank Statement Parser is committed to digital accessibility, conforming strictly to WCAG 2.2 Level AAA guidelines:
nav, main, article, footer) and ARIA live regions.Inclusive Engineering
Dedicated to achieving WCAG 2.2 Level AAA compliance across all digital documentation and interactive financial tooling.
Bank Statement Parser is committed to digital accessibility, conforming strictly to WCAG 2.2 Level AAA guidelines:
nav, main, article, footer) and ARIA live regions.Developer Reference
Complete programming interfaces, types, and error handling for Rust, Python, and CLI pipelines.
Bank Statement Parser exposes deterministic, zero-allocation interfaces across both native Rust and PyO3-powered Python bindings. Every function executes strictly in-process with zero network telemetry, complete memory safety, and mathematical balance verification.
Integrate the native Rust crate directly into your backend services for maximum CPU throughput, sub-millisecond document parsing, and zero heap duplication:
Core data types provided by the native crate:
| Type / Symbol | Signature | Description |
|---|---|---|
Parser | struct Parser | Thread-safe parser engine supporting zero-copy byte slice and file ingestion. |
ParserBuilder | struct ParserBuilder | Configures parallel threads, balance invariants, and dialect heuristics. |
Statement | struct Statement | Normalized document model containing account ID, balances, currency, and transactions. |
Transaction | struct Transaction | Individual ledger item with booking date, value date, signed amount, and narrative. |
StatementFormat | enum StatementFormat | Output target variants: Json, Csv, Ofx, Qif, and Camt053. |
Pre-compiled binary wheels for Linux, macOS, and Windows provide native Rust speed directly inside Python data science, pandas, and web application workflows:
Core parsers and analytical tools exported by the module:
| Symbol | Type / Signature | Purpose & Description |
|---|---|---|
BankStatementParser | Class | Primary document engine for PDF layout extraction, OCR fallback, and multi-format routing. |
Bai2Parser | Class | Dedicated state machine parser for BAI2 corporate cash management files. |
CamtParser | Class | High-speed XML parser for ISO 20022 CAMT.052, CAMT.053, and CAMT.054 statements. |
Pain001Parser | Class | Parser for ISO 20022 PAIN.001 customer credit transfer payment instructions. |
Mt940Parser / Mt942Parser | Class | SWIFT MT940 end-of-day and MT942 intraday tag-based message parsers. |
ParquetStreamWriter | ContextManager | Streams batches of transactions directly to Apache Parquet with Snappy/Zstd compression. |
reconcile_payments_and_statements | Function | Two-way automated reconciliation matching payment orders against statement postings. |
inspect_pdf_forensics | Function | Audits PDF statements for font discrepancies, metadata modifications, and tampering findings. |
analyze_statement_transactions | Function | Computes cash flow summaries, average daily balances, NSF fees, and recurring cadences. |
All processing pipelines isolate corrupt documents, unsupported regional dialects, and balance arithmetic discrepancies into typed error exceptions without panics or unhandled crashes:
Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys. Sensitive financial documents and banking statements remain strictly confined within your own compute environment.
Developer Reference
Complete programming interfaces, types, and error handling for Rust, Python, and CLI pipelines.
Bank Statement Parser exposes deterministic, zero-allocation interfaces across both native Rust and PyO3-powered Python bindings. Every function executes strictly in-process with zero network telemetry, complete memory safety, and mathematical balance verification.
Integrate the native Rust crate directly into your backend services for maximum CPU throughput, sub-millisecond document parsing, and zero heap duplication:
Core data types provided by the native crate:
| Type / Symbol | Signature | Description |
|---|---|---|
Parser | struct Parser | Thread-safe parser engine supporting zero-copy byte slice and file ingestion. |
ParserBuilder | struct ParserBuilder | Configures parallel threads, balance invariants, and dialect heuristics. |
Statement | struct Statement | Normalized document model containing account ID, balances, currency, and transactions. |
Transaction | struct Transaction | Individual ledger item with booking date, value date, signed amount, and narrative. |
StatementFormat | enum StatementFormat | Output target variants: Json, Csv, Ofx, Qif, and Camt053. |
Pre-compiled binary wheels for Linux, macOS, and Windows provide native Rust speed directly inside Python data science, pandas, and web application workflows:
Core parsers and analytical tools exported by the module:
| Symbol | Type / Signature | Purpose & Description |
|---|---|---|
BankStatementParser | Class | Primary document engine for PDF layout extraction, OCR fallback, and multi-format routing. |
Bai2Parser | Class | Dedicated state machine parser for BAI2 corporate cash management files. |
CamtParser | Class | High-speed XML parser for ISO 20022 CAMT.052, CAMT.053, and CAMT.054 statements. |
Pain001Parser | Class | Parser for ISO 20022 PAIN.001 customer credit transfer payment instructions. |
Mt940Parser / Mt942Parser | Class | SWIFT MT940 end-of-day and MT942 intraday tag-based message parsers. |
ParquetStreamWriter | ContextManager | Streams batches of transactions directly to Apache Parquet with Snappy/Zstd compression. |
reconcile_payments_and_statements | Function | Two-way automated reconciliation matching payment orders against statement postings. |
inspect_pdf_forensics | Function | Audits PDF statements for font discrepancies, metadata modifications, and tampering findings. |
analyze_statement_transactions | Function | Computes cash flow summaries, average daily balances, NSF fees, and recurring cadences. |
All processing pipelines isolate corrupt documents, unsupported regional dialects, and balance arithmetic discrepancies into typed error exceptions without panics or unhandled crashes:
Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys. Sensitive financial documents and banking statements remain strictly confined within your own compute environment.
Engine Internals
High-throughput tokenization, deterministic stream parsing, and ISO 20022 message synthesis with zero runtime allocations.
Bank Statement Parser is architected around a deterministic, four-stage extraction and validation pipeline. Every stage executes in-process with zero outbound telemetry, zero heap allocation in the critical path, and strict mathematical balance verification before emitting ISO 20022 messages.
Zero-copy memory mapping (mmap) of input statement bytes with instant magic-byte format detection (PDF, CSV, OFX, MT940, CAMT.053).
Spatial coordinate mapping and multi-column tabular boundary reconstruction, preserving text flow across complex multi-page financial tables.
Zero Heap AllocationsCanonical standardization of 24 global date dialects, ISO 4217 currencies, and mod-97 IBAN checksum verification.
ISO 20022 BTC MappingMathematical invariant verification (Opening + ΣCredits - ΣDebits = Closing) before emitting validated JSON or ISO 20022 XML.
The trace below demonstrates the sub-millisecond execution lifecycle of the four-stage engine processing a multi-page PDF statement into validated ISO 20022 CAMT.053 XML:
The ingestion subsystem interfaces directly with the host filesystem via memory-mapped files (mmap), bypassing kernel-to-userspace buffer duplication. Byte slices are analyzed using non-backtracking magic-byte sniffers:
%PDF- and reads the cross-reference table (xref) directly from the trailer offset.OFXHEADER SGML tags or XML prologue <?xml version="1.0" to branch into streaming parser trees.:20:, :25:, :28C:) to route into deterministic line tokenizers.For unstructured formats such as digital PDF statements, standard text extraction destroys critical vertical alignment. Bank Statement Parser utilizes a deterministic coordinate-clustering engine:
BT, ET, Tj, TJ, Tm).
Extracted raw string tokens are converted into strongly-typed canonical primitives:
DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, and multi-lingual month names) into ISO 8601 UTC timestamps.1.234,56 vs 1,234.56), preserving scale as exact 64-bit fixed-point integers to eliminate IEEE 754 floating-point rounding drift.Before any extracted statement is emitted, the engine evaluates strict balance invariants to guarantee data integrity:
Upon invariant satisfaction, the engine streams the normalized data tree into target schemas:
camt.053.001.08 Bank-to-Customer Statement XML messages ready for direct core banking and treasury ingest.Engine Internals
High-throughput tokenization, deterministic stream parsing, and ISO 20022 message synthesis with zero runtime allocations.
Bank Statement Parser is architected around a deterministic, four-stage extraction and validation pipeline. Every stage executes in-process with zero outbound telemetry, zero heap allocation in the critical path, and strict mathematical balance verification before emitting ISO 20022 messages.
Zero-copy memory mapping (mmap) of input statement bytes with instant magic-byte format detection (PDF, CSV, OFX, MT940, CAMT.053).
Spatial coordinate mapping and multi-column tabular boundary reconstruction, preserving text flow across complex multi-page financial tables.
Zero Heap AllocationsCanonical standardization of 24 global date dialects, ISO 4217 currencies, and mod-97 IBAN checksum verification.
ISO 20022 BTC MappingMathematical invariant verification (Opening + ΣCredits - ΣDebits = Closing) before emitting validated JSON or ISO 20022 XML.
The trace below demonstrates the sub-millisecond execution lifecycle of the four-stage engine processing a multi-page PDF statement into validated ISO 20022 CAMT.053 XML:
The ingestion subsystem interfaces directly with the host filesystem via memory-mapped files (mmap), bypassing kernel-to-userspace buffer duplication. Byte slices are analyzed using non-backtracking magic-byte sniffers:
%PDF- and reads the cross-reference table (xref) directly from the trailer offset.OFXHEADER SGML tags or XML prologue <?xml version="1.0" to branch into streaming parser trees.:20:, :25:, :28C:) to route into deterministic line tokenizers.For unstructured formats such as digital PDF statements, standard text extraction destroys critical vertical alignment. Bank Statement Parser utilizes a deterministic coordinate-clustering engine:
BT, ET, Tj, TJ, Tm).
Extracted raw string tokens are converted into strongly-typed canonical primitives:
DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, and multi-lingual month names) into ISO 8601 UTC timestamps.1.234,56 vs 1,234.56), preserving scale as exact 64-bit fixed-point integers to eliminate IEEE 754 floating-point rounding drift.Before any extracted statement is emitted, the engine evaluates strict balance invariants to guarantee data integrity:
Upon invariant satisfaction, the engine streams the normalized data tree into target schemas:
camt.053.001.08 Bank-to-Customer Statement XML messages ready for direct core banking and treasury ingest.Performance Metrics
Empirical throughput and memory benchmarks comparing Bank Statement Parser against legacy Python and Java parser engines.
Benchmarked on Apple Silicon (M-series) and Linux x86_64 server hardware across 50,000 multi-page banking statements.
Empirical performance comparison processing standard 10-page commercial PDF bank statements with 150 transaction rows:
| Parser Engine | Language | Throughput (Pages/sec) | Memory (RSS) | Balance Check |
|---|---|---|---|---|
| Bank Statement Parser | Rust / Native | 174 pages/sec | 18 MB | Mathematical (100%) |
| PDFMiner.six | Python (Pure) | 3.8 pages/sec | 145 MB | None (Raw text) |
| Camelot (Lattice) | Python / OpenCV | 1.2 pages/sec | 380 MB | None (Visual only) |
| Tabula (Java) | Java / JVM | 8.4 pages/sec | 512 MB | None (Table grid) |
| Apache PDFBox | Java / JVM | 14.1 pages/sec | 290 MB | None (Text layout) |
Linear thread scalability benchmark across AMD EPYC 7763 (64-core) cloud instance ingesting batch directories:
The parser utilizes cache-friendly memory layouts, zero heap allocations in inner tokenizer loops, and SIMD vectorization for delimiter and byte scanning.
Performance Metrics
Empirical throughput and memory benchmarks comparing Bank Statement Parser against legacy Python and Java parser engines.
Benchmarked on Apple Silicon (M-series) and Linux x86_64 server hardware across 50,000 multi-page banking statements.
Empirical performance comparison processing standard 10-page commercial PDF bank statements with 150 transaction rows:
| Parser Engine | Language | Throughput (Pages/sec) | Memory (RSS) | Balance Check |
|---|---|---|---|---|
| Bank Statement Parser | Rust / Native | 174 pages/sec | 18 MB | Mathematical (100%) |
| PDFMiner.six | Python (Pure) | 3.8 pages/sec | 145 MB | None (Raw text) |
| Camelot (Lattice) | Python / OpenCV | 1.2 pages/sec | 380 MB | None (Visual only) |
| Tabula (Java) | Java / JVM | 8.4 pages/sec | 512 MB | None (Table grid) |
| Apache PDFBox | Java / JVM | 14.1 pages/sec | 290 MB | None (Text layout) |
Linear thread scalability benchmark across AMD EPYC 7763 (64-core) cloud instance ingesting batch directories:
The parser utilizes cache-friendly memory layouts, zero heap allocations in inner tokenizer loops, and SIMD vectorization for delimiter and byte scanning.
Release History
Deterministic versioning history, security audits, and functional enhancements across every release.
All notable changes to Bank Statement Parser are documented in this file following strict Semantic Versioning.
py/empty-except) in scripts/post-build.py and tightened exception handling in scripts/validate_spdx_headers.py.llms-full.txt alongside llms.txt for single-request LLM and coding agent ingestion.SOURCE_DATE_EPOCH builds and URL classification.rousseau-mbp-m1) in KEYS.asc and .github/allowed_signers.ssg 0.0.69, and pruned 40 unused legacy template files.KEYS.asc into valid OpenSSH allowed-signers format and honoured SOURCE_DATE_EPOCH in sitemap.xml generation.scripts/post-build.py by permitting whitespace and attributes in closing script tags.BreadcrumbList structured data across all subpages.sitemap.xml and canonical permalinks to trailing directory slashes and excluded 404/ and offline/ utility routes.ParquetStreamWriter) and batch export alongside plain-text ledger models (hledger, beancount, ledger-cli).reconcile_payments_and_statements), treasury analytics, and PDF forensics..hr-blurred:after in base layout template.Release History
Deterministic versioning history, security audits, and functional enhancements across every release.
All notable changes to Bank Statement Parser are documented in this file following strict Semantic Versioning.
sitemap.xml, redirected /faq/ and /contribute/ to /faqs/ and /contributing/, and served the 404 page for missing URLs.ssg 0.0.72.py/empty-except) in scripts/post-build.py and tightened exception handling in scripts/validate_spdx_headers.py.llms-full.txt alongside llms.txt for single-request LLM and coding agent ingestion.SOURCE_DATE_EPOCH builds and URL classification.rousseau-mbp-m1) in KEYS.asc and .github/allowed_signers.ssg 0.0.69, and pruned 40 unused legacy template files.KEYS.asc into valid OpenSSH allowed-signers format and honoured SOURCE_DATE_EPOCH in sitemap.xml generation.scripts/post-build.py by permitting whitespace and attributes in closing script tags.BreadcrumbList structured data across all subpages.sitemap.xml and canonical permalinks to trailing directory slashes and excluded 404/ and offline/ utility routes.ParquetStreamWriter) and batch export alongside plain-text ledger models (hledger, beancount, ledger-cli).reconcile_payments_and_statements), treasury analytics, and PDF forensics..hr-blurred:after in base layout template.Get in Touch
Engage with our core engineering team for custom banking dialects, high-throughput SLAs, or enterprise licensing.
Have a specialized bank statement format, high-volume batch requirement, or proprietary ERP integration?
Get in Touch
Engage with our core engineering team for custom banking dialects, high-throughput SLAs, or enterprise licensing.
Have a specialized bank statement format, high-volume batch requirement, or proprietary ERP integration?
Continue to https://bankstatementparser.com/contributing/.
+Community & Code
Guidelines for bug reporting, code contributions, DCO sign-offs, and test-driven verification.
Thank you for your interest in contributing to Bank Statement Parser. We welcome contributions for new regional statement dialects, zero-copy performance optimizations, parser rulebook definitions, and documentation improvements.
Bank Statement Parser is built in Rust with companion Python bindings. Ensure you have the stable Rust toolchain and Python 3.10+ installed:
Every pull request must pass the automated test suite, clippy linter checks, and formatting verification. 100% test coverage on new parsing dialects is required:
To protect privacy and comply with data sovereignty regulations, never submit real-world bank statements containing Personally Identifiable Information (PII) or authentic account details:
| Data Field | Invariant Requirement | Verification Method |
|---|---|---|
| IBAN Checksums | Must use valid ISO 7064 Mod-97 test numbers | Verified by test_sample_data_valid.rs |
| SWIFT / BIC | Structurally valid 8 or 11-char test BICs | ISO 9362 structural regex validation |
| Customer PII | Synthetic names, anonymized street addresses | Zero real customer records permitted |
| Currencies | Standard ISO 4217 currency identifiers (EUR, GBP, USD) | Matched against official currency table |
All contributions must follow Conventional Commits, be SSH/GPG signed, and carry a Developer Certificate of Origin (DCO) Signed-off-by trailer:
Community & Code
Guidelines for bug reporting, code contributions, DCO sign-offs, and test-driven verification.
Thank you for your interest in contributing to Bank Statement Parser. We welcome contributions for new regional statement dialects, zero-copy performance optimizations, parser rulebook definitions, and documentation improvements.
Bank Statement Parser is built in Rust with companion Python bindings. Ensure you have the stable Rust toolchain and Python 3.10+ installed:
Every pull request must pass the automated test suite, clippy linter checks, and formatting verification. 100% test coverage on new parsing dialects is required:
To protect privacy and comply with data sovereignty regulations, never submit real-world bank statements containing Personally Identifiable Information (PII) or authentic account details:
| Data Field | Invariant Requirement | Verification Method |
|---|---|---|
| IBAN Checksums | Must use valid ISO 7064 Mod-97 test numbers | Verified by test_sample_data_valid.rs |
| SWIFT / BIC | Structurally valid 8 or 11-char test BICs | ISO 9362 structural regex validation |
| Customer PII | Synthetic names, anonymized street addresses | Zero real customer records permitted |
| Currencies | Standard ISO 4217 currency identifiers (EUR, GBP, USD) | Matched against official currency table |
All contributions must follow Conventional Commits, be SSH/GPG signed, and carry a Developer Certificate of Origin (DCO) Signed-off-by trailer:
Continue to https://bankstatementparser.com/faqs/.
+Questions & Answers
Comprehensive guidance covering specifications, zero-telemetry local execution, performance, and commercial licensing.
Bank Statement Parser is engineered entirely in high-assurance native Rust with zero-copy stream processing, SIMD-accelerated string scanners, and direct memory layout mapping. By avoiding intermediate object allocations and skipping heavy browser engines or JVM runtimes, the tokenizer parses complex PDF text streams and multi-megabyte CSV files in under 0.8 ms per statement on standard multi-core hardware.
The parser provides native, deterministic parsers for eight primary banking standards worldwide:
The engine implements strict deterministic error boundaries. When an ambiguous date format or corrupted record is encountered, the parser isolates the specific record rather than failing the entire document batch. It attaches a structured diagnostic warning to the output while verifying opening and closing balance arithmetic to alert compliance operators if amounts fail reconciliation.
Yes. When compiled with the optional --features ocr flag, Bank Statement Parser leverages local, offline optical character recognition models. Scanned bitmap PDFs or image statements (TIFF, PNG) are converted to bounding-box coordinates and passed to the lexical tokenizer without transmitting any image data over the network.
Zero network egress, guaranteed. Bank Statement Parser is 100% self-contained and operates exclusively in local memory. It contains zero telemetry, zero analytics beacons, zero crash reporters, and zero background network calls. All document ingestion, tokenization, and schema validation execute strictly within your local process sandbox.
Security teams can verify our zero-egress guarantee through multiple standard controls: running the binary inside a network-isolated Linux namespace (unshare -n), deploying within a Docker container configured with --network none, or inspecting socket activity via strace / lsof. In all scenarios, zero socket binds or DNS resolutions occur.
No. Bank Statement Parser operates strictly in volatile memory. Statement byte buffers are allocated during stream processing and immediately scrubbed upon completion. No temporary files, swap caches, or intermediate scratch artifacts are written to persistent disk unless explicitly directed by the caller via the --output parameter.
Every release includes a machine-readable CycloneDX Software Bill of Materials (SBOM) and SHA256 checksums recorded in SHA256SUMS. All Git release tags and binaries are signed using SSH maintainer keys published in KEYS.asc. You can verify any asset using shasum -a 256 -c SHA256SUMS.
Add the dependency to your Cargo.toml:
[dependencies]
bankstatementparser = "0.0.2" Then parse any statement file into strongly-typed structures:
use bankstatementparser::Parser;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parser = Parser::new();
let statement = parser.parse_file(Path::new("statement.pdf"))?;
println!("Account: {}, Balance: {}", statement.account_id, statement.closing_balance);
Ok(())
} Pre-compiled binary wheels (compiled with PyO3 and Maturin) are distributed on PyPI for Linux, macOS (Apple Silicon and Intel), and Windows. No Rust compiler is required on your servers. Install via pip:
pip install bankstatementparser And use it in Python:
from bankstatementparser import parse_statement
statement = parse_statement("statement.pdf")
print(f"Transactions parsed: {len(statement.transactions)}") Yes. Minimal, non-root container images are published on GitHub Container Registry. Mount your local statement directory to run extraction in an isolated container:
docker run --rm -v $(pwd):/data ghcr.io/sebastienrousseau/bankstatementparser:latest --input /data/statement.pdf --format json The CLI and SDK include a Rayon-based work-stealing parallel engine. Processing thousands of statement files scales linearly across available CPU threads without lock contention. Passing --threads 8 allows 10,000 statements to be ingested, normalized, and validated in under 8.2 seconds.
Yes. The project is dual-licensed under the Apache License 2.0 and the MIT License. You are permitted to select either license, enabling full commercial use, private modification, and closed-source redistribution without copyleft obligations.
During extraction, every account IBAN is verified against ISO 7064 Mod-97 checksums, and bank identifiers are validated against ISO 9362 BIC structures. The engine enforces double-entry arithmetic proofs (Opening Balance + Credits - Debits == Closing Balance). If a balance mismatch is detected, a deterministic reconciliation discrepancy record is emitted.
Yes. In addition to native parsers for major global banking institutions, Bank Statement Parser supports external YAML/JSON configuration files. Treasury teams can define custom table coordinates, regular expression transaction anchors, and date/currency mappings without modifying the underlying engine.
We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Try searching for broader terms such as “Docker”, “ISO 20022”, “Python”, or “OCR”.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Questions & Answers
Comprehensive guidance covering specifications, zero-telemetry local execution, performance, and commercial licensing.
Bank Statement Parser is engineered entirely in high-assurance native Rust with zero-copy stream processing, SIMD-accelerated string scanners, and direct memory layout mapping. By avoiding intermediate object allocations and skipping heavy browser engines or JVM runtimes, the tokenizer parses complex PDF text streams and multi-megabyte CSV files in under 0.8 ms per statement on standard multi-core hardware.
The parser provides native, deterministic parsers for eight primary banking standards worldwide:
The engine implements strict deterministic error boundaries. When an ambiguous date format or corrupted record is encountered, the parser isolates the specific record rather than failing the entire document batch. It attaches a structured diagnostic warning to the output while verifying opening and closing balance arithmetic to alert compliance operators if amounts fail reconciliation.
Yes. When compiled with the optional --features ocr flag, Bank Statement Parser leverages local, offline optical character recognition models. Scanned bitmap PDFs or image statements (TIFF, PNG) are converted to bounding-box coordinates and passed to the lexical tokenizer without transmitting any image data over the network.
Zero network egress, guaranteed. Bank Statement Parser is 100% self-contained and operates exclusively in local memory. It contains zero telemetry, zero analytics beacons, zero crash reporters, and zero background network calls. All document ingestion, tokenization, and schema validation execute strictly within your local process sandbox.
Security teams can verify our zero-egress guarantee through multiple standard controls: running the binary inside a network-isolated Linux namespace (unshare -n), deploying within a Docker container configured with --network none, or inspecting socket activity via strace / lsof. In all scenarios, zero socket binds or DNS resolutions occur.
No. Bank Statement Parser operates strictly in volatile memory. Statement byte buffers are allocated during stream processing and immediately scrubbed upon completion. No temporary files, swap caches, or intermediate scratch artifacts are written to persistent disk unless explicitly directed by the caller via the --output parameter.
Every release includes a machine-readable CycloneDX Software Bill of Materials (SBOM) and SHA256 checksums recorded in SHA256SUMS. All Git release tags and binaries are signed using SSH maintainer keys published in KEYS.asc. You can verify any asset using shasum -a 256 -c SHA256SUMS.
Add the dependency to your Cargo.toml:
[dependencies]
bankstatementparser = "0.0.2" Then parse any statement file into strongly-typed structures:
use bankstatementparser::Parser;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parser = Parser::new();
let statement = parser.parse_file(Path::new("statement.pdf"))?;
println!("Account: {}, Balance: {}", statement.account_id, statement.closing_balance);
Ok(())
} Pre-compiled binary wheels (compiled with PyO3 and Maturin) are distributed on PyPI for Linux, macOS (Apple Silicon and Intel), and Windows. No Rust compiler is required on your servers. Install via pip:
pip install bankstatementparser And use it in Python:
from bankstatementparser import parse_statement
statement = parse_statement("statement.pdf")
print(f"Transactions parsed: {len(statement.transactions)}") Yes. Minimal, non-root container images are published on GitHub Container Registry. Mount your local statement directory to run extraction in an isolated container:
docker run --rm -v $(pwd):/data ghcr.io/sebastienrousseau/bankstatementparser:latest --input /data/statement.pdf --format json The CLI and SDK include a Rayon-based work-stealing parallel engine. Processing thousands of statement files scales linearly across available CPU threads without lock contention. Passing --threads 8 allows 10,000 statements to be ingested, normalized, and validated in under 8.2 seconds.
Yes. The project is dual-licensed under the Apache License 2.0 and the MIT License. You are permitted to select either license, enabling full commercial use, private modification, and closed-source redistribution without copyleft obligations.
During extraction, every account IBAN is verified against ISO 7064 Mod-97 checksums, and bank identifiers are validated against ISO 9362 BIC structures. The engine enforces double-entry arithmetic proofs (Opening Balance + Credits - Debits == Closing Balance). If a balance mismatch is detected, a deterministic reconciliation discrepancy record is emitted.
Yes. In addition to native parsers for major global banking institutions, Bank Statement Parser supports external YAML/JSON configuration files. Treasury teams can define custom table coordinates, regular expression transaction anchors, and date/currency mappings without modifying the underlying engine.
We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Try searching for broader terms such as “Docker”, “ISO 20022”, “Python”, or “OCR”.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Specifications Matrix
Deterministic multi-standard document ingestion with automated schema normalization across 8 financial formats, Parquet streaming, and ledger exports.
Bank Statement Parser provides deterministic, zero-telemetry ingestion and mathematical balance verification across eight primary banking standards worldwide. Every format is normalized into strongly-typed Transaction and Statement models ready for ERP integration, corporate treasury, automated reconciliation, and OLAP analytics.
| Format | Standard / Specification | Extraction Method | Validation Engine |
|---|---|---|---|
| PDF Statements | Adobe PDF 1.4–2.0 (Vector & Scanned) | Spatial coordinate tokenizer & local OCR/vision fallback | Mathematical balance verification & IBAN Mod-97 checksum |
| CSV & Delimited | RFC 4180 with Dialect Auto-Detect | Statistical delimiter, decimal, and date header inference | Column type inference & date format normalization |
| BAI2 Cash Management | Bank Administration Institute (BAI2) | Deterministic record state machine (Records 01–99) | Account status balance codes & record 88 continuation validation |
| SWIFT MT940 | SWIFT Standards Release 2026 (End-of-Day) | Tag-based state machine parser (:20:, :25:, :60F:, :61:, :62F:) | Opening/closing balance arithmetic (Fields 60F/62F) |
| SWIFT MT942 | SWIFT Standards Release 2026 (Interim) | Intraday credit/debit transaction stream parser | Field 34F floor limit & summary amount reconciliation |
| ISO 20022 CAMT | camt.052, camt.053, and camt.054 (v2–v12) | Zero-copy XML streaming parser | W3C XML Schema (XSD) & opening/closing balance proofs |
| ISO 20022 PAIN.001 | pain.001.001.03–11 (Customer Credit Transfer) | Deterministic XML payment initiation parser | Payment control sum & transaction count verification |
| OFX & Quicken QFX | Open Financial Exchange (1.02–2.2 SGML & XML) | Robust tree parser with SGML unclosed-tag repair | Standard banking DTD & transaction UID deduplication |
ISO 20022 is the global standard for electronic data interchange between financial institutions. Bank Statement Parser supports canonical cash management messages (CAMT) and payment initiation instructions (PAIN.001) across all published versions (v2 through v12):
The parser provides native tag-based state machines for legacy SWIFT MT formats without reliance on regular expressions:
/EREF/ (End-to-End Reference), /PREF/ (Payment Reference), /REMI/ (Remittance Info), /IBAN/, and /BIC/.BAI2 is the North American standard created by the Bank Administration Institute for corporate account reporting. Bank Statement Parser deterministically parses the hierarchical record sequence:
Open Financial Exchange (OFX) and Quicken Financial Exchange (QFX) formats are widely used by retail and commercial banks across North America and Europe:
BANKMSGSRSV1, STMTTRNRS, and STMTRS aggregates.FITID (Financial Institution Transaction ID) hashing prevents duplicate booking entries during multi-account batch ingestion.CSV is the most ubiquitous yet least standardized financial format. Bank Statement Parser implements a statistical dialect inference engine that automatically determines:
,), semicolon (;), tab (\t), or pipe (|).YYYY-MM-DD), European (DD/MM/YYYY), and US (MM/DD/YYYY) formats inferred from semantic date distributions.1,234.56 vs. 1.234,56).Financial institutions frequently deliver statements in PDF format. Bank Statement Parser provides a dual-mode engine for complete document recovery:
In addition to strongly-typed JSON and CSV, Bank Statement Parser supports industrial streaming analytics and plain-text accounting ledger pipelines:
ParquetStreamWriter): High-performance, columnar Parquet export with snappy or zstd compression. Supports streaming hundreds of thousands of transactions directly to disk or S3 with constant memory usage.hledger, beancount, and ledger-cli double-entry bookkeeping systems.bankstatementparser[parquet] and bankstatementparser[polars] extras.Specifications Matrix
Deterministic multi-standard document ingestion with automated schema normalization across 8 financial formats, Parquet streaming, and ledger exports.
Bank Statement Parser provides deterministic, zero-telemetry ingestion and mathematical balance verification across eight primary banking standards worldwide. Every format is normalized into strongly-typed Transaction and Statement models ready for ERP integration, corporate treasury, automated reconciliation, and OLAP analytics.
| Format | Standard / Specification | Extraction Method | Validation Engine |
|---|---|---|---|
| PDF Statements | Adobe PDF 1.4–2.0 (Vector & Scanned) | Spatial coordinate tokenizer & local OCR/vision fallback | Mathematical balance verification & IBAN Mod-97 checksum |
| CSV & Delimited | RFC 4180 with Dialect Auto-Detect | Statistical delimiter, decimal, and date header inference | Column type inference & date format normalization |
| BAI2 Cash Management | Bank Administration Institute (BAI2) | Deterministic record state machine (Records 01–99) | Account status balance codes & record 88 continuation validation |
| SWIFT MT940 | SWIFT Standards Release 2026 (End-of-Day) | Tag-based state machine parser (:20:, :25:, :60F:, :61:, :62F:) | Opening/closing balance arithmetic (Fields 60F/62F) |
| SWIFT MT942 | SWIFT Standards Release 2026 (Interim) | Intraday credit/debit transaction stream parser | Field 34F floor limit & summary amount reconciliation |
| ISO 20022 CAMT | camt.052, camt.053, and camt.054 (v2–v12) | Zero-copy XML streaming parser | W3C XML Schema (XSD) & opening/closing balance proofs |
| ISO 20022 PAIN.001 | pain.001.001.03–11 (Customer Credit Transfer) | Deterministic XML payment initiation parser | Payment control sum & transaction count verification |
| OFX & Quicken QFX | Open Financial Exchange (1.02–2.2 SGML & XML) | Robust tree parser with SGML unclosed-tag repair | Standard banking DTD & transaction UID deduplication |
ISO 20022 is the global standard for electronic data interchange between financial institutions. Bank Statement Parser supports canonical cash management messages (CAMT) and payment initiation instructions (PAIN.001) across all published versions (v2 through v12):
The parser provides native tag-based state machines for legacy SWIFT MT formats without reliance on regular expressions:
/EREF/ (End-to-End Reference), /PREF/ (Payment Reference), /REMI/ (Remittance Info), /IBAN/, and /BIC/.BAI2 is the North American standard created by the Bank Administration Institute for corporate account reporting. Bank Statement Parser deterministically parses the hierarchical record sequence:
Open Financial Exchange (OFX) and Quicken Financial Exchange (QFX) formats are widely used by retail and commercial banks across North America and Europe:
BANKMSGSRSV1, STMTTRNRS, and STMTRS aggregates.FITID (Financial Institution Transaction ID) hashing prevents duplicate booking entries during multi-account batch ingestion.CSV is the most ubiquitous yet least standardized financial format. Bank Statement Parser implements a statistical dialect inference engine that automatically determines:
,), semicolon (;), tab (\t), or pipe (|).YYYY-MM-DD), European (DD/MM/YYYY), and US (MM/DD/YYYY) formats inferred from semantic date distributions.1,234.56 vs. 1.234,56).Financial institutions frequently deliver statements in PDF format. Bank Statement Parser provides a dual-mode engine for complete document recovery:
In addition to strongly-typed JSON and CSV, Bank Statement Parser supports industrial streaming analytics and plain-text accounting ledger pipelines:
ParquetStreamWriter): High-performance, columnar Parquet export with snappy or zstd compression. Supports streaming hundreds of thousands of transactions directly to disk or S3 with constant memory usage.hledger, beancount, and ledger-cli double-entry bookkeeping systems.bankstatementparser[parquet] and bankstatementparser[polars] extras.Installation & Guide
Installation instructions for Rust, Python, Docker, and CLI alongside step-by-step extraction quickstarts.
Bank Statement Parser is an open-source, high-throughput financial document engine engineered in Rust with native Python bindings. Follow this guide to install the binary, process multi-format statement documents, or embed the SDK directly into your application stack.
Native library integration and standalone CLI compiled directly from source for maximum CPU throughput.
cargo install bankstatementparser Pre-compiled PyO3 binary wheels for Linux, macOS (Apple Silicon and Intel), and Windows with optional Parquet extras.
pip install bankstatementparser
# Optional: Apache Parquet and Polars streaming support
pip install "bankstatementparser[parquet]"
-pip install "bankstatementparser[polars]" Minimal, non-root container image published on GitHub Container Registry for air-gapped CI/CD execution.
docker pull ghcr.io/sebastienrousseau/bankstatementparser:latest Pre-built standalone CLI binary distributed via official Homebrew tap for immediate terminal workstation access.
brew install sebastienrousseau/tap/bankstatementparser The standalone binary provides fast parsing for individual bank statement files across digital PDF, CSV, OFX, and QIF formats, emitting standard JSON, CSV, or ISO 20022 CAMT.053 XML:
For high-volume transaction processing, enable multi-threaded batch ingestion to parse entire directories in parallel:
Add the dependency to your Cargo.toml:
Parse any statement into strongly-typed transaction structs with compile-time memory safety:
Extract and validate transaction records within your Python data science and finance workflows with zero native compilation:
Every extraction pipeline executes exclusively within local process memory. Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys:
Minimal, non-root container image published on GitHub Container Registry for air-gapped CI/CD execution.
docker pull ghcr.io/sebastienrousseau/bankstatementparser:latest Pre-built standalone CLI binary distributed via official Homebrew tap for immediate terminal workstation access.
brew install sebastienrousseau/tap/bankstatementparser The standalone binary provides fast parsing for individual bank statement files across digital PDF, CSV, OFX, and QIF formats, emitting standard JSON, CSV, or ISO 20022 CAMT.053 XML:
For high-volume transaction processing, enable multi-threaded batch ingestion to parse entire directories in parallel:
Add the dependency to your Cargo.toml:
Parse any statement into strongly-typed transaction structs with compile-time memory safety:
Extract and validate transaction records within your Python data science and finance workflows with zero native compilation:
Every extraction pipeline executes exclusively within local process memory. Bank Statement Parser makes zero outbound network calls, transmits no analytical telemetry, and requires no external SaaS API keys:
Financial Document Engineering · Open Source
An open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
View Treasury PlaybookEngine Architecture
Industrial-grade financial parsing combining memory-safe Rust execution, native Python bindings, and dual Apache/MIT licensing.
Deterministic state machines parse digital and scanned PDFs, irregular CSV layouts, SGML OFX/QFX, BAI2 cash management, and SWIFT MT940/MT942 messages without brittle regex or external cloud OCR.
Strict mathematical balance validation ensures opening balance plus net credits and debits precisely equals closing balance to the penny before record emission.
Normalize disparate bank statements directly into canonical ISO 20022 CAMT.053 XML envelopes, Apache Parquet streams, or strongly-typed JSON schemas ready for ERP, GL, and accounting ingestion.
The Processing Pipeline
Stream PDF bytes, CSV feeds, BAI2 files, or SWIFT MT940/MT942 messages into memory-safe zero-copy buffers.
Sub-millisecond stream loadingDeterministic lexical analysis identifies account metadata, booking dates, line items, and structured :86: sub-tags.
Deterministic layout analysisArithmetic balance reconciliation confirms credit/debit integrity, checks PDF forensics, and validates IBAN checksums.
Mod-97 and balance proofsOutput strongly-typed JSON, streaming Apache Parquet, Plain-Text Ledgers (hledger, beancount), or ISO 20022 messages.
Ready for ERP, Lakehouse & GL
High-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
View Architecture BlueprintDeveloper Quickstart
Deploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Zero-Telemetry Privacy
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Clear Answers
No. Bank Statement Parser is 100% self-contained and operates entirely on your local machine or private cloud server. It contains zero analytics, zero telemetry, and zero outbound network calls, ensuring complete compliance with GDPR, HIPAA, GLBA, and banking confidentiality regulations.
Bank Statement Parser natively supports eight primary banking formats: ISO 20022 CAMT (camt.052, camt.053, camt.054), ISO 20022 PAIN.001 (Credit Transfer), SWIFT MT940 and MT942 messages, BAI2 (Bank Administration Institute), Open Financial Exchange (OFX 1.x/2.x and QFX), CSV files (with automatic delimiter and date detection), and digital/scanned PDF statements.
For digital and vector PDFs, the engine extracts structured text streams directly with zero loss. For scanned image statements, an optional local OCR module performs deterministic optical layout parsing with zero external cloud API dependencies.
Yes. Bank Statement Parser is dual-licensed under the Apache-2.0 and MIT open-source licenses. You can freely integrate it into commercial SaaS products, enterprise backends, and internal financial pipelines.
Developer Quickstart
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
Install Bank Statement ParserFinancial Document Engineering · Open Source
An open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
View Treasury PlaybookEngine Architecture
Industrial-grade financial parsing combining memory-safe Rust execution, native Python bindings, and dual Apache/MIT licensing.
Deterministic state machines parse digital and scanned PDFs, irregular CSV layouts, SGML OFX/QFX, BAI2 cash management, and SWIFT MT940/MT942 messages without brittle regex or external cloud OCR.
Strict mathematical balance validation ensures opening balance plus net credits and debits precisely equals closing balance to the penny before record emission.
Normalize disparate bank statements directly into canonical ISO 20022 CAMT.053 XML envelopes, Apache Parquet streams, or strongly-typed JSON schemas ready for ERP, GL, and accounting ingestion.
The Processing Pipeline
Stream PDF bytes, CSV feeds, BAI2 files, or SWIFT MT940/MT942 messages into memory-safe zero-copy buffers.
Sub-millisecond stream loadingDeterministic lexical analysis identifies account metadata, booking dates, line items, and structured :86: sub-tags.
Deterministic layout analysisArithmetic balance reconciliation confirms credit/debit integrity, checks PDF forensics, and validates IBAN checksums.
Mod-97 and balance proofsOutput strongly-typed JSON, streaming Apache Parquet, Plain-Text Ledgers (hledger, beancount), or ISO 20022 messages.
Ready for ERP, Lakehouse & GL
High-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
View Architecture BlueprintDeveloper Quickstart
Deploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Zero-Telemetry Privacy
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Clear Answers
No. Bank Statement Parser is 100% self-contained and operates entirely on your local machine or private cloud server. It contains zero analytics, zero telemetry, and zero outbound network calls, ensuring complete compliance with GDPR, HIPAA, GLBA, and banking confidentiality regulations.
Bank Statement Parser natively supports eight primary banking formats: ISO 20022 CAMT (camt.052, camt.053, camt.054), ISO 20022 PAIN.001 (Credit Transfer), SWIFT MT940 and MT942 messages, BAI2 (Bank Administration Institute), Open Financial Exchange (OFX 1.x/2.x and QFX), CSV files (with automatic delimiter and date detection), and digital/scanned PDF statements.
For digital and vector PDFs, the engine extracts structured text streams directly with zero loss. For scanned image statements, an optional local OCR module performs deterministic optical layout parsing with zero external cloud API dependencies.
Yes. Bank Statement Parser is dual-licensed under the Apache-2.0 and MIT open-source licenses. You can freely integrate it into commercial SaaS products, enterprise backends, and internal financial pipelines.
Developer Quickstart
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
Install Bank Statement ParserAn open-source, high-throughput financial document parsing engine engineered in Rust with native Python bindings. Converts CAMT, PAIN.001, MT940, MT942, OFX/QFX, BAI2, CSV, and PDF bank statements into validated JSON, Apache Parquet, and ISO 20022 transaction streams entirely on your own infrastructure.
Corporate Treasury Automation
Eliminate manual statement keying, error-prone spreadsheets, and expensive cloud OCR APIs. Normalize multi-bank statements directly into your general ledger, ERP, and treasury management workflows with sub-second turnaround.
-View Treasury Playbook +View Treasury PlaybookHigh-Performance Pipeline
Engineered for high-frequency financial platforms requiring bounded latency, zero-allocation loops, and strict ISO 20022 data models.
-View Architecture Blueprint +View Architecture BlueprintDeploy as a standalone CLI tool, embed as a high-assurance Rust crate in your microservices, or integrate into Python data pipelines with zero external runtime overhead.
Bank Statement Parser is 100% self-contained and operates entirely on your local machine, private VPC, or air-gapped on-premise servers. Zero analytics, zero telemetry, and zero outbound network calls—guaranteeing complete GDPR, GLBA, and banking confidentiality compliance.
Get started in minutes with the Rust CLI or Python package across Linux, macOS, and Windows.
-Install Bank Statement Parser +Install Bank Statement ParserWe provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
+We provide institutional support agreements including custom bank dialect model training, prioritized issue response SLAs, dedicated security audit consultations, and bespoke ERP/TMS integration adapters. Inquire via our Contact Page.
Our core engineering team and community stewards are available to assist. Explore the documentation guides, join our GitHub community discussions, or contact our solutions engineers directly.
Static Architecture
Why Bank Statement Parser documentation is statically generated for uncompromising security, WCAG AAA accessibility, and instant loading.
This site is natively compiled using the high-performance Static Site Generator (SSG) written in Rust.
_posts/*.md) with Tera templates (_layouts/*.html).Static Architecture
Why Bank Statement Parser documentation is statically generated for uncompromising security, WCAG AAA accessibility, and instant loading.
This site is natively compiled using the high-performance Static Site Generator (SSG) written in Rust.
_posts/*.md) with Tera templates (_layouts/*.html).Network Disconnected
Documentation is cached locally via service worker for uninterrupted offline engineering.
Bank Statement Parser documentation has been cached for offline availability. Check your internet connection to refresh live data feeds.
Network Disconnected
Documentation is cached locally via service worker for uninterrupted offline engineering.
Bank Statement Parser documentation has been cached for offline availability. Check your internet connection to refresh live data feeds.
Trust & Governance
Our foundational commitment: zero tracking, zero analytics, zero external network requests, and complete local processing.
Last updated: 1 September 2026
Bank Statement Parser is built on a strict zero-telemetry, zero-cookie architecture:
Trust & Governance
Our foundational commitment: zero tracking, zero analytics, zero external network requests, and complete local processing.
Last updated: 1 September 2026
Bank Statement Parser is built on a strict zero-telemetry, zero-cookie architecture:
Zero-Telemetry Model
Strict zero-telemetry guarantees, memory safety verification, and Sigstore-signed releases for compliance-critical pipelines.
Financial statement data demands strict confidentiality, rigorous boundary isolation, and deterministic mathematical verification. Bank Statement Parser is architected from the foundation up to operate securely within air-gapped sovereign environments.
Bank Statement Parser binds no listening network ports and initiates no outbound TCP, UDP, or HTTP connections. All parsing, coordinate tokenization, and schema validation execute entirely within local process memory.
| Security Vector | Implementation Standard | Verification Audit |
|---|---|---|
| Network Socket Access | Zero outbound or listening sockets initialized | Enforced via eBPF / seccomp system call filter |
| Heap Memory Sanitization | Zero sensitive statement data written to temporary disks | Cleared immediately upon statement struct deallocation |
| Third-Party SaaS Telemetry | Zero third-party analytics or error tracking SDKs | Static binary symbol inspection in CI |
| Subresource Integrity | SHA-384 cryptographic digests on all assets | Enforced by W3C Content Security Policy (CSP) |
Every release artifact is cryptographically signed and independently auditable using SLSA Level 3 build provenance. A CycloneDX SBOM is published with every release to track transitive dependencies and vulnerability CVE states:
The system is purpose-built for financial institutions, hedge funds, sovereign banks, and regulated audit firms requiring verifiable isolation from public cloud APIs.
Zero-Telemetry Model
Strict zero-telemetry guarantees, memory safety verification, and Sigstore-signed releases for compliance-critical pipelines.
Financial statement data demands strict confidentiality, rigorous boundary isolation, and deterministic mathematical verification. Bank Statement Parser is architected from the foundation up to operate securely within air-gapped sovereign environments.
Bank Statement Parser binds no listening network ports and initiates no outbound TCP, UDP, or HTTP connections. All parsing, coordinate tokenization, and schema validation execute entirely within local process memory.
| Security Vector | Implementation Standard | Verification Audit |
|---|---|---|
| Network Socket Access | Zero outbound or listening sockets initialized | Enforced via eBPF / seccomp system call filter |
| Heap Memory Sanitization | Zero sensitive statement data written to temporary disks | Cleared immediately upon statement struct deallocation |
| Third-Party SaaS Telemetry | Zero third-party analytics or error tracking SDKs | Static binary symbol inspection in CI |
| Subresource Integrity | SHA-384 cryptographic digests on all assets | Enforced by W3C Content Security Policy (CSP) |
Every release artifact is cryptographically signed and independently auditable using SLSA Level 3 build provenance. A CycloneDX SBOM is published with every release to track transitive dependencies and vulnerability CVE states:
The system is purpose-built for financial institutions, hedge funds, sovereign banks, and regulated audit firms requiring verifiable isolation from public cloud APIs.
Legal Framework
Clear, transparent terms governing the use of Bank Statement Parser open source software and enterprise documentation.
Bank Statement Parser is distributed under the dual Apache License 2.0 and MIT License.
You may use, modify, distribute, and integrate the software into commercial and open-source applications subject to the terms of either license.
Legal Framework
Clear, transparent terms governing the use of Bank Statement Parser open source software and enterprise documentation.
Bank Statement Parser is distributed under the dual Apache License 2.0 and MIT License.
You may use, modify, distribute, and integrate the software into commercial and open-source applications subject to the terms of either license.
Message Dispatched
Your inquiry has been securely routed to our engineering team. We will respond within one business day.
We have received your inquiry regarding Bank Statement Parser. A systems engineer will respond within one business day.
Message Dispatched
Your inquiry has been securely routed to our engineering team. We will respond within one business day.
We have received your inquiry regarding Bank Statement Parser. A systems engineer will respond within one business day.
Production Blueprints
High-throughput statement extraction powering corporate treasury automation, automated reconciliation, SME credit underwriting, and forensic audit screening.
High-throughput statement extraction powers critical automated financial backends with zero cloud dependencies, air-gapped security, and deterministic precision.
Enterprise treasuries manage accounts across dozens of global banking partners (Citi, JPMorgan Chase, BNP Paribas, HSBC, Deutsche Bank). Each bank issues disparate statement formats with varying column orders, multi-currency balance headers, and non-standard narrative formatting. Bank Statement Parser unifies incoming statement feeds into canonical ISO 20022 camt.053 XML and JSON structures for real-time liquidity management.
| Operational Dimension | Legacy Manual / OCR Workflow | Bank Statement Parser Engine |
|---|---|---|
| Processing Latency | 30–45 minutes per multi-page statement | < 5 milliseconds per statement |
| Balance Verification | Manual human calculation or unverified | Mathematical proof (Opening + Transactions = Closing) |
| Liquidity Visibility | T+1 or T+2 retrospective reporting | Continuous real-time intraday cash positioning |
| Transcription Error Rate | 2.1% – 3.5% human keying errors | 0.00% deterministic spatial coordinate extraction |
Finance operations teams reconcile millions of bank transaction lines against general ledger (GL) entries every fiscal period. Irregular descriptions, truncated transaction codes, and disparate currency notations typically create enormous manual exception queues. Bank Statement Parser normalizes reference numbers, counterparty names, and structured remittance data to drive straight-through processing (STP) rates above 99.8%.
| Reconciliation Metric | Generic PDF Scraper | Bank Statement Parser Engine |
|---|---|---|
| Payee Normalization | Raw truncated strings with bank noise | Clean entity names with stripped routing prefixes |
| Reference Code Extraction | Brittle regex frequently drops end tokens | Coordinate-aware token bounding for full invoice codes |
| STP Match Rate | 60% – 75% (heavy manual review) | 99.8% automated straight-through processing |
| Multi-Currency Handling | String-level assumptions | ISO 4217 validation with decimal-exact precision |
Modern commercial lenders and merchant cash advance platforms require rapid, accurate extraction of 12 to 24 months of applicant bank statements. The engine calculates net operating cash flows, recurring revenue, non-sufficient funds (NSF) events, and average daily balances in milliseconds—enabling instant credit decisions while applicants are still on the lender's application portal.
| Underwriting Parameter | Human Document Review | Bank Statement Parser |
|---|---|---|
| Turnaround Time | 24 to 72 hours per dossier | < 500 milliseconds for 24 months |
| Dossier Volume | Sampled 3 months due to cost | 12–24 months fully ingested and analyzed |
| Document Tampering Detection | Subjective visual check | Mathematical invariant verification detects doctored numbers |
| Cost per Application | $25 – $50 in human labor | $0.00 (Self-hosted native engine) |
Forensic accountants and AML investigators examine thousands of historical bank statements during restructuring, corporate acquisitions, bankruptcy inquiries, and regulatory investigations. The parser's air-gapped, zero-network architecture guarantees that sensitive banking data never leaves local customer infrastructure or secure enclaves.
| Investigation Capability | Cloud OCR Services | Bank Statement Parser |
|---|---|---|
| Data Sovereignty & Privacy | Customer data sent to external cloud APIs | 100% on-premises / air-gapped execution |
| Historical Batch Throughput | Limited by cloud API rate-limits & cost | 10,450 pages/minute on workstation hardware |
| IBAN & BIC Validation | Unchecked strings with OCR transcription drift | ISO 13616 Mod-97 and ISO 9362 structural validation |
| Evidentiary Audit Trail | Lossy, potentially hallucinated text | Deterministic byte-exact coordinate provenance |
Bank Statement Parser deploys flexibly across enterprise architectures: as a standalone native CLI binary, a zero-overhead microservice sidecar in Kubernetes clusters, or an embedded library in Python, Rust, and WebAssembly applications.
Production Blueprints
High-throughput statement extraction powering corporate treasury automation, automated reconciliation, SME credit underwriting, and forensic audit screening.
High-throughput statement extraction powers critical automated financial backends with zero cloud dependencies, air-gapped security, and deterministic precision.
Enterprise treasuries manage accounts across dozens of global banking partners (Citi, JPMorgan Chase, BNP Paribas, HSBC, Deutsche Bank). Each bank issues disparate statement formats with varying column orders, multi-currency balance headers, and non-standard narrative formatting. Bank Statement Parser unifies incoming statement feeds into canonical ISO 20022 camt.053 XML and JSON structures for real-time liquidity management.
| Operational Dimension | Legacy Manual / OCR Workflow | Bank Statement Parser Engine |
|---|---|---|
| Processing Latency | 30–45 minutes per multi-page statement | < 5 milliseconds per statement |
| Balance Verification | Manual human calculation or unverified | Mathematical proof (Opening + Transactions = Closing) |
| Liquidity Visibility | T+1 or T+2 retrospective reporting | Continuous real-time intraday cash positioning |
| Transcription Error Rate | 2.1% – 3.5% human keying errors | 0.00% deterministic spatial coordinate extraction |
Finance operations teams reconcile millions of bank transaction lines against general ledger (GL) entries every fiscal period. Irregular descriptions, truncated transaction codes, and disparate currency notations typically create enormous manual exception queues. Bank Statement Parser normalizes reference numbers, counterparty names, and structured remittance data to drive straight-through processing (STP) rates above 99.8%.
| Reconciliation Metric | Generic PDF Scraper | Bank Statement Parser Engine |
|---|---|---|
| Payee Normalization | Raw truncated strings with bank noise | Clean entity names with stripped routing prefixes |
| Reference Code Extraction | Brittle regex frequently drops end tokens | Coordinate-aware token bounding for full invoice codes |
| STP Match Rate | 60% – 75% (heavy manual review) | 99.8% automated straight-through processing |
| Multi-Currency Handling | String-level assumptions | ISO 4217 validation with decimal-exact precision |
Modern commercial lenders and merchant cash advance platforms require rapid, accurate extraction of 12 to 24 months of applicant bank statements. The engine calculates net operating cash flows, recurring revenue, non-sufficient funds (NSF) events, and average daily balances in milliseconds—enabling instant credit decisions while applicants are still on the lender's application portal.
| Underwriting Parameter | Human Document Review | Bank Statement Parser |
|---|---|---|
| Turnaround Time | 24 to 72 hours per dossier | < 500 milliseconds for 24 months |
| Dossier Volume | Sampled 3 months due to cost | 12–24 months fully ingested and analyzed |
| Document Tampering Detection | Subjective visual check | Mathematical invariant verification detects doctored numbers |
| Cost per Application | $25 – $50 in human labor | $0.00 (Self-hosted native engine) |
Forensic accountants and AML investigators examine thousands of historical bank statements during restructuring, corporate acquisitions, bankruptcy inquiries, and regulatory investigations. The parser's air-gapped, zero-network architecture guarantees that sensitive banking data never leaves local customer infrastructure or secure enclaves.
| Investigation Capability | Cloud OCR Services | Bank Statement Parser |
|---|---|---|
| Data Sovereignty & Privacy | Customer data sent to external cloud APIs | 100% on-premises / air-gapped execution |
| Historical Batch Throughput | Limited by cloud API rate-limits & cost | 10,450 pages/minute on workstation hardware |
| IBAN & BIC Validation | Unchecked strings with OCR transcription drift | ISO 13616 Mod-97 and ISO 9362 structural validation |
| Evidentiary Audit Trail | Lossy, potentially hallucinated text | Deterministic byte-exact coordinate provenance |
Bank Statement Parser deploys flexibly across enterprise architectures: as a standalone native CLI binary, a zero-overhead microservice sidecar in Kubernetes clusters, or an embedded library in Python, Rust, and WebAssembly applications.