bookId query parameter, and every write must state which Book its Entry counts in.
The model
- Book. A named measurement basis of one Entity. Two Entities are free to use the same name.
- Common Entry. A Ledger Entry with no
bookId. It counts in every Book of the Entity. - Book Entry. A Ledger Entry that names a
bookId. It counts in that Book only. - Report. Reads one Book: the common Entries plus the Entries of that Book.
- A Book is unique by name inside one Entity.
- An Entry cannot name a Book of another Entity (composite foreign key).
- The Book of an Entry is set at insert and never moves. Correct a wrong Book by unbooking and reposting so the trail states the correction.
- A Reversal stays in the Book of its original. A common Entry is reversed by a common Entry; a Book Entry by an Entry of that Book.
- An Allocation settles two lines of one Book, or two common lines. Lines of different Books state no offset.
When bookId is required
Once an Entity has at least one Book, every book-scoped read must carry bookId, and the server answers BOOK_REQUIRED_ERROR (409) without it. An Entity with no Book must not send bookId.
Book-scoped reads:
- Home dashboard, balance sheet, income statement, income statement by dimension, journal, revenue realization, eight-column balance, general ledger, and partner ledger — see Reports.
- Open item lines and match-candidates for a Bank Movement — see Ledger Entries and Bank Movements.
- The paginated Partner listing (
GET /partners/pages) — see Partners.
GET /partners), which an Invoice document embeds, and the Partner row returned by a create, an update, or a delete. Both surface open totals across every Book.
Book-scoped writes carry bookId on the entry header of the Ledger Entry they post: create Ledger Entry, book Invoice, book Bank Movement, and match Bank Movement. A reversal takes the Book of its original — do not send bookId on POST /ledger/entries/:entryId/reverse.
GET /api/entities/:entityId/books
List the Books of the Entity in creation order.- Path param:
entityId(UUID) - Success response: an array of Book objects (see Response shape)
- Status: 200
POST /api/entities/:entityId/books
Create a Book under the Entity. The client supplies the idempotency id, so a retry with the same id is answered as a conflict instead of creating a duplicate.- Path param:
entityId(UUID) - Body:
- Success response: the created Book (see Response shape)
- Status: 201
GET /api/entities/:entityId/books/:bookId
Read a single Book.- Path params:
entityId(UUID),bookId(UUID) - Success response: the Book (see Response shape)
- Status: 200
Response shape
Every endpoint on this page that returns a Book uses this shape:Domain error codes
Status codes
What Books do not change
- Chart of accounts. The Books of an Entity share its chart.
- Currency. The Books of an Entity share its functional currency; presentation currency stays a report parameter.
- Lock Date. The Entity’s ledger lock date closes every Book at once.
- No primary Book. No Book is the default one; an Entity with Books names the Book it reads, every time.
- No auto-derived Entries. A Book holds what a caller posted in it. Nothing copies, mirrors, or recomputes an Entry from one Book into another.
- No rename, no delete. A Book is additive.

