Journal Entries
Journal entry creation endpoints
Create multiple journal entries in batch (DEPRECATED — migrate to v2)
DEPRECATED. Migrate to POST /api/v2/journal-entries and call it once per entry; v2 auto-appends the AR/AP leg on the customer/vendor group default and rejects drift with typed error codes. The batch behavior of this endpoint will be re-introduced on v2 once the gated app fully cuts over from v1.
Original behavior: creates multiple journal entries in a single transaction. All entries are committed together — if any entry fails, the entire batch is rolled back. Supports journal entries, invoices, and payments with optional customer and dimension references.
Create multiple journal entries in batch (DEPRECATED — migrate to v2) › Request Body
Array of journal entries to create (1-100 entries per batch)
Create multiple journal entries in batch (DEPRECATED — migrate to v2) › Responses
Batch of journal entries created successfully
totalCreatedNumber of entries successfully created
Details of all created journal entries
List journal entries
Retrieves a paginated list of journal entries with optional filtering by date, account, customer, external system id, and search text.
query Parameters
pagePage number (1-indexed)
limitMaximum number of items per page
fromDateOnly include entries with a posting date on or after this date (ISO 8601). Filters je.date (bogføringsdato).
toDateOnly include entries with a posting date on or before this date (ISO 8601). Filters je.date (bogføringsdato).
documentDateFromOnly include entries with a document date on or after this date (ISO 8601). Filters je.documentDate.
documentDateToOnly include entries with a document date on or before this date (ISO 8601). Filters je.documentDate.
accountIdFilter by account ID
customerIdFilter by customer ID
vendorIdFilter by vendor ID
journalTypeFilter by journal type
externalSystemIdExact-match filter on your own system's id (set via PATCH /journal-entries/:id or carried on the entry). Not unique — several entries may share one id, so expect zero or more results.
minAmountOnly include entries with an amount greater than or equal to this value (inclusive).
maxAmountOnly include entries with an amount less than or equal to this value (inclusive).
searchFree-text search in description and reference fields
sortBySort field
sortOrderSort direction
List journal entries › Responses
Journal entries retrieved successfully
List of journal entries
totalTotal number of matching entries
pageCurrent page number
limitNumber of items per page
totalPagesTotal number of pages
Create a single journal entry (DEPRECATED — use POST /api/v2/journal-entries)
DEPRECATED. Use POST /api/v2/journal-entries instead. The v2 endpoint auto-appends the AR/AP leg on the customer/vendor group default account, eliminating the most common booking error (drift between the posted account and the configured group default). v1 stays available for legacy integrators but skips the anchor-account guard, so any drift it accepts will need to be reconciled later.
Original behavior: creates a single journal entry with the specified accounts and amount. Supports journal entries, invoices, and payments with optional customer and dimension references.
Create a single journal entry (DEPRECATED — use POST /api/v2/journal-entries) › Request Body
accountIdPrimary account ID (UUID). Cannot be a heading or total account. For typed entries (supplier_invoice, customer_invoice, etc.), must have appropriate account classification.
dateDate of the journal entry in YYYY-MM-DD format
amountAmount of the transaction (must be positive)
contraAccountIdContra account ID (UUID). Required unless splitEntries is provided. Cannot be a heading or total account. For typed entries, must have appropriate account classification.
entryTypeEntry type determines the journal type and enforces account classification rules. Account classification requirements: supplier_invoice: account=EXPENSE|ASSET, contraAccount=LIABILITY; supplier_payment: account=LIABILITY, contraAccount=ASSET; customer_invoice: account=ASSET, contraAccount=REVENUE; customer_payment: account=ASSET, contraAccount=ASSET; journal: no restrictions. Legacy values "invoice" and "payment" map to supplier types.
typeTransaction type (debit or credit)
descriptionDescription of the journal entry
referenceReference number or identifier
currencyCurrency code (defaults to DKK)
customerIdCustomer ID (UUID) for customer-related entries
vendorIdVendor ID (UUID). Required for supplier_invoice / supplier_payment entry types, and for any posting that touches an accounts-payable control account.
tagIdsTag/Dimension IDs to attach to the journal entry
vatCodeIdVAT/Tax code ID (UUID). Applied to the primary account unless split entries are used.
Split entry lines for multi-account entries. When provided, contraAccountId is not required. Requirements: (1) Total debits must equal total credits; (2) Must have at least one debit AND one credit entry; (3) Minimum 2 lines required; (4) All accounts must be postable (not heading or total accounts). Account classification validation is not applied to split entries.
File attachments (base64-encoded). Maximum 10 attachments per entry. Total request size limit is 15MB.
Create a single journal entry (DEPRECATED — use POST /api/v2/journal-entries) › Responses
Journal entry created successfully
idUnique identifier of the created journal entry
entryNumberEntry number assigned to the journal entry
dateDate of the journal entry
amountAmount of the transaction
currencyCurrency code
journalTypeJournal type
typeTransaction type
statusStatus of the journal entry
accountIdPrimary account ID
createdAtTimestamp when the entry was created
documentDateDocument date (date on the invoice/voucher). Null for legacy entries.
descriptionDescription of the journal entry
referenceReference number
externalSystemIdYour own system's id for this entry, when set. Not unique — several entries may share one id.
contraAccountIdContra account ID
customerIdCustomer ID if applicable
vendorIdVendor ID if applicable
vatCodeIdVAT/Tax code ID if applicable
tagIdsTag IDs attached to the entry
documentRefsDocument IDs attached to the entry
Get a single journal entry
Retrieves a journal entry by its ID.
path Parameters
idJournal entry ID (UUID)
Get a single journal entry › Responses
Journal entry retrieved successfully
idUnique identifier of the created journal entry
entryNumberEntry number assigned to the journal entry
dateDate of the journal entry
amountAmount of the transaction
currencyCurrency code
journalTypeJournal type
typeTransaction type
statusStatus of the journal entry
accountIdPrimary account ID
createdAtTimestamp when the entry was created
documentDateDocument date (date on the invoice/voucher). Null for legacy entries.
descriptionDescription of the journal entry
referenceReference number
externalSystemIdYour own system's id for this entry, when set. Not unique — several entries may share one id.
contraAccountIdContra account ID
customerIdCustomer ID if applicable
vendorIdVendor ID if applicable
vatCodeIdVAT/Tax code ID if applicable
tagIdsTag IDs attached to the entry
documentRefsDocument IDs attached to the entry
Update a journal entry — correct the reference and/or set your external system id
Partial update of a posted journal entry. Provide at least one of reference, externalSystemId.
reference corrects the reference on a CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE /
SUPPLIER_PAYMENT entry and re-runs payment ↔ invoice matching. Use this when an entry was booked
with a wrong reference and therefore never matched.
externalSystemId stores your own system's id for the entry. It is metadata: settable on any
journal type regardless of match state, and never affects matching. It is not unique — several
entries may share one id; filter GET /journal-entries?externalSystemId=... to list them.
Reference corrections apply to unmatched journal entries only. A payment that settles an invoice
carries amounts derived against that invoice (currency and original exchange rate), and which
invoice a payment settled is part of the books — neither can be edited in place. Documents with
settlement activity are rejected with 409 JOURNAL_ENTRY_REFERENCE_UPDATE_ALREADY_MATCHED.
Matched to the wrong journal entry? Reverse the entry with POST /api/v1/journal-entries/reverse
and re-book it with the correct reference via POST /api/v2/journal-entries. The reversal keeps
the audit trail intact, and the re-booked entry derives its settlement amounts against the
correct invoice.
Payments: the journal entry must be UNMATCHED (not linked to an invoice). After the update the corrected reference is looked up against the counterparty's invoices — on a hit the payment is linked and the invoice status recomputed (OPEN → PARTIALLY_PAID / PAID). On a miss the payment stays unmatched and can be corrected again.
Invoices: the invoice must have no settlement activity (no applied payments or linked credit notes). The invoice number is updated and any payments already waiting on the corrected number are matched in the same transaction. A 409 is returned when the invoice is already settled against, or when another invoice for the same counterparty already uses the new number.
Reference corrections on reversed entries and other journal types are rejected with 400.
path Parameters
idJournal entry ID
Update a journal entry — correct the reference and/or set your external system id › Request Body
referenceCorrected reference. For invoices this is the invoice number (the anchor is renumbered with it); for payments it is the invoice number the payment settles. Only unmatched entries of the four entity document types accept a reference correction.
externalSystemIdYour own system's id for this journal entry. Settable on any journal type regardless of match state. Not unique — several entries may carry the same id (e.g. one partner document booked as several entries); filter GET /journal-entries by externalSystemId to find all of them. null clears the value; omitting the field keeps it. reference does not accept null — it is a matching key, not clearable metadata.
Update a journal entry — correct the reference and/or set your external system id › Responses
Journal entry updated.
idJournal entry ID.
referenceThe reference after the update.
externalSystemIdThe external system id after the update.
Get attachments for a journal entry
Retrieves all attachments/documents associated with a journal entry.
path Parameters
idJournal entry ID (UUID)
Get attachments for a journal entry › Responses
Attachments retrieved successfully
journalEntryIdJournal entry ID the attachments belong to
List of attachments
Reverse posted journal entries in batch
Atomically reverses 1–100 posted journal entries in a single transaction. The original entries are left untouched; both originals and reversals remain visible in ledger / aging / balance reports so the audit trail is preserved.
Date handling: when reversalDate is omitted, each reversal is dated to its own
original entry so the original/reversal pair lands in the same posting period. When
reversalDate is supplied it applies to every reversal in the batch.
The posting period for every reversal date must be open. Duplicate IDs in the request are de-duplicated. If any reversal fails (closed period, ineligible source entry, etc.) the whole batch rolls back and no reversals are persisted.
Reverse posted journal entries in batch › Request Body
journalEntryIdsIDs of the journal entries to reverse (1–100). All reversals run in one transaction; one failure rolls back the whole batch. Duplicate IDs are de-duplicated.
reversalDateDate for every reversal posting (YYYY-MM-DD). When omitted, each reversal is dated to its own original entry so the pair lands in the same period.
reasonFree-text reason appended to every reversal description for audit purposes.
Reverse posted journal entries in batch › Responses
Reversals posted successfully
totalReversedNumber of reversals posted. Equals the count of unique IDs in the request on success.
Result rows pairing each original ID with its newly created reversal ID.
Reverse a posted journal entry
Reverses a single posted journal entry. Mirrors the gated app's "Reverse only, post immediately" correction option — a new POSTED journal entry is created with the original's Dr/Cr lines flipped. The original entry is left untouched; both entries remain visible in ledger / aging / balance reports so the audit trail is preserved.
Date handling: when reversalDate is omitted, the reversal is dated to the original
entry so the pair lands in the same posting period. The posting period for the
resolved date must be open.
Eligibility: the source entry must be POSTED and not already part of a correction chain that disallows further reversal. The endpoint rejects ineligible entries with 400.
Reverse a posted journal entry › Request Body
journalEntryIdUUID of the posted journal entry to reverse.
reversalDateDate for the reversal posting (YYYY-MM-DD). When omitted, the reversal is dated to the original entry so it lands in the same period. Must fall in an open posting period.
reasonFree-text reason appended to the reversal description for audit purposes.
Reverse a posted journal entry › Responses
Reversal posted successfully
reversalIdUnique identifier of the posted reversal journal entry.