Read your data and your rules.
Bank CSV in. Plain-text rules in. Human-readable and Git-friendly — your finance team can read them, own them, version them. Locale-aware: US, UK, EU, Commonwealth.
Plain-text .fin rules. Same input, same output, every time. Every match names the rule that produced it and the audit reason behind it — from a hundred-row spreadsheet to a 20-million-row integrity check.
pip install finlangThe four moves a FinLang run makes — the same loop the docs describe, the same loop a regulated workflow expects.
Bank CSV in. Plain-text rules in. Human-readable and Git-friendly — your finance team can read them, own them, version them. Locale-aware: US, UK, EU, Commonwealth.
Rules apply top-to-bottom. Last matching rule sets the category; flags accumulate as the engine moves through the row. No ML, no randomness, no network calls.
Every decision logged with the rule that fired and the matched condition. SHA-256 fingerprints over the immutable fields before and after the engine, compared field-by-field.
Run FinLang against the same raw data your ML system processes. Every disagreement is flagged with the FinLang rule that fired. Your ML pipeline keeps running as-is.
The supporting record — what shipped, what's been verified, what the engine can produce in front of a regulator or model-risk reviewer.
Verify shows the engine didn't corrupt the data. Reconcile gives the categorisation an independent challenge. Audit names the rule behind every decision. The three feed the same evidence chain a regulated workflow expects.
Point it at your CSV. Build rules in plain English and see the engine read them back. Tick what you want checked (verify, or reconcile against a model's output), and every match names the rule that decided it. It runs on your machine, served from 127.0.0.1; nothing leaves it. Every run also shows the equivalent command, so anything you click, you can script.

$ pip install finlang $ finlang-ui → serving http://127.0.0.1:8484/ui/
No second engine. No drift. Same deterministic rules, same audit trail — whichever way you reach it.
Same input, same rules, same output.
The whole loop on screen — rules, run, results — served from 127.0.0.1. Every run shows the equivalent command, so anything you click, you can script.
$ pip install finlang $ finlang-ui → opens 127.0.0.1:8484/ui/
Runs locally, no network. The original batch-processing path — hard-won enterprise-harness throughput, audit trail by default.
# 1. install from PyPI $ pip install finlang # 2. v0.7.7 benchmark, 5M × 50 $ finlang \ --input bank.csv \ --rules my_rules.fin \ --output categorised.csv \ --audit audit.json \ --audit-mode full --fastio → read 5,000,000 rows [OK] → apply rules [OK] → write categorised.csv [OK] → audit · full [OK] → time ~3m · ~28K rows/s
Same engine, called from your Python data pipeline. Subprocess-isolated and deterministic — the same execution path the HTTP wrapper uses.
import subprocess import sys subprocess.run([ sys.executable, "-m", "finlang.cli.run_finlang", "--input", "bank.csv", "--rules", "my_rules.fin", "--output", "categorised.csv", "--audit", "audit.json", "--audit-mode", "full", ], check=True)
Runs where your data lives — local machine, your VPC, or controlled internal environment. No hosted endpoint, by design.
$ pip install finlang $ finlang-api # starts on 127.0.0.1:8000 $ curl -X POST \ http://127.0.0.1:8000/process \ -F "input_csv=@bank.csv" \ -F "rules=@my_rules.fin"
Compare those labels with rules your team owns and review the differences.
counterparty ~ "*SHELL*"counterparty ~ "*CAYMAN*"FinLang explains its own output; it does not reveal a provider's hidden reasoning or, by itself, validate a lending decision.
Real output from finlang 0.9.1 on the public example files. The full reconcile report, including orphan rows, is below.
Real output from finlang --reconcile --reconcile-key --reconcile-html against an ML pipeline's output. Key alignment matches by content, not row position — so alongside disagreements it lists rows in the ML output that FinLang did not produce, and rows FinLang produced that the ML output lacks. Self-contained HTML, prints to PDF, archives cleanly.
Run your data through your current rules and a proposed change, and see exactly what moves — which transactions re-categorise, the indicative amount that shifts, and which changes are real behaviour versus a rule rename with no effect. Preview the blast radius before it ships, not after the quarter's numbers are wrong.
For finance teams operating ML-driven categorisation pipelines under regulatory scrutiny — banking, insurance, fund administration, wealth management. FinLang sits as an independent challenge layer beside your existing model, producing rule-attributed disagreement evidence that can support SR 26-2 / EU AI Act-style validation workflows.
SR 26-2 is US banking guidance from the Federal Reserve, OCC and FDIC (April 2026). It is non-binding, expected to be most relevant to banking organisations with over $30bn in total assets, and it places deterministic rule-based processes outside its definition of a model. So your ML system may be in scope; FinLang, as a rule-based engine, is the challenger beside it. It is not a UK requirement.
For ML teams that need an independent audit alongside categorisation — embed via Python or self-host the API inside your pipeline.
We're inviting a small number of organisations into an Early Access programme where teams can help shape the FinLang DSL and contribute rulepack patterns.
No IP transfer. No revenue sharing. Just early access in exchange for real-world feedback.
Apply to the programme