Get started
Vexless documentation
Bookkeeping as a backend. Your software sends the documents it already has and what they mean. Vexless keeps the books, numbers invoices, clears the money, sends payments, and tells you what is paid.
How Vexless works
Vexless is a headless system of record for bookkeeping, built for software companies whose customers run a business. Your customers use your software. Their books are kept in Vexless without them, or you, doing any accounting.
You send an origin: a sales invoice you issued, a bill your user wants paid, a bank transaction. With it you send an interpretation, the postings it makes. Vexless enforces the ledger rules, numbers invoices, keeps the audit chain, clears open items against each other, sends payments, and reports back through statuses and webhooks.
If you do not send postings, the origin waits at RECEIVED until someone does: an accountant in a separate Vexless control surface, an agent, or your own software later. You do not build for that path unless you want it. What it produces reaches you as the same statuses and events.
Vexless does not guess. It does not decide which account a line hits, infer a VAT rate, or work out which invoice a payment clears. Every posting and every allocation is stated by an author the ledger records. Deriving them is deferred until it can be designed deliberately.
Build with Vexless
Guides by the job your software does. Each one ends with the events you will see.
Understand Vexless
The five things every response is made of.
Developer essentials
The contract
First jurisdiction: Finland. The OpenAPI document is the contract; every response is typed there and enforced by the server. The API reference is generated from it.
https://api.vexless.io/v1 # base URL of the service; reserved, not live yet
https://docs.vexless.io/ # these docs
https://docs.vexless.io/openapi.json # OpenAPI 3.1, fully typed responses; also /openapi.yaml
https://docs.vexless.io/llms.txt # for agents; /llms-full.txt has the whole reference as text
Current limits
- Invoice delivery is recorded but not performed:
delivery.statusstaysPENDING_PROVIDER. Render and send invoices yourself for now; the number and RF reference are in the response. - Real bank and e-invoice providers are not connected. Send bank transactions and captured bills through the origins endpoint. Payments execute only in the sandbox.
- Foreign-currency origins need an explicit
fxRate; there is no rate source yet. - Finland only. The chart of accounts is a minimal one that covers these flows; the statutory report layouts are abbreviated to its lines.
Everything else in these docs is implemented, typed in the OpenAPI document, and covered by end-to-end tests.