Accounting as Code
A programmable double-entry accounting engine for UK limited companies and sole traders.
Double-entry enforced by PostgreSQL triggers that reject unbalanced journal entries. Invoicing, bank reconciliation, and VAT returns (Box 1–9) — all through an OpenAPI-described REST API with prefixed IDs, minor units, and scoped API keys. 198 endpoints. Zero floating point.
No third-party tracking. No cookies. Visitor analytics via self-hosted Umami.
Built with
From the creator of "C From Scratch" and the certifiable-* ecosystem .
"id": "inv_7k2m9p",
"status": "draft",
"total": 180000,
"tax": { "rate": "VAT_20", "amount": 30000 }
}
Accounting infrastructure, not another dashboard.
Core UK accounting primitives exposed via API — double-entry ledger, VAT returns, invoicing, and bank reconciliation.
REST API with Prefixed IDs
Every feature available through a typed REST API. Prefixed IDs like inv_142 and cont_8x so you always know what you're looking at. 198 endpoints across 31 resources.
GET /v1/invoices/inv_142Scoped API Keys
Create keys with fine-grained permissions. A reporting key that reads invoices shouldn't delete contacts. 17 resource:action scopes.
"scopes": ["invoices:read"]Immutable Ledger
Debits equal credits. Always. A PostgreSQL trigger rejects unbalanced entries. You cannot bypass it — not through the API, not through a bug.
RAISE EXCEPTION: debits ≠ creditsDeveloper Shell
A terminal built into every page of the app. 198 endpoints with tab autocomplete, clickable entity IDs, route filtering. Toggle with Ctrl+J.
routes invoice → 14 matchesAuto-Categorisation
A lattice-scored inference engine that evaluates every rule, ranks by specificity, and explains its decisions. No shadowing. Every classification stores rule ID, specificity score, and matched fields.
"reason": "Most specific match"Row-Level Security
Tenant isolation enforced at the PostgreSQL level across 25+ tables. Even a buggy query cannot return another tenant's data.
SET app.current_org_id = $1Migration Wizard
Switch from Xero, FreeAgent, or QuickBooks. Self-service with trial balance equality and closing balance verification before activation. Your ledger must match to the penny before go-live.
POST /v1/migrations/:id/executeUniversal Bank Import
Upload any bank's CSV and the ingestion engine infers the schema. Column detection, balance proof, row conservation. Smart Map overrides for edge cases.
POST /v1/bank-imports/uploadFinancial Reports
P&L, Balance Sheet, Trial Balance, VAT Return, Aged Debtors, Aged Creditors. All available via API and CSV export with date range filtering.
GET /v1/reports/profit-loss£15/mo sole trader. £25/mo limited company.
No per-invoice fees. No per-user pricing. One price per entity, with full API access included.
Free trial. Card required to start.
For UK limited companies with directors, dividends, and statutory reporting.
Limited Company
Most commonCancel anytime
Database-enforced double-entry (PostgreSQL trigger)
Invoices, quotes & PDF generation
Auto-categorisation with evidence trail
Full REST API & Developer Shell
Scoped API keys, webhooks & metadata
VAT returns (Box 1–9, MTD-compatible export) †
Universal bank import (any CSV)
Migration wizard (Xero, FreeAgent, QBO)
Dividend wizard & PDF vouchers †
Director Loan Accounts — 7 loan types, automatic double-entry †
S455 exposure with connected persons aggregation (CT600) †
BiK at HMRC official rate with average balance calculation †
DLA year-end snapshots with S455 deadline tracking †
Board minutes & year-end snapshots
† SpeyBooks provides tools to record and organise financial data. It does not provide tax, accounting, or legal advice. Features relating to VAT, MTD, S455, BIK, and dividends are calculation aids only. Consult a qualified accountant for compliance requirements.
30-day free trial · Card required to start
Switch between Sole Trader and Limited Company without data migration.
Not ready to switch?
Read the Documentation first