Infrastructure v5.26.0 · 198 endpoints

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.

Spotlight Feature

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 — app.speybooks.com
Ctrl+J
SpeyBooks Shell v3.0  (demo · 197 endpoints)
Type help for commands. Tab autocomplete ·  accept suggestion · click IDs to fetch.
$
Tab Autocomplete

Paths, methods, and built-in commands. Ghost text suggestions as you type.

25 Clickable ID Types

Entity IDs in responses are links. Click inv_142, dir_3, or dla_6 to fetch that resource.

Route Filtering

Type routes invoice or routes DELETE to narrow 198 endpoints by keyword or method.

Ctrl+J Anywhere

Toggle the shell from any page. Collapse the sidebar with ⌘B for full-width terminal mode.

Spotlight Feature

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.

Migration Wizard flow: select provider (FreeAgent, Xero, QuickBooks, or CSV), then a 5-phase pipeline imports contacts, opening balances, invoices, and bills before executing with enforced trial balance and reconciliation checks. A validation block shows debits equalling credits, accounts receivable fully reconciled, and footer checks for contacts, VAT scheme, and accounts payable. The completion card shows migration stats and the message: Your books are verified from day one.
Format Detection

Upload your provider export. The ingestion engine infers the schema — no format dropdowns, no guesswork.

Identity Resolution

Duplicate contacts detected and merged automatically. Conflicts surfaced for your review before committing.

Trial Balance Gate

Opening balances must balance. Debits equal credits or the import blocks. No silent imbalances on day one.

Reconciliation Proof

Receivables and payables reconciled against opening balances. Every number verified before you go live.

Spotlight Feature

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.

Auto-categorisation flow: a raw bank transaction 'TESCO STORES 4532' is normalised to 'TESCO', three rules are evaluated simultaneously, the most specific match wins (equals beats contains), and an evidence object is produced showing the matched rule, account, and reason.
Normalisation

"TESCO STORES 4532" becomes "TESCO". One rule matches all variants — no duplicates.

No Shadowing

"Amazon" won't steal matches from "Amazon Web Services". More specific rules always win.

Evidence Trail

Every decision logged with the matched rule, field, operator, and reason. Fully auditable.

Rule Generalisation

Each manual categorisation creates maximally general rules. Future imports need less manual work.

Rules API

Create, test, reorder, and delete rules via the API. Test a value against all rules with one POST.

Spotlight Feature

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.

Limited Company features: dividend declaration flow from profit check through board minutes, allocation, PDF voucher generation, to payment journal. Director Loan Account dashboard showing overdrawn balance with S455 exposure and Benefit in Kind warnings. Year-end DLA snapshots, bed-and-breakfasting detection, and per-director dividend summary with progress bars.
DLA Tracking

Full transaction history with S455 exposure calculated at 33.75%, Benefit in Kind at HMRC official rate (average method), and P11D deadline tracking.

Dividend Wizard

Retained profit check, board minutes, allocate by shareholding, PDF voucher. Dividend band breakdown shown for reference — not tax advice.

Year-End Snapshots

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.

Safety Checks

Bed-and-breakfasting detection. Connected persons aggregation for S455 across spouse, child, parent, and associate relationships. Void with automatic reversal journals.

Spotlight Feature

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 IDsinv_, 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.

$ curl -s api.speybooks.com/v1/invoices \
-H "Authorization: Bearer sk_live_..." | jq .
{
"data": [{
"id": "inv_142",
"total": 120000,
"currency": "GBP",
"status": "sent"
}],
"meta": { "total": 47, "page": 1 }
}
// Scoped API key — read-only reporting
{
"scopes": [
"invoices:read",
"reports:read"
]
}

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.

Journal entry showing balanced debits and credits with a PostgreSQL trigger that enforces sum_debits equals sum_credits.

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.

Three-layer architecture: client sends raw inputs, API computes totals as single source of truth, display layer shows exactly what the API returns.

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

SSL Labs A+ · HSTS Preloaded · Argon2id Hashing · Row-Level Security · CSRF Protection · Per-Endpoint Rate Limiting · Two Essential Cookies Only · UK Data Residency · PostgreSQL Double-Entry Triggers · Monthly Security Reports

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.