Changelog
Every change to parsr
Format additions, validator updates, schema versions, API changes. Reverse-chronological. Subscribe via RSS at /changelog.rss (coming soon).
35 entries · 2026-03-01 → 2026-05-09
- 2026-05-09API
POST /v1/parse/bank_statement specialist endpoint
Bank statements now have a dedicated specialist route alongside the generic /v1/parse?doc_type=bank_statement (kept for backwards compatibility). Same input, same response shape, doc_type forced server-side. Architecture lays the groundwork for payslip / receipt / invoice specialists arriving once the anonymized fixture pack lands.
Details → - 2026-05-09API
POST /v1/classify document-type detection
Auto-detect bank_statement / payslip / receipt / invoice from any document. Synchronous response with confidence + alternatives + a one-sentence rationale. Useful for AI agents that receive uncategorised attachments. 30-day cache by file hash + candidate set. Accuracy benchmark scheduled with the rest of the specialist suite (2026-06-06).
Details → - 2026-05-09Format
Added Argenta (BE) bank statement support
Argenta retail and savings statements (Dutch and French variants). Closes a gap in BE coverage alongside KBC, Belfius, and BNP Paribas Fortis. Fixture set: 14 anonymized statements across personal and corporate accounts.
Details → - 2026-05-08Format
Updated Belfius parser for new transaction column layout
Belfius rolled a wider 'date of effect' column on retail accounts mid-April. Prompt few-shots and the column-extraction validator updated. Existing fixtures re-pass; three new layout fixtures added to the regression suite.
- 2026-05-07Format
Added Boursorama (FR) bank statement support
Boursorama Banque retail statements with the digital-first 'Relevé de Compte' layout. Captures structured-communication codes and the report-précédent / nouveau-solde footer.
Details → - 2026-05-05Format
Added Caisse d'Épargne (FR) bank statement support
Standard French 'Relevé de Compte' format with operation-code prefixes (VIR, PRLV, CHQ, CB, REM). Code-to-canonical-type mapping merged with the BNP Paribas / Crédit Agricole shared layer.
- 2026-05-04Schema
Schema bump: bank_statement.v1 → v2
v2 adds per-field confidence ∈ [0,1] and a normalized bbox to every extracted field, plus a top-level validation.balance_chain block. v1 is still served when a request pins schema_version=1; v1 will be deprecated 2026-08-01.
Details → - 2026-05-02Format
Added Crédit Agricole (FR) regional bank statement variants
Crédit Agricole prints under 39 regional caisses, each with its own header block and footer wording. Single shared parser with regional fixture coverage; 22 of 39 regions now have at least three fixtures each.
- 2026-04-30Format
Added DATEV (DE) payslip support
DATEV Lohnabrechnung with full German tax-class categorization (Steuerklasse I–VI), social-security split (KV/RV/AV/PV), and gross-to-net reconciliation. Validator: net-pay-match within €0.01 of declared net.
Details → - 2026-04-28Format
Added Loket (NL) payslip support
Loket.nl payroll-system payslips with Dutch loonheffing breakdown. Captures the 30%-ruling indicator separately when present.
- 2026-04-25Format
Added Triodos Bank (NL) bank statement support
Triodos NL retail and SME statements. Sparse layout, structured-reference field on every transaction. Joint accounts list both holders in the header.
- 2026-04-22API
Idempotency-Key header now supported on /v1/parse
Send an Idempotency-Key header on POST /v1/parse and a duplicate request inside the 24-hour window returns the original job. Stored against (org_id, key) — keys are scoped to your org and don't leak.
Details → - 2026-04-22Format
Added Sage Paie (FR) payslip support
Sage Paie French payroll with 'Bulletin de Salaire' format. Captures URSSAF, retraite complémentaire, and prévoyance lines as structured items rather than free-text. net-pay-match validator enforced.
- 2026-04-19Validator
Validator added: net-pay-match for payslip schema
Every payslip response now includes validation.net_pay_match { valid, computed_net, declared_net, diff }. The validator subtracts every detected deduction from gross and confirms it matches declared net within €0.01.
- 2026-04-17API
Synchronous parsing mode: ?wait=60
POST /v1/parse?wait=60 holds the connection open for up to 60 seconds and returns the completed job inline if the parse finishes inside that window. Falls back to async (202 + job_id) on timeout. Useful when you don't want to wire webhooks.
Details → - 2026-04-15Format
Added bunq (NL) bank statement support
bunq retail and Business statements. The English-by-default layout is consistent with the NL ING parser; shared validators reused. Sub-account transfers parsed as their own transaction type.
- 2026-04-14Security
Closed audit finding #15 — webhook payload trimmed
Webhook dispatcher no longer includes the full job result in the outbound payload. Receivers get { job_id, status, doc_type, region }; the result is fetched authenticated from /v1/jobs/{id}. Reduces blast radius of a leaked endpoint.
- 2026-04-12Format
Added Commerzbank (DE) bank statement support
Commerzbank retail Kontoauszug. SEPA-instant transfers carry an extra 'SEPA Inst.' marker which is now captured as transaction.method='sepa_instant'.
- 2026-04-10Model
Default vision model rotated: Claude 3.5 Sonnet → Claude Sonnet 4
Bank-statement and payslip parsers now route to Claude Sonnet 4 by default. ~12% improvement on the held-out fixture suite, ~30% reduction in p95 latency on multi-page statements. Old behaviour available via X-Model-Override.
Details → - 2026-04-09Format
Added Sparkasse Köln/Bonn (DE) regional variant
Sparkasse statements vary by regional Sparkasse. Köln/Bonn fixtures join the existing München, Berlin, and Hamburg variants under the shared Sparkasse parser.
- 2026-04-07Security
Closed audit finding #6 — webhook secrets no longer in NATS
Customer webhook signing secrets used to ride along inside the NATS payload to the dispatcher worker. Dispatcher now reads the secret from Postgres at delivery time, scoped by webhook_id. NATS payload is { job_id, webhook_id } only.
- 2026-04-04Validator
Validator added: totals-reconcile for invoice schema
Invoice responses now include validation.totals_reconcile { valid, computed_total, declared_total, diff } — confirms Σ(line_items.amount) + tax = total within the declared currency's rounding tolerance.
- 2026-04-02Format
Added LCL (FR) bank statement support
Le Crédit Lyonnais retail statements. Three-column layout (date / libellé / débit / crédit) parsed under the shared FR retail parser. Operation-code mapping reused.
- 2026-03-30API
Sandbox keys now return mock JSON without burning quota
Test-mode keys (sk_*_test_…) return realistic mock responses for every endpoint. Sandbox calls don't count toward your monthly page cap and don't bill. Useful for CI and local development.
Details → - 2026-03-27Format
Added Sparkasse München (DE) regional variant
Second Sparkasse variant after the initial München, Berlin, Hamburg drop. Header block carries an additional 'IBAN-Hinweis' line that's now stripped from the holder field.
- 2026-03-25Validator
Validator added: balance-chain for bank_statement schema
Bank-statement responses now include validation.balance_chain { valid, computed_closing, declared_closing, diff }. One field tells you whether the parse adds up; particularly useful for underwriting agents that want to escalate failed chains.
Details → - 2026-03-23Format
Added SD Worx (BE) payslip support
SD Worx is the dominant BE payroll provider. Three language variants (NL, FR, EN), structured wage-cost lines, capture of the canonical 'patronale RSZ' employer-contribution block.
- 2026-03-20Model
Added GPT-4o as a routing fallback
When the primary model (Claude Sonnet 4) returns a response that fails strict-schema validation, the parser now falls back to GPT-4o for a second attempt before returning a soft-validated result. Reduces parser-error rate on edge layouts by ~40%.
- 2026-03-17Format
Added BNP Paribas Fortis (BE) bank statement support
Belgian variant of the BNP Paribas group. Shares the FR-style operation-code prefix layout but with NL/FR bilingual headers. Joins KBC and Belfius in the BE retail-bank coverage set.
- 2026-03-14Security
Closed audit finding #3 — plan-cap is now atomic under concurrency
Plan-cap enforcement at /v1/parse moved from read-then-insert to an atomic Redis INCRBY with rollback on cap breach. Previous TOCTOU window (~100ms under load) closed; concurrent burst from a single org can no longer push past the monthly page cap.
- 2026-03-12API
HMAC-signed webhooks with replay-window protection
All webhook deliveries now carry an X-Parsr-Signature header (HMAC-SHA256 of timestamp + body, keyed on the webhook secret) and an X-Parsr-Timestamp. Reject deliveries where |now - timestamp| > 5 minutes to prevent replay.
Details → - 2026-03-09Format
Added Société Générale (FR) bank statement support
Société Générale retail Relevé de Compte. Operation-code dictionary aligned with the BNP Paribas parser; second-page continuation header handled.
- 2026-03-06Format
Added KBC (BE) bank statement support
Initial BE coverage drop. Three language variants (Dutch, French, English), monthly and quarterly statement periods, structured-communication codes captured as part of the description.
Details → - 2026-03-04Model
Default vision model: Gemini 2.0 Flash for Tier-2 formats
Receipt and small-document parsing routed to Gemini 2.0 Flash by default. Cost-per-page roughly a third of Sonnet on these layouts with comparable accuracy on the held-out fixture suite. Bank statements and payslips remain on Sonnet.
- 2026-03-01API
Region-bound API keys (sk_eu_… / sk_us_…)
Keys are now bound to a region at issue time. An sk_eu_… key against us-api.tryparsr.dev returns 403 region_mismatch. Prevents accidental cross-border traffic and makes EU residency a property of the key, not a runtime check.
Details →
Format change requests: 48 hours.
Email a sample, get a working endpoint inside two business days.