Draft Journal Entries
Create multiple draft journal entries in batch
Credential: a company's API key or OAuth token.
Creates multiple draft journal entries in a single transaction. All entries are committed together — if any entry fails, the entire batch is rolled back.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to POST /api/v2/draft-journal-batches.
Required Scope
journal-entries-write
Headers
x-api-idempotency-keyOptional idempotency key for safely retrying mutating requests.
Create multiple draft journal entries in batch › Request Body
Array of draft journal entries to create (1-100 entries per batch)
Create multiple draft journal entries in batch › Responses
Batch of draft journal entries created successfully
totalCreatedNumber of draft entries successfully created
Details of all created draft journal entries
List draft journal entries
Credential: a company's API key or OAuth token.
Retrieves a paginated list of draft journal entries created via the public API, with optional filtering.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to the v2 draft endpoints under /api/v2/draft-journal-entries.
Required Scope
journal-entries-read
query Parameters
cursorOpaque cursor from the previous response's nextCursor. Returns the rows after it, in the same order. Send the same filters and sort as the request that produced it, and do not send page. The preferred way to page through a list.
pageDeprecated: page with cursor instead. Page number (1-indexed). From 2026-12-31, a page past the first of a list with more than 10,000 matching rows is refused.
limitMaximum items per page
fromDateOnly include drafts on or after this date (YYYY-MM-DD)
toDateOnly include drafts on or before this date (YYYY-MM-DD)
accountIdFilter by account ID (matches any draft line on this account)
customerIdFilter by customer ID
supplierIdFilter by supplier ID
vendorIdDeprecated — use supplierId. Legacy alias for the supplier filter.
journalTypeFilter by journal type
journalCategoryIdOnly include drafts in this journal category
minBaseCurrencyAmountOnly include drafts whose baseCurrencyAmount (the draft in your company base currency) is greater than or equal to this value (inclusive).
maxBaseCurrencyAmountOnly include drafts whose baseCurrencyAmount (the draft in your company base currency) is less than or equal to this value (inclusive).
minAmountDeprecated — use minBaseCurrencyAmount. The same filter under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.
maxAmountDeprecated — use maxBaseCurrencyAmount. The same filter under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.
externalSystemIdExact-match filter on your own system's id. Not unique — several drafts may share one id, so expect zero or more results.
searchFree-text search in description and reference fields
List draft journal entries › Responses
Draft journal entries retrieved successfully
List of draft journal entries
totalTotal number of matching drafts
limitItems per page
nextCursorCursor for the next page; pass it as cursor. null on the last page, and on every page of a sort that cannot page by cursor — hasMore then says whether another page follows by page number.
hasMoreWhether more rows follow this page.
pageDeprecated: page with nextCursor instead. Current page number.
totalPagesDeprecated: page with nextCursor instead. Total number of pages.
Create a draft journal entry
Credential: a company's API key or OAuth token.
Creates a draft journal entry that can be reviewed before being booked as a real posted journal entry. Accepts the same fields as the regular journal entry endpoint. The posting period is not validated at creation time.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to the v2 draft endpoints under /api/v2/draft-journal-entries.
Required Scope
journal-entries-write
Headers
x-api-idempotency-keyOptional idempotency key for safely retrying mutating requests.
Create a draft journal entry › 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
contraAccountIdContra account ID (UUID). Optional for drafts — partial drafts (primary line only) are allowed and must be completed in the platform UI before booking. Cannot be a heading or total account.
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
customerIdCustomer ID (UUID) for customer-related entries
supplierIdSupplier 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.
File attachments (base64-encoded). Maximum 10 attachments per entry. Total request size limit is 15MB.
originalAmountThe draft amount in the currency it is entered in, the one originalCurrency names (zero or more). Ignored when splitEntries is sent: the draft then stores the sum of the debit lines. Required unless the deprecated amount is sent instead.
originalCurrency^[A-Za-z]{3}$ISO 4217 alpha-3 code of the currency the draft is entered in. Omitted under both names, the draft is in your company base currency.
Split entry lines for multi-account drafts. Each line may omit accountId to act as a placeholder; the draft is persisted with NULL on those lines and the user completes them in the platform UI. Booking still requires every line to carry a real account and the entry to balance.
externalSystemIdYour own system's id for this draft. Carried onto the booked journal entry. Not unique — several drafts/entries may share one id. Filter the list endpoint by externalSystemId.
vendorIdDeprecated — use supplierId. Legacy alias for the supplier reference; still accepted, but sending both supplierId and vendorId with different values returns 400.
amountDeprecated — use originalAmount. The same figure under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.
currency^[A-Za-z]{3}$Deprecated — use originalCurrency. The same currency code under its old name. Sending both with different codes returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.
Create a draft journal entry › Responses
Draft journal entry created successfully
idDraft journal entry ID
dateDate in YYYY-MM-DD format
baseCurrencyAmountHow large this draft is, in your company base currency — the one your company reports in. A draft entered as EUR 1,000 by a company reporting in DKK is 7450 here.
Do not display this number beside originalCurrency. That field names the currency the draft was entered in (EUR in the example), while this number is in DKK. originalAmount is the figure that belongs beside originalCurrency.
Reads 0 on a draft that holds no figure in this currency. The minBaseCurrencyAmount and maxBaseCurrencyAmount list filters run on this field, so a draft reading 0 here is excluded whenever either filter is applied.
originalAmountHow large this draft is, in the currency it was entered in — the currency originalCurrency names, and the one lines[].amount uses. A draft entered as EUR 1,000 is 1000 here, whatever your company reports in.
This is the figure to display beside originalCurrency. baseCurrencyAmount is the same draft in your company base currency: on that EUR draft this field reads 1000 and baseCurrencyAmount reads 7450. Reads 0 on a draft that carries no amount yet.
originalCurrencyThe currency this draft was entered in — EUR for a supplier invoice received in EUR. originalAmount and lines[].amount are in this currency; baseCurrencyAmount is in your company base currency, which is this one only when the draft was entered in it.
journalTypeJournal type
journalCategoryIdID of the journal category the draft is in. Set it with journalCategoryId on the v2 draft create and on PATCH /v2/draft-journal-entries/{id}. Booking the draft keeps it on the journal entry. List the categories with GET /v1/journal-categories. Null when the draft has no category.
Every line of the draft. Always present, an empty array included, so a client never has to distinguish absent from empty. The name matches the lines the v2 draft endpoints take, so a draft reads back through the field it was written with.
statusAlways "DRAFT" for draft journal entries
createdAtCreation timestamp
updatedAtLast update timestamp
documentDateDocument date (date on the invoice/voucher). Null when not set.
dueDateDue date stated on the draft (YYYY-MM-DD). Null when none was stated; booking a customer or supplier invoice then calculates one from the payment term.
originalCurrencyToBaseCurrencyExchangeRateWhat one unit of originalCurrency is worth in your company base currency. 7.45 on a EUR draft of a company reporting in DKK means 1 EUR buys 7.45 DKK.
This is the rate the draft is converted at, not a factor between the two amounts on this response. baseCurrencyAmount is built from the draft lines rather than from originalAmount, so multiplying originalAmount by this rate does not reliably reproduce it — on a draft whose sides disagree the two figures differ with no rate involved at all. A draft already entered in your own currency carries 1. Null only while a foreign-currency draft has no rate yet — booking gives it one.
originalCurrencyToBaseCurrencyExchangeRateDateDate the originalCurrencyToBaseCurrencyExchangeRate was captured for. Null whenever that rate is.
descriptionDescription
referenceReference number
externalSystemIdYour own system's id for this draft, when set. Not unique. null when unset or cleared.
typeTransaction type (debit or credit)
accountIdPrimary account ID
contraAccountIdContra account ID
customerIdCustomer ID
supplierIdSupplier ID
vatCodeIdVAT/Tax code ID
tagIdsTag/Dimension IDs
documentRefsDocument IDs attached to the draft
amountDeprecated — use baseCurrencyAmount, which carries the same value. The draft in your company base currency. Do not display it beside currency: that names the currency the draft was entered in. The v1 create takes a request field of the same name carrying the figure the draft is entered in, so a EUR draft sent as amount: 1000 is returned with amount: 7450 — one name, two currencies.
currencyDeprecated — use originalCurrency, which carries the same value. The currency the draft was entered in.
exchangeRateDeprecated — use originalCurrencyToBaseCurrencyExchangeRate, which carries the same value.
exchangeRateDateDeprecated — use originalCurrencyToBaseCurrencyExchangeRateDate, which carries the same value.
vendorIdDeprecated — use supplierId. Legacy alias, emitted with the same value.
Deprecated — use lines. Present only on drafts that need it: a plain one-debit-one-credit draft with no per-line memo or dimensions reports its accounts through accountId / contraAccountId and omits this field entirely. It also reports a placeholder line's account as "", which the write side rejects. lines is populated either way and round-trips.
Get a draft journal entry
Credential: a company's API key or OAuth token.
Retrieves a draft journal entry by ID.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to the v2 draft endpoints under /api/v2/draft-journal-entries.
Required Scope
journal-entries-read
path Parameters
idDraft journal entry ID (UUID)
Get a draft journal entry › Responses
Draft journal entry retrieved successfully
idDraft journal entry ID
dateDate in YYYY-MM-DD format
baseCurrencyAmountHow large this draft is, in your company base currency — the one your company reports in. A draft entered as EUR 1,000 by a company reporting in DKK is 7450 here.
Do not display this number beside originalCurrency. That field names the currency the draft was entered in (EUR in the example), while this number is in DKK. originalAmount is the figure that belongs beside originalCurrency.
Reads 0 on a draft that holds no figure in this currency. The minBaseCurrencyAmount and maxBaseCurrencyAmount list filters run on this field, so a draft reading 0 here is excluded whenever either filter is applied.
originalAmountHow large this draft is, in the currency it was entered in — the currency originalCurrency names, and the one lines[].amount uses. A draft entered as EUR 1,000 is 1000 here, whatever your company reports in.
This is the figure to display beside originalCurrency. baseCurrencyAmount is the same draft in your company base currency: on that EUR draft this field reads 1000 and baseCurrencyAmount reads 7450. Reads 0 on a draft that carries no amount yet.
originalCurrencyThe currency this draft was entered in — EUR for a supplier invoice received in EUR. originalAmount and lines[].amount are in this currency; baseCurrencyAmount is in your company base currency, which is this one only when the draft was entered in it.
journalTypeJournal type
journalCategoryIdID of the journal category the draft is in. Set it with journalCategoryId on the v2 draft create and on PATCH /v2/draft-journal-entries/{id}. Booking the draft keeps it on the journal entry. List the categories with GET /v1/journal-categories. Null when the draft has no category.
Every line of the draft. Always present, an empty array included, so a client never has to distinguish absent from empty. The name matches the lines the v2 draft endpoints take, so a draft reads back through the field it was written with.
statusAlways "DRAFT" for draft journal entries
createdAtCreation timestamp
updatedAtLast update timestamp
documentDateDocument date (date on the invoice/voucher). Null when not set.
dueDateDue date stated on the draft (YYYY-MM-DD). Null when none was stated; booking a customer or supplier invoice then calculates one from the payment term.
originalCurrencyToBaseCurrencyExchangeRateWhat one unit of originalCurrency is worth in your company base currency. 7.45 on a EUR draft of a company reporting in DKK means 1 EUR buys 7.45 DKK.
This is the rate the draft is converted at, not a factor between the two amounts on this response. baseCurrencyAmount is built from the draft lines rather than from originalAmount, so multiplying originalAmount by this rate does not reliably reproduce it — on a draft whose sides disagree the two figures differ with no rate involved at all. A draft already entered in your own currency carries 1. Null only while a foreign-currency draft has no rate yet — booking gives it one.
originalCurrencyToBaseCurrencyExchangeRateDateDate the originalCurrencyToBaseCurrencyExchangeRate was captured for. Null whenever that rate is.
descriptionDescription
referenceReference number
externalSystemIdYour own system's id for this draft, when set. Not unique. null when unset or cleared.
typeTransaction type (debit or credit)
accountIdPrimary account ID
contraAccountIdContra account ID
customerIdCustomer ID
supplierIdSupplier ID
vatCodeIdVAT/Tax code ID
tagIdsTag/Dimension IDs
documentRefsDocument IDs attached to the draft
amountDeprecated — use baseCurrencyAmount, which carries the same value. The draft in your company base currency. Do not display it beside currency: that names the currency the draft was entered in. The v1 create takes a request field of the same name carrying the figure the draft is entered in, so a EUR draft sent as amount: 1000 is returned with amount: 7450 — one name, two currencies.
currencyDeprecated — use originalCurrency, which carries the same value. The currency the draft was entered in.
exchangeRateDeprecated — use originalCurrencyToBaseCurrencyExchangeRate, which carries the same value.
exchangeRateDateDeprecated — use originalCurrencyToBaseCurrencyExchangeRateDate, which carries the same value.
vendorIdDeprecated — use supplierId. Legacy alias, emitted with the same value.
Deprecated — use lines. Present only on drafts that need it: a plain one-debit-one-credit draft with no per-line memo or dimensions reports its accounts through accountId / contraAccountId and omits this field entirely. It also reports a placeholder line's account as "", which the write side rejects. lines is populated either way and round-trips.
Delete a draft journal entry
Credential: a company's API key or OAuth token.
Deletes a draft journal entry. Any attached documents are released back to the inbox (status reset to NEW). When a bank payment still references the draft, the delete is refused with 409 DRAFT_LINKED_TO_BANK_PAYMENT (the linked payment ids are in the error details); re-send with ?detachBankPayments=true to confirm — the payments survive, only their draft link is cleared.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to the v2 draft endpoints under /api/v2/draft-journal-entries.
Required Scope
journal-entries-write
path Parameters
idDraft journal entry ID (UUID)
query Parameters
detachBankPaymentsConfirm detaching any bank payments still linked to this draft.
Headers
x-api-idempotency-keyOptional idempotency key for safely retrying mutating requests.
Delete a draft journal entry › Responses
Draft deleted successfully
Book a draft journal entry
Credential: a company's API key or OAuth token.
Converts a draft journal entry into a real posted journal entry. Validates the posting period and balance, then permanently deletes the draft.
DEPRECATED — sunset on 2026-12-31 (RFC 8594; every response carries Deprecation/Sunset/Link headers). Migrate to the v2 draft endpoints under /api/v2/draft-journal-entries.
Required Scope
journal-entries-write
path Parameters
idDraft journal entry ID (UUID)
Headers
x-api-idempotency-keyOptional idempotency key for safely retrying mutating requests.
Book a draft journal entry › Responses
Draft booked successfully — returns the created journal entry
idUnique identifier of the created journal entry
entryNumberEntry number assigned to the journal entry
dateDate of the journal entry
amountAmount of the line accountId names, in that line's account currency (currency). On a two-line entry this is the entry total. On a wider entry it is one line of several — sum lines[].functionalAmount on either side for the total.
currencyCurrency amount is denominated in — the operating currency of that first line's account.
journalTypeJournal type
journalCategoryIdID of the journal category the entry is in. A draft booked with a category keeps it. List the categories with GET /v1/journal-categories. Null when the entry has no category.
typeTransaction type
statusStatus of the journal entry
reversedByEntryIdThe id of the entry that reverses this one, or null when no reversal made in LedgerBee points at it. A reversed entry keeps its status, so this field is what says it no longer counts: it and its reversal cancel each other out. A reversal imported from e-conomic cancels its entry through opposite amounts and is not linked, so the entry it cancels reads null here.
reversalOfEntryIdOn a reversal, the id of the entry it reverses; null on every other entry. The entry named here names this one in its reversedByEntryId.
accountIdOne non-VAT line of the entry, paired with contraAccountId as a two-line summary. On a two-line entry the pair describes the whole entry. On a wider one it describes two of its lines and nothing about the rest — read lines for the full picture. Which two are picked is not part of this contract and differs by endpoint (a read takes them in posting order; the draft-booking response takes a debit and a credit), so do not infer a line's position from it.
createdAtTimestamp when the entry was created
documentDateDocument date (date on the invoice/voucher). Null when the entry was booked without one; its VAT period then follows date.
dueDateDue date of the customer or supplier invoice this entry books (YYYY-MM-DD). Null on every other entry type, on a credit note booked without one, and on an invoice posted through this API without a reference (no invoice is registered for it).
originalAmountWhat you posted, in the currency you posted it in — the document figure, before any conversion. Distinct from amount, which is denominated in the ACCOUNT currency (currency): a EUR entry against DKK accounts reports originalAmount: 200 / originalCurrency: "EUR" and amount: 1492.24 / currency: "DKK". Null on historical entries that stored no document amount.
originalCurrencyThe currency the entry was posted in: what originalAmount is denominated in, and what originalCurrencyToBaseCurrencyExchangeRate converts FROM. Present independently of originalAmount — an entry can name a currency and store no document amount, which is the historical shape, and the currency still says what its rate converts from. Null only on an entry that names no currency at all.
originalCurrencyToBaseCurrencyExchangeRateRate converting originalCurrency to the company base currency — 7.45 on a EUR entry of a DKK-based company means 1 EUR = 7.45 DKK, so originalAmount * originalCurrencyToBaseCurrencyExchangeRate is the base-currency total that lines[].functionalAmount sums to. Reported whether you supplied it on create or the platform resolved it, which is what lets you compute the difference against the rate your own settlement later used. 1 on an entry posted in the base currency, since that is the conversion that was applied and stored. Null only on historical entries that stored no rate at all.
originalCurrencyToBaseCurrencyExchangeRateDateDate the originalCurrencyToBaseCurrencyExchangeRate was captured for. Set on every posted entry, including one that stored no rate; an entry posted in your company base currency carries its own date.
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.
contraAccountIdThe other half of the accountId pair, when the entry has a second non-VAT line. Same caveat: it is one line, not a summary of every line other than accountId.
Every line of the entry, including VAT lines the platform derived. This is the complete picture: accountId, contraAccountId, amount, currency and vatCodeId above all describe one line, or two, and nothing about the rest. Debits and credits balance across the array on functionalAmount. The order is stable for a given entry — normally the order the lines were posted in — but match lines by account rather than by position, and use vatSourceLineIndex to link a VAT line to its source.
customerIdCustomer ID if applicable
supplierIdSupplier ID if applicable
vatCodeIdVAT/Tax code on the line accountId names, if it has one. Lines can carry different codes — read lines[].vatCodeId for the per-line codes.
tagIdsTag IDs attached to the entry as a whole. Per-line dimensions are on lines[].tagIds.
documentRefsDocument IDs attached to the entry
Notes on the posted entry, as codes. Present only when there is one. JOURNAL_ENTRY_YEAR_END_ACCOUNT_POSTED: the entry has a line on the company year-end account and every other line is on a balance-sheet account; details.accountId names the account. An entry with a line there and an income or expense line is refused with 400 JOURNAL_ENTRY_YEAR_END_ACCOUNT_RESULT_LINE.
exchangeRateDeprecated — use originalCurrencyToBaseCurrencyExchangeRate, which carries the same value.
exchangeRateDateDeprecated — use originalCurrencyToBaseCurrencyExchangeRateDate, which carries the same value.
vendorIdDeprecated — use supplierId. Legacy alias, emitted with the same value.