v0.7.9 · live on PyPI · 18 May 2026Early Access Programme · open

Deterministic alternative to probabilistic categorisation agents.

Plain-text .fin rules. Same input, same output, every time. Every row of categorised output carries the rule that produced it and the audit reason behind it.

$pip install finlang
Apply for Early Access
No network callsRule-attributed audit trailSHA-256 verify
youtube.com / FinLangHQ · Deterministic financial categorisation
2 min · v0.7.8 demo
FinLang Overview — read, categorise, audit, reconcile
Product loop · four beats

Read, categorise, audit, reconcile.

The four moves a FinLang run makes — the same loop the docs describe, the same loop a regulated workflow expects.

Beat 01 · Read

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.

rule "GROCERIES: Tesco" { match: counterparty ~ "*TESCO*" set: category = "Groceries"}
Beat 02 · Categorise

Categorise deterministically.

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.

$ finlang \ --input bank.csv \ --rules my_rules.fin \ --output out.csv
Beat 03 · Audit + verify

Audit and verify integrity.

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.

--audit audit.json --audit-mode full --verify-full --verify-output-dir verify/
Beat 04 · Reconcile

Reconcile against your ML pipeline.

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.

--reconcile ml_output.csv --reconcile-html # row-level CSV + self-contained # HTML a review can archive
Validation

Evidence, not promises.

The supporting record — what shipped, what's been verified, what the engine can produce in front of a regulator or model-risk reviewer.

Test suite
137tests
Across 10 gates — every release runs this gate.
Verified rows
20M
Verified field-by-field across three runs, zero mismatches.
Throughput · integrity harness
217Krows/s
FastIO backend, integrity harness. Standard backend ~180K rows/s.
Release pipeline
PyPI
Cleanroom validation — every release re-installs from PyPI in a fresh venv and re-runs a smoke gate.
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.
Integrate · three surfaces, one engine

Three surfaces. One engine.

No second engine. No drift. Same deterministic rules, same audit trail — whichever way you reach it. As of v0.7.9, FinLang gives you three ways to plug into your stack.

Surface 01 · CLI · batch

Categorise a CSV in one line.

Runs locally, no network. The original batch-processing path — hard-won enterprise-harness throughput, audit trail by default.

terminal · cli
# 1. install from PyPI
$ pip install finlang

# 2. categorise 5M rows × 50 cols
$ 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
Surface 02 · Python · pipeline

Drive the engine from Python workflows.

Same engine, called from your Python data pipeline. Subprocess-isolated and deterministic — same execution path as the HTTP wrapper.

python · pipeline
import subprocess

subprocess.run([
    "finlang",
    "--input", "bank.csv",
    "--rules", "my_rules.fin",
    "--output", "categorised.csv",
    "--audit", "audit.json",
    "--audit-mode", "full",
], check=True)
Surface 03 · HTTP API · service

Run the FinLang HTTP wrapper inside your own infrastructure.

Runs where your data lives — local machine, your VPC, or controlled internal environment. No hosted endpoint, by design.

http · self-host
$ pip install "finlang[api]"
$ 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"
Demo · real output

The reconcile report a review can archive.

Real output from finlang --reconcile --reconcile-html against a tampered demo dataset. Self-contained HTML, prints to PDF, archives cleanly.

reconcile_report.html · finlang 0.7.8

FinLang Reconciliation — finlang_out.csv ↔ demo_ml_tampered.csv

2026-05-11T07:34:16Z · positional alignment · field: category · finlang 0.7.8 · audit_entries_loaded=15
Status: REVIEW REQUIRED13/15 match (86.67%) · 2 mismatches · perfect_match=false
Rows compared
15
Agreed
13
Disagreed
2
Agreement
86.67%
#
Counterparty
ML says
FinLang says
Rule matched
01
SHELL TRADING INTERNATIONAL
−245,000.00 · 2026-01-15 · "Q1 Gas Supply"
Utilities
Energy & Commodities
Energy: Shell
counterparty ~ "*SHELL*"
04
CAYMAN ISLANDS TRUST
−250,000.00 · 2026-01-18 · "Investment management fee"
Treasury Operations
Compliance: Offshore Jurisdictions
Compliance: Offshore Jurisdictions
counterparty ~ "*CAYMAN*"
Verbatim output from a v0.7.8 reconcile run · 2026-05-11
For institutional buyers

An independent validation layer for ML-driven finance.

For finance teams operating ML-driven categorisation pipelines under regulatory scrutiny — banking, insurance, fund administration, wealth management. FinLang sits as an independent challenge layer alongside your existing ML investment, producing rule-attributed disagreement evidence that can support SR 11-7 / EU AI Act-style validation workflows.

For ML teams that need an independent audit alongside categorisation — embed via Python or self-host the API inside your pipeline.

  • HTML reconcile reportCompliance-context, self-contained, prints to PDF.
  • SHA-256 fingerprint verificationSnapshot-then-compare over immutable fields, with proof CSV.
  • Audit trail with rule attributionEvery output row carries the rule that produced it and the audit reason.
  • Dual licence (AGPLv3 + commercial)Team self-serve at £1,200/yr. Enterprise on request. Multi-entity scope.
  • Cleanroom-validated PyPI releaseEvery release re-installs from PyPI in a fresh venv and re-runs the smoke gate.
Early Access Programme · open

Help shape the FinLang DSL.

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.

What you get
  • 6 months free Team licence
  • Priority support
  • Direct input on the roadmap
  • Early access to commercial rulepacks
  • Optional: co-authored case study
Who it's for
  • Fintech platforms
  • Accounting & reconciliation vendors
  • Banks and compliance teams
  • Data teams building finance automation
What we ask
  • 30-minute feedback session each month
  • Real-world usage insights
  • (Optional) workflow review

No IP transfer. No revenue sharing. Just early access in exchange for real-world feedback.

Apply for Early Access