Accounting as Code infrastructure built for engineers.
Double-entry enforced by PostgreSQL triggers. Minor-unit integers throughout. Idempotent writes with 24-hour key retention. No hidden internal endpoints — the portal consumes the same API you do.
Developer Shell
A terminal built into every page of the app. All 198 API endpoints are discoverable via tab completion, ghost text, and the routes command. The demo below is live — type a command, hit Tab, or click an ID in a response.
SpeyBooks Shell v3.0 (demo · 197 endpoints) Type help for commands. Tab autocomplete · → accept suggestion · click IDs to fetch.
Paths, methods, and built-in commands. Ghost text suggestions as you type.
Entity IDs in responses are links. Click inv_142, dir_3, or dla_6 to fetch that resource.
Type routes invoice or routes DELETE to narrow 198 endpoints by keyword or method.
Toggle the shell from any page. Collapse the sidebar with ⌘B for full-width terminal mode.
Switch from Xero, FreeAgent, or QuickBooks — verified
Self-service migration with enforced trial balance and reconciliation checks. Upload your exports, we infer the format, import contacts, balances, invoices and bills, then block execution unless opening balances reconcile and the ledger balances to the penny. No migration service. No re-keying.
Upload your provider export. The ingestion engine infers the schema — no format dropdowns, no guesswork.
Duplicate contacts detected and merged automatically. Conflicts surfaced for your review before committing.
Opening balances must balance. Debits equal credits or the import blocks. No silent imbalances on day one.
Receivables and payables reconciled against opening balances. Every number verified before you go live.
Categorisation you can audit, explain, and trust
Not keyword matching. A lattice-scored inference engine that evaluates every rule, ranks them by specificity, and logs the matched rule ID, field, operator, and reason for every decision. No shadowing. No silent overrides.
"TESCO STORES 4532" becomes "TESCO". One rule matches all variants — no duplicates.
"Amazon" won't steal matches from "Amazon Web Services". More specific rules always win.
Every decision logged with the matched rule, field, operator, and reason. Fully auditable.
Each manual categorisation creates maximally general rules. Future imports need less manual work.
Create, test, reorder, and delete rules via the API. Test a value against all rules with one POST.
Ltd company director tools
Director Loan Accounts with S455 exposure calculated and surfaced for review with your accountant. Dividend declarations with board minutes and PDF vouchers. Year-end snapshots that freeze the DLA position — S455 deadline, BIK at HMRC official rate — at any date.
These features calculate statutory amounts based on current rules. SpeyBooks does not provide tax, accounting, or legal advice. Consult a qualified accountant for compliance requirements.
Full transaction history with S455 exposure calculated at 33.75%, Benefit in Kind at HMRC official rate (average method), and P11D deadline tracking.
Retained profit check, board minutes, allocate by shareholding, PDF voucher. Dividend band breakdown shown for reference — not tax advice.
Freeze DLA position at any date. S455 deadline set to 9 months + 1 day after period end. BIK and P11D amounts calculated for review with your accountant.
Bed-and-breakfasting detection. Connected persons aggregation for S455 across spouse, child, parent, and associate relationships. Void with automatic reversal journals.
API-first design
Every feature in the web portal is available through the REST API. The portal itself consumes the same endpoints you do — there are no hidden internal routes. 198 endpoints across 31 resources.
Prefixed IDs — inv_, txn_, cont_ so you always know what you're looking at.
Minor units — all monetary values in pence (integers). Matches Stripe. No floating point.
Structured errors — unknown paths return JSON with a documentation link, not a generic 404.
Idempotency keys — safe retries on POST, PUT, and PATCH. 24-hour expiry, 5xx releases the key.
Scoped API keys — 17 granular resource:action permissions. A reporting key can't delete contacts.
Database-Enforced Double-Entry
A PostgreSQL trigger rejects any transaction where debits don't equal credits. You cannot bypass it — not through the API, not through a bug.
The client never calculates
The frontend sends raw inputs. The API computes authoritative totals. UI components only display what the server returns. One source of truth.
Complete feature set
The full accounting surface area behind the highlights.
Invoicing & Quotes
Draft → sent → paid → partial → overdue lifecycle. PDF generation, email delivery, quote-to-invoice conversion, sequential numbering with configurable prefix.
Universal Bank Import
Upload any bank's CSV and the ingestion engine infers the schema automatically. Column detection, balance proof, row conservation. Smart Map overrides for edge cases. UK presets for NatWest, Starling, Monzo, and more.
Contacts
Customer and supplier management linked to invoices, quotes, and transactions. Full contact details with Stripe-style key-value metadata.
VAT Compliance
Standard, reduced, zero, and exempt rates. Flat Rate Scheme support with configurable percentages. Box 1–9 VAT return reports (MTD-compatible export).
Reports
Profit & Loss, Balance Sheet, Trial Balance, General Ledger, VAT Return, Aged Debtors, Aged Creditors, and Dashboard Summary. All exportable as CSV with date range filtering.
Tax Set-Aside
Dashboard widget displaying estimated Corporation Tax based on current 19%/25% marginal rates. Calculated for reference — not tax advice.
Opening Balances
Upload your trial balance, map accounts to the chart, and confirm. Debits must equal credits or the import blocks. Suspense account handling for unmapped items.
OmniSearch
Hit Cmd+K to search across invoices, contacts, transactions, and accounts. Fuzzy matching, keyboard navigation, and instant results from any page.
Two-Factor Auth
TOTP with QR setup, authenticator app support, CSRF protection, rate limiting per endpoint, JWT rotation.
Row-Level Security
Tenant isolation enforced at the PostgreSQL level across 25+ tables. Even a buggy query cannot return another tenant's data.
API Request Log
30-day retention with full request/response drill-down. Headers, bodies, timing, IP, and status code per request — no external tools required.
Custom Metadata
Stripe-style key-value metadata on invoices, contacts, transactions, and quotes. 50 keys per entity, merge semantics, GIN indexed.
Webhooks
Subscribe to events, manage endpoints, rotate signing secrets. Full delivery log with status codes and retry tracking.
Dark Mode
Semantic token system with CSS custom properties. 53 files migrated, ~1,594 token references, zero flash of unstyled content on page load.
Bug Transparency
In-app bug reporting with public resolution stats. Live severity breakdowns and anonymised titles at /transparency.
UK Data Residency
All data stored in London (europe-west2). No CDN. No third-party data processors. Your accounting data never leaves the UK.
Privacy-First Analytics
No Google Analytics, Meta pixels, or session recordings. A single self-hosted Umami instance for aggregate metrics — no tracking cookies, no PII, no cross-site profiling. Full policy.
Self-Hosted Fonts
Inter and JetBrains Mono served locally across all sites. Zero external font dependencies. No Google tracking on font loads.
Built for financial data
Start building in minutes
Create an account, explore the API, and run real accounting flows. The first 50 users get a 90-day free trial — card required to start, but you won't be charged during the trial.