LedgerBee Developer
  • Getting started
  • Conventions
  • Products
  • Advisor firms
  • Configuration
  • API Reference
Information
Accounts
    List accountsgetCreate an accountpostGet an accountgetDelete an accountdeleteUpdate an accountpatch
Advisor Authority Extracts
    Submit authority extract data for an advisor firm's clientspost
Advisor Clients
    List the advisor firm's clientsget
API Key
    Get current API keyget
Authority Extracts
    Submit authority extract datapost
Bank Reconciliations
    Reconcile bank lines against entriespostUndo a bank reconciliationpostCheck what undoing a reconciliation would dopostReconcile a batch of matchespostCheck what reconciling a batch of matches would dopostCheck what reconciling bank lines against entries would dopost
Bank Transactions
    List bank linesgetGet a bank linegetDismiss bank lines from reconciliationpostCheck which bank lines a dismiss would changepostRestore dismissed bank lines to reconciliationpostCheck which bank lines a restore would changepost
Billing Groups
    Form a billing grouppostGet a billing groupgetAdd members to a billing grouppostRemove a member from a billing groupdeleteCheck billing group eligibilitypost
Budgets
    List budgetsgetGet a budgetgetGet the budget vs actuals comparisongetExport a budget's Excel workbookgetOverwrite a budget's figures from an edited workbookpostList a budget's frozen baselinesgetGet a frozen baseline with its snapshot cellsgetList a budget's re-baseline proposalsgetList a budget's scenariosgetResolve a budget's grid under a scenariogetGet the variance report vs a frozen baselinegetGet the runway headlineget
Checkout
    Confirm the checkoutpostQuote a first periodpostIntegration readinessgetMint a checkout sessionpostRehydrate a sessiongetRelease the card hold (edit-after-card)postPoll card statusgetOpen the card windowpostOpen a card window for a live subscriptionpost
Company
    Get company detailsget
Connected app OAuth
    JSON Web Key Set used to verify OAuth access-token signaturesgetRFC 8414 authorization-server metadata for the connected-app OAuth servergetRFC 9728 protected-resource metadata for an MCP resourcegetRFC 9728 protected-resource metadata for an MCP resourcegetOpenID Connect discovery document for the connected-app OAuth serverget
Credit Note Links
    Link a credit note to the invoice it creditspostCheck a credit note’s links and the invoices it can be linked topostDetach a credit note from the invoices it is applied topost
Credit Notes
    List credit notesgetCreate a credit notepostGet a credit notegetGet the delivery status of a credit notegetDownload the credit note PDFgetSend a credit note to the customerpostCredit a whole invoicepost
Customers
    List customersgetCreate a customerpostGet a customergetDelete a customerdeleteUpdate a customerpatchList a customer's contactsgetList a customer's departmentsgetList customer groupsget
Dimensions
    List all dimensionsgetCreate a new dimension categorypostGet a dimensiongetUpdate a dimension categoryputDelete a dimension categorydeleteList distribution keys (paginated)getCreate a distribution keypostGet a distribution keygetList dimension values (paginated)getCreate a new dimension valuepostUpdate a dimension valueputDelete a dimension valuedelete
Discounts
    List discountsgetCreate a discountpostGet a discountgetDelete a discountdeleteUpdate a discountpatchSet a discount's amount in one currencyputRemove a discount's amount in one currencydeleteCheck whether a discount applies to a product for a customer on a daygetAssign a discountpostRemove an assignmentdeleteUpdate an assignmentpatchList a discount's codesgetAdd a code to a discountpostDelete a codedeleteUpdate a codepatchList the discounts that apply to a product for a customer on a daygetCheck a cartpostLook up a discount codeget
Document Templates
    List document templatesget
Document Upload Links
    Upload a file through a minted linkpost
Download Links
    Mint a download link for a document PDFgetDownload a minted linkget
Draft Journal Entries
    Create multiple draft journal entries in batchpostList draft journal entriesgetCreate a draft journal entrypostGet a draft journal entrygetDelete a draft journal entrydeleteBook a draft journal entrypost
Draft Journal Entries (v2)
    Create draft journal entries in batch (v2)postList draft journal entries (v2)getCreate a draft journal entry (v2)postGet a draft journal entry (v2)getDelete a draft journal entry (v2)deleteUpdate a draft journal entry (v2)patchGet attachments for a draft journal entry (v2)getAdd a document to a draft journal entry (v2)postRemove a document from a draft journal entry (v2)deleteBook a draft journal entry (v2)post
Entitlements
    List entitlementsgetCreate an entitlementpostGet an entitlementgetDelete an entitlementdeleteUpdate an entitlementpatch
Invoices
    List invoicesgetCreate a draft invoicepostGet an invoicegetDelete a draft invoicedeleteUpdate an unsent invoicepatchGet the delivery status of an invoicegetDownload the invoice PDFgetSend an invoice to the customerpost
Journal Categories
    List journal categoriesgetCreate a journal categorypostUpdate a journal categoryputDelete a journal categorydelete
Journal Entries
    List journal entriesgetGet a journal entrygetUpdate a journal entry — correct the reference and/or set your external system idpatchGet attachments for a journal entrygetAdd a document to a journal entrypostRemove a document from a journal entrydeletePreview a correction without posting itpostMove postings to different accounts, keeping the document intactpostRebuild the entry a reversal undid, as a draftpostPreview rebuilding the entry a reversal undidpostReverse a posted entry and open a draft to re-enter itpostReverse posted journal entries in batchpostPreview reversing posted journal entries in batchpostReverse a posted journal entrypostPreview reversing a posted journal entrypost
Journal Entries (v2)
    Create a journal entry (v2)postCreate journal entries in batch (v2)post
MCP
    LedgerBee Developer MCP Serverpost
Meters
    List meter subscriptions by IDgetReport usagepostList meter subscriptions by nameget
Open Entries
    List a counterparty’s open entriesget
Order Confirmations
    List order confirmationsgetCreate a draft order confirmationpostGet an order confirmationgetUpdate a draft order confirmationpatchConvert an order confirmation into an invoicepostDownload an order confirmation as PDFgetSend an order confirmationpost
Payment Methods
    List saved payment methods for a customergetCancel a saved card on the payment providerdeleteUnassign a payment method from a customerdeleteGenerate a link for the customer to save a card for future paymentspostSet a saved payment method as the customer defaultput
Portal Plans
    List the full plan cataloguegetGet a plangetResolve the gated pricing catalogue for an identified buyer (partner display)post
Portal SSO
    Get a tenant's SSO signing keys (JWKS)getMint a checkout-vouch token (partner-vouched anonymous checkout)postMint a customer-portal SSO handoff referencepostProvision a customer + grant portal access (partner JIT provisioning)postRevoke (force-refresh) a user's customer-portal sessionspost
Product Groups
    List product groupsgetCreate a product grouppostGet a product groupgetDelete a product groupdeleteUpdate a product grouppatch
Product Prices
    Create a product pricepostGet a product pricegetDelete a product pricedeleteUpdate a product pricepatchActivate a product pricepostArchive a product pricepostDisable a product pricepostSet a price as the product defaultpost
Products
    List productsgetCreate a productpostGet a productgetDelete a productdeleteUpdate a productpatchArchive a productpost
Projects
    List all projectsgetCreate or update a project by external referenceputCreate a projectpostGet a projectgetUpdate a projectputGet project profitgetAdd a subprojectpostUpdate a subprojectputDelete a subprojectdelete
Quotes
    List quotesgetCreate a draft quotepostGet a quotegetUpdate a draft quotepatchConvert a quotepostDownload a quote as PDFgetSend a quotepost
Settlements
    List a counterparty’s settlementsgetSettle open entries against each otherpostGet a settlementgetUndo a settlementpostCheck what undoing a settlement would dopostCheck what settling these entries would dopost
Shipments
    List shipmentsgetCreate a shipment from an orderpostGet a shipmentgetCancel a shipmentpostDispatch a shipmentpost
Stock
    List stock movementsgetList on-hand stockgetOn-hand for one productget
Subscriptions
    List customer subscriptionsgetAssign a subscription to a customerpostGet a customer subscription by its stable idgetUpdate a customer subscriptionpatchAdd an add-on to a customer subscriptionpostAttach existing subscriptions as add-onspostCheck whether subscriptions can become add-onspostChange the products on a customer subscriptionpostRetry a failed card paymentpostList a subscription's pending scheduled changesgetCancel a single pending scheduled changedeleteGet a subscription's unbilled usagegetCancel a customer subscriptionpostList subscription plansgetCreate a subscription planpostArchive a subscription planpost
Suppliers
    List suppliersgetCreate a supplierpostDelete a supplierdeleteList supplier contactsgetList supplier departmentsgetList supplier groupsget
VAT Codes
    List VAT codesgetCreate a VAT codepostGet a VAT codegetDelete a VAT codedeleteUpdate a VAT codepatch
VAT periods
    Record a VAT return filed outside LedgerBeepostPreview recording a VAT return filed outside LedgerBeepostSettle a filed VAT periodpostPreview a VAT period settlementpost
Vendors
    List vendorsgetCreate a vendorpostList vendor contactsgetList vendor departmentsgetList vendor groupsget
Webhook Endpoints
    List webhook endpointsgetCreate a webhook endpointpostRetrieve a webhook endpointgetUpdate a webhook endpointputDelete a webhook endpointdeleteRoll the signing secretpostSend a test eventpost
Schemas
LedgerBee Public API
LedgerBee Public API

Schemas

Download schema

CompanyFiscalYear

startDate
​string · required

First day of the fiscal year, inclusive (YYYY-MM-DD)

Example: 2026-01-01
endDate
​string · required

Last day of the fiscal year, inclusive (YYYY-MM-DD)

Example: 2026-12-31
status
​string · enum · required

Whether the year is still open for posting

Enum values:
OPEN
CLOSED
Example: OPEN

CompanyAccounting

baseCurrency
​string · required

The company's base (functional) currency, ISO 4217. Every figure a report labels a base-currency total is denominated in this.

Example: DKK
currentFiscalYear
​object | null · required

The fiscal year containing today. Null when no accounting year covers today — a company mid-setup, or one whose years stop short of the current date.

CompanyResponse

id
​string · required

Unique identifier for the company, uuidv7 based

Example: 01234567-89AB-CDEF-0123-456789ABCDEF
name
​string · required

Company name

Example: Acme Corporation
email
​string · required

Primary email address

Example: contact@acme.com
address
​string · required

Street address

Example: 123 Main Street
​object · required

The company's accounting configuration: base currency and the fiscal year covering today.

vat
​string

VAT / company registration number, as registered

Example: 12345678
billingEmail
​string

Billing email address

Example: billing@acme.com
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Country code (ISO 3166-1 alpha-2)

Example: DK
phone
​string

Phone number

Example: +45 12 34 56 78
preferredLanguage
​string

Preferred language code

Example: en
contactPersonFirstName
​string

Contact person first name

Example: John
contactPersonLastName
​string

Contact person last name

Example: Doe

RateLimitTierResponse

name
​string · required

Name of the rate limit tier

Example: short
ttl
​number · required

Time-to-live in milliseconds for this rate limit tier (0 means no time limit)

Example: 1000
limit
​number · required

Maximum number of requests allowed within the TTL window (-1 means unlimited)

Example: 3

ApiKeyInfoResponse

​RateLimitTierResponse[] · required

Available rate limit tiers for this API key

expiresAt
​string

Expiration date and time of the API key

Example: 2024-12-31T23:59:59.000Z
ipWhitelist
​string[]

List of IP addresses allowed to use this API key

Example: ["192.168.1.1","10.0.0.1"]
scopes
​string[]

List of scopes granted to this API key

Example: ["accounts-read","journal-entries-write"]

AccountResponse

id
​string · required

The unique identifier of the account

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the account

Example: Skyldig AM-bidrag
accountNumber
​number · required

Account type number

Example: 1000
publicAccountId
​number · required

Public account id that the account maps to

Example: 1000
ledgerType
​string · enum · required

Type of ledger account. Only BALANCE_SHEET and PROFIT_AND_LOSS accounts can be used in journal entries.

Enum values:
BALANCE_SHEET
HEADING_BREAK
HEADING
PROFIT_AND_LOSS
TOTAL_FROM
TOTAL_INTERVALS
Example: BALANCE_SHEET
debitCredit
​string · enum · required

The side a journal-entry line on this account pre-selects: debit or credit. This is the Debit/Credit choice on the account form. It does not decide how a balance is reported; accountClassification does.

Enum values:
debit
credit
Example: debit
requiredDimensionIds
​string[] · required

IDs of the dimensions this account requires: every journal entry line posting to the account must carry a value from each of them, or the entry is refused with JOURNAL_TAG_REQUIRED_DIMENSION_MISSING. Empty when the account requires none. This is the account setting as stored: a dimension that has since been deactivated stays listed and is not enforced until it is active again, so match the ids against the dimensions list, which returns active dimensions only.

Example: ["0192f3a4-5b6c-7d8e-9f01-23456789abcd"]
accountClassification
​string | null · enum

Account classification (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE)

Enum values:
ASSET
LIABILITY
EQUITY
REVENUE
EXPENSE
Example: ASSET
controlAccountType
​string | null · enum

Control account type. ACCOUNTS_RECEIVABLE requires customerId on journal entries, ACCOUNTS_PAYABLE requires vendorId. Null for regular accounts.

Enum values:
ACCOUNTS_RECEIVABLE
ACCOUNTS_PAYABLE
Example: null
vatCodeId
​string | null

VAT code applied by default to journal-entry lines on this account, or null

Example: 550e8400-e29b-41d4-a716-446655440000

AccountInterval

from
​number · required

First account number of the range (inclusive)

Example: 1000
to
​number · required

Last account number of the range (inclusive)

Example: 1999

AccountDetailResponse

id
​string · required

The unique identifier of the account

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the account

Example: Skyldig AM-bidrag
accountNumber
​number · required

Account type number

Example: 1000
publicAccountId
​number · required

Public account id that the account maps to

Example: 1000
ledgerType
​string · enum · required

Type of ledger account. Only BALANCE_SHEET and PROFIT_AND_LOSS accounts can be used in journal entries.

Enum values:
BALANCE_SHEET
HEADING_BREAK
HEADING
PROFIT_AND_LOSS
TOTAL_FROM
TOTAL_INTERVALS
Example: BALANCE_SHEET
debitCredit
​string · enum · required

The side a journal-entry line on this account pre-selects: debit or credit. This is the Debit/Credit choice on the account form. It does not decide how a balance is reported; accountClassification does.

Enum values:
debit
credit
Example: debit
requiredDimensionIds
​string[] · required

IDs of the dimensions this account requires: every journal entry line posting to the account must carry a value from each of them, or the entry is refused with JOURNAL_TAG_REQUIRED_DIMENSION_MISSING. Empty when the account requires none. This is the account setting as stored: a dimension that has since been deactivated stays listed and is not enforced until it is active again, so match the ids against the dimensions list, which returns active dimensions only.

Example: ["0192f3a4-5b6c-7d8e-9f01-23456789abcd"]
currency
​string · required

The currency the account is kept in (ISO 4217). A balance-sheet account may be kept in a foreign currency; every other account is kept in the company's base currency.

Example: DKK
tags
​string[] · required

Free-form tags for grouping accounts

Example: ["operating"]
createdAt
​string · date-time · required

When the account was created

updatedAt
​string · date-time · required

When the account was last changed

accountClassification
​string | null · enum

Account classification (ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE)

Enum values:
ASSET
LIABILITY
EQUITY
REVENUE
EXPENSE
Example: ASSET
controlAccountType
​string | null · enum

Control account type. ACCOUNTS_RECEIVABLE requires customerId on journal entries, ACCOUNTS_PAYABLE requires vendorId. Null for regular accounts.

Enum values:
ACCOUNTS_RECEIVABLE
ACCOUNTS_PAYABLE
Example: null
vatCodeId
​string | null

VAT code applied by default to journal-entry lines on this account, or null

Example: 550e8400-e29b-41d4-a716-446655440000
mapsTo
​number | null

The account number this account reports under. When set, publicAccountId follows it.

Example: 1000
totalFrom
​number | null

For a TOTAL_FROM account: the first account number it sums from, up to the account's own number

Example: 1000
​array | null

For a TOTAL_INTERVALS account: the account-number ranges it sums

deactivatedAt
​string | null · date-time

When the account was deactivated, or null while it is active

CreateAccountRequest

name
​string · required

Name of the account

Example: Software subscriptions
accountNumber
​number · required

Account number, unique within the company

Example: 3120
ledgerType
​string · enum · required

Kind of account. Only BALANCE_SHEET and PROFIT_AND_LOSS accounts take postings; HEADING, HEADING_BREAK, TOTAL_FROM and TOTAL_INTERVALS structure the chart.

Enum values:
BALANCE_SHEET
HEADING_BREAK
HEADING
PROFIT_AND_LOSS
TOTAL_FROM
TOTAL_INTERVALS
Example: PROFIT_AND_LOSS
accountClassification
​string · enum

Classification of a postable account; required whenever the request sets ledgerType to BALANCE_SHEET or PROFIT_AND_LOSS. Decides which statement the account belongs to and which side a journal-entry line on it pre-selects. It cannot be cleared.

Enum values:
ASSET
LIABILITY
EQUITY
REVENUE
EXPENSE
Example: EXPENSE
controlAccountType
​string | null · enum

Marks a control account. Lines on an ACCOUNTS_RECEIVABLE account need a customerId, lines on an ACCOUNTS_PAYABLE account a supplierId. The classification must fit: receivable is an ASSET, payable a LIABILITY. Null clears it.

Enum values:
ACCOUNTS_RECEIVABLE
ACCOUNTS_PAYABLE
Example: null
debitCredit
​string · enum

The side a journal-entry line on this account pre-selects: debit or credit. Omitted on create, it follows accountClassification (ASSET and EXPENSE pre-select debit, the rest credit); an account with no classification, which only a heading or total account can be, pre-selects debit. It cannot be cleared.

Enum values:
debit
credit
Example: debit
vatCodeId
​string | null

VAT code applied by default to journal-entry lines on this account. Null clears it.

Example: 550e8400-e29b-41d4-a716-446655440000
currency
​string

Currency the account is kept in, as an ISO 4217 code. Applies to a BALANCE_SHEET account only; every other account is kept in the company's base currency and the field is ignored. Moving an account off BALANCE_SHEET resets it to the base currency.

Example: EUR
tags
​string[] · maxItems: 25

Free-form tags for grouping accounts (at most 25, each at most 50 characters)

Example: ["operating"]
mapsTo
​number | null

The account number this account reports under. When set, publicAccountId reports it instead of accountNumber. Null clears it.

Example: 1000
totalFrom
​number

For a TOTAL_FROM account: the first account number to sum from; the total runs up to the account's own number. Required whenever the request sets ledgerType to TOTAL_FROM.

Example: 1000
​AccountInterval[] · maxItems: 50

For a TOTAL_INTERVALS account: the account-number ranges to sum (at most 50). Required whenever the request sets ledgerType to TOTAL_INTERVALS.

UpdateAccountRequest

accountClassification
​string · enum

Classification of a postable account; required whenever the request sets ledgerType to BALANCE_SHEET or PROFIT_AND_LOSS. Decides which statement the account belongs to and which side a journal-entry line on it pre-selects. It cannot be cleared.

Enum values:
ASSET
LIABILITY
EQUITY
REVENUE
EXPENSE
Example: EXPENSE
controlAccountType
​string | null · enum

Marks a control account. Lines on an ACCOUNTS_RECEIVABLE account need a customerId, lines on an ACCOUNTS_PAYABLE account a supplierId. The classification must fit: receivable is an ASSET, payable a LIABILITY. Null clears it.

Enum values:
ACCOUNTS_RECEIVABLE
ACCOUNTS_PAYABLE
Example: null
debitCredit
​string · enum

The side a journal-entry line on this account pre-selects: debit or credit. Omitted on create, it follows accountClassification (ASSET and EXPENSE pre-select debit, the rest credit); an account with no classification, which only a heading or total account can be, pre-selects debit. It cannot be cleared.

Enum values:
debit
credit
Example: debit
vatCodeId
​string | null

VAT code applied by default to journal-entry lines on this account. Null clears it.

Example: 550e8400-e29b-41d4-a716-446655440000
currency
​string

Currency the account is kept in, as an ISO 4217 code. Applies to a BALANCE_SHEET account only; every other account is kept in the company's base currency and the field is ignored. Moving an account off BALANCE_SHEET resets it to the base currency.

Example: EUR
tags
​string[] · maxItems: 25

Free-form tags for grouping accounts (at most 25, each at most 50 characters)

Example: ["operating"]
mapsTo
​number | null

The account number this account reports under. When set, publicAccountId reports it instead of accountNumber. Null clears it.

Example: 1000
totalFrom
​number

For a TOTAL_FROM account: the first account number to sum from; the total runs up to the account's own number. Required whenever the request sets ledgerType to TOTAL_FROM.

Example: 1000
​AccountInterval[] · maxItems: 50

For a TOTAL_INTERVALS account: the account-number ranges to sum (at most 50). Required whenever the request sets ledgerType to TOTAL_INTERVALS.

name
​string

Name of the account

Example: Software subscriptions
accountNumber
​number

Account number, unique within the company

Example: 3120
ledgerType
​string · enum

Kind of account. Setting a postable type requires accountClassification in the same request; setting TOTAL_FROM requires totalFrom, and TOTAL_INTERVALS requires intervals.

Enum values:
BALANCE_SHEET
HEADING_BREAK
HEADING
PROFIT_AND_LOSS
TOTAL_FROM
TOTAL_INTERVALS
Example: PROFIT_AND_LOSS

PublicAuthorityExtractIngestRequest

​object[] · required

The extract items — one object per extract (momsindberetning, erhvervsselvangivelse, udbytteindberetning, e-indkomst, skattekonto, lønsum, …). Each item is stored as received.

sender
​string · maxLength: 64

The delivering system, e.g. 'revibot'.

Example: revibot
batchId
​string · maxLength: 128

The sender's own id for this batch. Folded into the idempotency claim, so an x-api-idempotency-key reused across two DIFFERENT batches is refused (422) instead of silently replaying the first batch's response.

Example: 2026-09-01-run-1

PublicAuthorityExtractIngestResponse

totalCreated
​number · required

Number of extract items stored.

PublicAdvisorAuthorityExtractIngestResponse

totalCreated
​number · required

Number of extract items stored.

unmatchedCvrs
​string[] · required

Distinct CVRs in this batch that are not clients of the firm, as digits only. Their items are stored all the same; a CVR listed here usually means the firm's client list is missing that client.

Example: ["99999999"]
itemsWithoutCvr
​number · required

Items whose cvr was missing or not a registration number. They are stored without a subject.

PublicAdvisorClient

id
​string · required

The id of the firm's own record of the client when it keeps one, else the client's company id. Key a sync on companyNumber and productionUnitNumber together: a client the firm first knows through its company id takes the record's id once the firm records it.

Example: 0199c4d8-7b2e-7f10-9a3c-5e6f7a8b9c0d
companyNumber
​string | null · required

The CVR (Danish company registration number), digits only. Name the client by it when delivering data about it.

Example: 12345678
productionUnitNumber
​string | null · required

The P-number of the office the client is, 10 digits, when the client is one office of a company; null for the whole company. Offices of one company share a companyNumber and differ here.

Example: null
name
​string | null · required
externalClientNumber
​string | null · required

The firm's own client number, when it keeps one.

Example: K-1042
onLedgerBee
​boolean · required

True while the client keeps its books in LedgerBee; false again once it stops.

Example: true
updatedAt
​string · date-time · required

When the client was added to the firm, or the firm's record of it or the client's own company last changed, whichever is later.

Example: 2026-10-01T09:30:00.000Z

PublicListAdvisorClientsResponse

​PublicAdvisorClient[] · required

Clients on this page, sorted by name.

total
​number · required

Total clients matching the query.

Example: 42
limit
​number · required

Clients per page.

Example: 50
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 1

CustomerGroupResponse

id
​string · required

The unique identifier of the customer group

Example: 550e8400-e29b-41d4-a716-446655440000
number
​string · required

Customer group number

Example: 1
name
​string · required

Name of the customer group

Example: Domestic Customers
accountId
​string

The ledger account ID associated with this customer group. Present with the customers-read scope; omitted for checkout-only keys.

Example: 550e8400-e29b-41d4-a716-446655440001
accountNumber
​number

The ledger account number associated with this customer group

Example: 1100
accountName
​string

The ledger account name associated with this customer group

Example: Trade Debtors
​object

Key-value metadata attached to the customer group

Example: {"segment":"enterprise"}
discount
​number · deprecated

Deprecated - always 0. No pricing path applies it. Present with the customers-read scope; omitted for checkout-only keys.

Example: 0

CustomerDepartmentResponse

id
​string · required

The unique identifier of the department

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the department

Example: Headquarters
isDefault
​boolean · required

Whether this is the default department for the customer

Example: true
isActive
​boolean · required

Whether the department is active

Example: true
poNumber
​string

Purchase order number

Example: PO-12345
eanNumber
​string

EAN number for e-invoicing

Example: 5790000000000
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK

CustomerContactResponse

id
​string · required

The unique identifier of the contact

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the contact

Example: John Doe
isDefaultForCustomer
​boolean · required

Whether this is the default contact for the customer

Example: true
email
​string

Email address

Example: john.doe@acme.com
phone
​string

Phone number

Example: +45 12345678

CustomerResponse

id
​string · required

The unique identifier of the customer

Example: 550e8400-e29b-41d4-a716-446655440000
customerNumber
​string · required

Customer number

Example: C001
customerType
​string · enum · required

Customer type

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
name
​string · required

Name of the customer

Example: Acme Corporation
vatZone
​string · enum · required

VAT zone classification

Enum values:
domestic
eu
abroad
domestic_without_vat
eu_at
eu_be
eu_bg
eu_cy
Example: domestic
customerGroupId
​string · required

Customer group ID

Example: 550e8400-e29b-41d4-a716-446655440001
isActive
​boolean · required

Whether the customer is active

Example: true
billingRelationship
​string · enum · required

Billing relationship. self = this customer is billed directly. parent_pays = the parent customer (set via parentCustomerId) is billed instead.

Enum values:
self
parent_pays
Example: self
includeChildDetailsPdf
​boolean · required

Whether to attach a zip of per-child detail PDFs when sending consolidated invoices. Only relevant for parent customers in single_invoice mode.

Example: false
selfServiceDetailsEnabled
​boolean · required

Whether this customer's portal users may fill in their own billing details (VAT number, street, postal code, city), both on the portal's Company settings page and during checkout, instead of only confirming a read-only copy of the record. Country and customer type stay operator-owned either way, which is what keeps them inside the VAT regime the operator assigned.

Example: false
customerGroupNumber
​string

Customer group number

Example: 1
customerGroupName
​string

Customer group name

Example: Domestic Customers
email
​string

Email address

Example: contact@acme.com
phone
​string

Phone number

Example: +45 12345678
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK
vatNumber
​string

VAT registration number

Example: DK12345678
website
​string

Website URL

Example: https://acme.com
externalSystemId
​string

External system identifier for tracking the customer across other systems

Example: crm-12345
eanNumber
​string

EAN number for e-invoicing. Absent when the customer has none.

Example: 5790000000001
creditLimit
​number

Credit limit

Example: 50000
openingBalance
​number

Opening balance in the company base currency (signed: positive = the customer owes us)

Example: 1000
paymentTerms
​number

Payment terms in days

Example: 30
paymentTermType
​string · enum

Payment term type

Enum values:
NET_DAYS
CASH
RUNNING_MONTH_PLUS_DAYS
Example: NET_DAYS
defaultCurrency
​string

Default currency code

Example: DKK
parentCustomerId
​string | null

Parent customer ID. When set, this customer is a child in a parent-child billing relationship. Set together with billingRelationship to change how this customer is billed.

Example: 550e8400-e29b-41d4-a716-446655440000
consolidationMode
​string | null · enum

Consolidation mode for a parent customer. single_invoice = all child subscriptions are consolidated onto one parent invoice on billingDay. per_child_invoice = each child receives its own invoice. Only meaningful on parent customers.

Enum values:
single_invoice
per_child_invoice
billingDay
​number | null

Day of month (1-28) when the parent consolidated invoice is generated. Required for single_invoice consolidation mode.

Example: 1
parentInvoiceTemplateId
​string | null

Parent single invoice PDF template override

​object

Key-value metadata attached to the customer

Example: {"crmSegment":"enterprise","accountOwner":"jane"}

PublicListCustomersResponse

​CustomerResponse[] · required

Customers on this page

total
​number · required

Total customers matching the query

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

CreateCustomerRequest

customerType
​string · enum · required

Specifies whether the customer is a business or a private person

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
Default: BUSINESS
name
​string · required

Customer name

Example: Acme Corporation
vatZone
​string · enum · required

VAT zone classification

Enum values:
domestic
eu
abroad
domestic_without_vat
eu_at
eu_be
eu_bg
eu_cy
Example: domestic
customerGroupId
​string · required

Customer group ID

Example: 550e8400-e29b-41d4-a716-446655440001
countryCode
​string · required

Two-letter country code

Example: DK
defaultCurrency
​string · pattern: ^[A-Za-z]{3}$ · required

The currency this customer is invoiced in, ISO 4217 alpha-3.

Example: DKK
customerNumber
​string

Unique customer number. Omit it, or send an empty value, to have the next number assigned from the company customer sequence; the assigned number comes back on the response.

Example: 1042
email
​string

Email address

Example: contact@acme.com
phone
​string

Phone number

Example: +45 12345678
address
​string · maxLength: 510

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
vatNumber
​string

VAT registration number

Example: DK12345678
website
​string

Website URL

Example: https://acme.com
externalSystemId
​string

External system identifier for tracking the customer across other systems

Example: crm-12345
eanNumber
​string · maxLength: 15

EAN number for e-invoicing. Digits only.

Example: 5790000000001
notes
​string

Additional notes

Example: Key account customer
creditLimit
​number · min: 0

Credit limit

Example: 50000
openingBalance
​number

Opening balance in the company base currency, seeding receivables that predate LedgerBee. Signed: positive = the customer owes us, negative = a credit position.

Example: 1000
paymentTerms
​number · min: 0

Payment terms in days

Example: 30
paymentTermType
​string · enum

Payment term type

Enum values:
NET_DAYS
CASH
RUNNING_MONTH_PLUS_DAYS
Example: NET_DAYS
isActive
​boolean

Whether the customer is active

Example: true
Default: true
parentCustomerId
​string | null

Parent customer ID. Set when creating this customer as a child in a parent-child billing relationship. Must be combined with billingRelationship = parent_pays to route billing to the parent. Send null to create a standalone customer.

Example: 550e8400-e29b-41d4-a716-446655440000
billingRelationship
​string · enum

Billing relationship. self (default) = this customer is billed directly. parent_pays = the parent customer (set via parentCustomerId) is billed instead.

Enum values:
self
parent_pays
consolidationMode
​string | null · enum

Consolidation mode (parent customers only). single_invoice = all child subscriptions consolidated onto one invoice on billingDay. per_child_invoice = each child receives its own invoice.

Enum values:
single_invoice
per_child_invoice
billingDay
​number | null

Day of month (1-28) for the parent consolidated invoice. Required for single_invoice consolidation.

Example: 1
includeChildDetailsPdf
​boolean

Whether to attach a zip of per-child detail PDFs when sending consolidated invoices

selfServiceDetailsEnabled
​boolean

Whether this customer's portal users may fill in their own billing details (VAT number, street, postal code, city), both on the portal's Company settings page and during checkout, instead of only confirming a read-only copy of the record. Country and customer type stay operator-owned either way, which is what keeps them inside the VAT regime the operator assigned.

Example: false
parentInvoiceTemplateId
​string | null

Parent single invoice PDF template override. Send null to clear.

​object

Key-value metadata to attach to the customer. At most 50 entries; keys up to 128 characters, string values up to 500 characters.

Example: {"crmSegment":"enterprise"}

CreateCustomerResponse

id
​string · required

The unique identifier of the created customer

Example: 550e8400-e29b-41d4-a716-446655440000
customerNumber
​string · required

Customer number

Example: C001

SubscriptionTransitionItem

customerSubscriptionId
​string · required

The subscription to move onto the new billing arrangement: the id GET /v1/subscriptions returns, the same stable id every subscription endpoint takes.

Example: 550e8400-e29b-41d4-a716-446655440000

UpdateCustomerRequest

customerType
​string · enum

Customer type

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
customerNumber
​string

Unique customer number

Example: C001
name
​string

Customer name

Example: Acme Corporation
vatZone
​string · enum

VAT zone classification

Enum values:
domestic
eu
abroad
domestic_without_vat
eu_at
eu_be
eu_bg
eu_cy
Example: domestic
customerGroupId
​string

Customer group ID

Example: 550e8400-e29b-41d4-a716-446655440001
email
​string | null

Email address. Send null or empty string to clear.

Example: contact@acme.com
phone
​string

Phone number

Example: +45 12345678
address
​string · maxLength: 510

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code

Example: DK
vatNumber
​string

VAT registration number

Example: DK12345678
website
​string

Website URL

Example: https://acme.com
externalSystemId
​string

External system identifier for tracking the customer across other systems

Example: crm-12345
eanNumber
​string | null · maxLength: 15

EAN number for e-invoicing. Digits only. Send null or empty string to clear.

Example: 5790000000001
notes
​string

Additional notes

Example: Key account customer
creditLimit
​number · min: 0

Credit limit

Example: 50000
openingBalance
​number

Opening balance in the company base currency, seeding receivables that predate LedgerBee. Signed: positive = the customer owes us, negative = a credit position.

Example: 1000
paymentTerms
​number · min: 0

Payment terms in days

Example: 30
paymentTermType
​string · enum

Payment term type

Enum values:
NET_DAYS
CASH
RUNNING_MONTH_PLUS_DAYS
Example: NET_DAYS
defaultCurrency
​string · pattern: ^[A-Za-z]{3}$

The currency this customer is invoiced in, ISO 4217 alpha-3. Omit it, or send a blank one, to leave the stored currency alone.

Example: DKK
isActive
​boolean

Whether the customer is active

Example: true
parentCustomerId
​string | null

Parent customer ID. Send null to detach from parent. Changing this field on a customer with active subscriptions will transition those subscriptions to the parent's billing day with a clean cut at today's date: advance-billed subscriptions receive a credit note for the remaining days of the current period, and arrears-billed subscriptions are invoiced up to the transition date. When transitioning, subscriptionTransitions must list every active subscription on this customer as explicit acknowledgement that they will be migrated.

Example: 550e8400-e29b-41d4-a716-446655440000
billingRelationship
​string · enum

Billing relationship. Change to parent_pays together with parentCustomerId to route billing to the parent.

Enum values:
self
parent_pays
consolidationMode
​string | null · enum

Consolidation mode (parent customers only). Send null to clear.

Enum values:
single_invoice
per_child_invoice
billingDay
​number | null

Day of month (1-28) for the parent consolidated invoice. Send null to clear.

Example: 1
includeChildDetailsPdf
​boolean

Whether to attach a zip of per-child detail PDFs when sending consolidated invoices

selfServiceDetailsEnabled
​boolean

Whether this customer's portal users may fill in their own billing details (VAT number, street, postal code, city), both on the portal's Company settings page and during checkout, instead of only confirming a read-only copy of the record. Country and customer type stay operator-owned either way, which is what keeps them inside the VAT regime the operator assigned.

Example: false
parentInvoiceTemplateId
​string | null

Parent single invoice PDF template override. Send null to clear.

​SubscriptionTransitionItem[]

Subscription transitions — required when changing parentCustomerId, billingRelationship, or consolidationMode on a customer with active subscriptions, and when changing billingDay or consolidationMode on a single_invoice parent (then it must cover every child customer's subscriptions). Lists every active subscription as explicit acknowledgement that each one is migrated to the new billing arrangement with a clean cut at today's date. Entries for subscriptions that need no transition are accepted and ignored.

​object

Key-value metadata. When provided, REPLACES the customer metadata wholesale — send the complete desired map; an empty object clears all entries. Omit the field to leave metadata unchanged. At most 50 entries; keys up to 128 characters, string values up to 500 characters.

Example: {"crmSegment":"enterprise"}

DeleteCustomerResponse

id
​string · required

The unique identifier of the customer

Example: 550e8400-e29b-41d4-a716-446655440000
customerNumber
​string · required

Customer number

Example: C001
result
​string · enum · required

DELETED when the customer had no history and is gone. DEACTIVATED when bookings, invoices or subscriptions kept it: it stays readable with isActive: false, so its history is intact.

Enum values:
DELETED
DEACTIVATED
Example: DELETED

DimensionValue

id
​string · required

Unique identifier of the dimension value

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · minLength: 2 · maxLength: 255 · required

Display name of the dimension value

Example: Marketing
parentId
​string | null

Parent dimension value ID for hierarchical structures. Null for root-level values. Use this to create nested structures like "Sales > Europe > Denmark".

Example: 550e8400-e29b-41d4-a716-446655440001
​DimensionValue[]

Child dimension values (nested structure). Only populated in list responses.

Dimension

id
​string · required

Unique identifier of the dimension category

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · minLength: 2 · maxLength: 255 · required

Display name of the dimension category

Example: Department
isUnique
​boolean · required

When true, only one value from this dimension can be assigned to a journal entry (mutually exclusive). When false, multiple values can be assigned (additive tags). Example: A "Department" dimension is typically unique (one department per entry), while a "Tags" dimension might allow multiple values.

Example: true
​DimensionValue[] · required

Available dimension values within this category, organized as a hierarchical tree. Root values have parentId as null, nested values reference their parent.

requiredOnAccountIds
​string[] · required

IDs of the accounts that require this dimension: every journal entry line posting to one of them must carry a value from this dimension, or the entry is refused with JOURNAL_TAG_REQUIRED_DIMENSION_MISSING. Empty when no account requires it.

Example: ["0192f3a4-5b6c-7d8e-9f01-23456789abcd"]

PublicDimensionValueListItem

id
​string · required

Unique identifier of the dimension value

name
​string · required

Name of the value

Example: Marketing
parentId
​string

Parent value id for hierarchical dimensions. Absent on root values. Rebuild the tree client-side.

PublicListDimensionValuesResponse

​PublicDimensionValueListItem[] · required

Dimension values as a FLAT page ordered by name; use parentId to rebuild hierarchy

total
​number · required

Total number of values in this dimension

Example: 240
page
​number · required

Current page number (1-indexed)

Example: 1
limit
​number · required

Maximum number of items per page

Example: 100
totalPages
​number · required

Total number of pages available

Example: 3

PublicDistributionKeyAllocation

valueId
​string · required

The dimension value this share is allocated to

valueName
​string · required

Name of the target dimension value

Example: Marketing
percentage
​number · required

Share of the amount, in percent with up to six decimal places. All shares sum to exactly 100.

Example: 66.666667
sortOrder
​number · required

Display order of the allocation row (0-based)

Example: 0

PublicDistributionKey

id
​string · required

Unique identifier of the distribution key

name
​string · required

Display name

Example: 70/30 Sales split
isAdHoc
​boolean · required

True for a one-document split created inline on a draft. Ad-hoc keys are excluded from listings unless includeAdHoc=true, and their lifecycle is system-managed.

isActive
​boolean · required

False once the key is archived (a posted ad-hoc key archives automatically)

​PublicDistributionKeyAllocation[] · required

The allocations, in display order. Percentages sum to exactly 100.

PublicListDistributionKeysResponse

​PublicDistributionKey[] · required

Distribution keys, ordered by name

total
​number · required

Total number of keys matching the query

Example: 3
page
​number · required

Current page number (1-indexed)

Example: 1
limit
​number · required

Maximum number of items per page

Example: 25
totalPages
​number · required

Total number of pages available

Example: 1

PublicCreateDistributionKeyAllocation

valueId
​string · required

The dimension value to allocate to. Must belong to this dimension.

percentage
​number · min: 0.000001 · max: 100 · required

Share in percent, up to six decimal places. All allocations must sum to exactly 100.

Example: 33.333333
sortOrder
​number · required

Display order of the allocation row (0-based)

Example: 0

PublicCreateDistributionKey

​PublicCreateDistributionKeyAllocation[] · required

Allocations that must sum to exactly 100%. Between 2 and 100 entries.

name
​string · maxLength: 120

Display name. Required for a reusable key; omit it on an ad-hoc key, which names itself from its allocations server-side.

Example: 70/30 Sales split
isAdHoc
​boolean

True to create a one-document split. Ad-hoc keys are hidden from listings by default and their lifecycle is system-managed: archived when the document they are applied to posts, deleted with the draft that owned them, and swept if left orphaned. Reference the returned id from a draft’s tagIds to apply the split.

Default: false

CreateDimensionRequest

name
​string · minLength: 2 · maxLength: 255 · required

Display name for the dimension category. Must be unique within your company. Choose a descriptive name that clearly indicates the categorization purpose.

Example: Cost Center
isUnique
​boolean · required

Whether only one value from this dimension can be assigned to a journal entry. Set to true for mutually exclusive categories (e.g., Department - an entry belongs to exactly one department). Set to false for additive tags (e.g., Tags - an entry can have multiple tags). This constraint is enforced when assigning dimension values to journal entries, and it is fixed once the category is created.

Example: true

DimensionResponse

id
​string · required

Unique identifier of the created/updated dimension category

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Display name of the dimension category

Example: Department
isUnique
​boolean · required

Whether only one value from this dimension can be assigned per journal entry

Example: true
requiredOnAccountIds
​string[] · required

IDs of the accounts that require this dimension on every line posting to them. Empty when no account requires it.

Example: ["0192f3a4-5b6c-7d8e-9f01-23456789abcd"]

UpdateDimensionRequest

name
​string · minLength: 2 · maxLength: 255

New display name for the dimension category. Must be unique within your company. Changing the name does not affect existing dimension value assignments.

Example: Business Unit

CreateDimensionValueRequest

dimensionId
​string · required

ID of the dimension category this value belongs to. The category must exist and belong to your company.

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · minLength: 2 · maxLength: 255 · required

Display name for the dimension value. Must be unique within the dimension category. Choose descriptive names that will be clear when selecting values in the UI.

Example: Marketing
parentId
​string | null

Parent dimension value ID for creating hierarchical structures. Leave null or omit for root-level values. The parent must exist within the same dimension category. Example: Create "Europe" first, then create "Denmark" with parentId set to Europe's ID.

Example: 550e8400-e29b-41d4-a716-446655440001

DimensionValueResponse

id
​string · required

Unique identifier of the created/updated dimension value

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Display name of the dimension value

Example: Marketing
dimensionId
​string · required

ID of the dimension category this value belongs to

Example: 550e8400-e29b-41d4-a716-446655440001
dimensionName
​string · required

Name of the dimension category this value belongs to

Example: Department
dimensionIsUnique
​boolean · required

Whether the parent category enforces single selection

Example: true
parentId
​string | null

Parent dimension value ID, if this is a nested value

Example: 550e8400-e29b-41d4-a716-446655440002

UpdateDimensionValueRequest

name
​string · minLength: 2 · maxLength: 255

New display name for the dimension value. Must be unique within the dimension category. Changing the name does not affect existing journal entry assignments.

Example: Digital Marketing
parentId
​string | null

New parent dimension value ID. Set to null to move to root level. The parent must exist within the same dimension category and cannot create circular references (e.g., A cannot be parent of B if B is already an ancestor of A).

Example: 550e8400-e29b-41d4-a716-446655440001

AttachmentRequest

filename
​string · maxLength: 255 · required

Filename with extension

Example: invoice.pdf
content
​string · required

Base64-encoded file content. Note: Base64 encoding adds ~33% overhead. Individual files should not exceed 10MB before encoding.

Example: JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC...
mimeType
​string · enum · required

MIME type of the file

Enum values:
application/pdf
image/jpeg
image/png
image/heic
image/heif
image/bmp
image/tiff
application/zip
Example: application/pdf

DraftSplitEntryLine

type
​string · enum · required

Transaction type for this line (debit or credit)

Enum values:
debit
credit
Example: debit
amount
​number · required

Amount for this line (must be non-negative)

Example: 500
accountId
​string

Account ID for this line (UUID). Optional for drafts — empty lines (type + amount with no account) are persisted as placeholders and must be completed in the platform UI before booking. Cannot be a heading or total account when provided.

Example: 550e8400-e29b-41d4-a716-446655440000
vatCodeId
​string

VAT/Tax code ID for this line (UUID)

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string · maxLength: 500

Optional per-line memo (max 500 characters). Persisted on the draft line and carried onto the booked ledger transaction when the draft is booked.

Example: Consulting hours — March
tagIds
​string[]

Dimension tag IDs to attach to this specific line. Per-line tagIds MUST come from single-select (dimension) categories — multi-select tags belong at the entry-level tagIds instead.

Example: ["550e8400-e29b-41d4-a716-446655440003"]

CreateDraftJournalEntryRequest

accountId
​string · required

Primary account ID (UUID). Cannot be a heading or total account. For typed entries (supplier_invoice, customer_invoice, etc.), must have appropriate account classification.

Example: 550e8400-e29b-41d4-a716-446655440000
date
​string · required

Date of the journal entry in YYYY-MM-DD format

Example: 2026-01-15
contraAccountId
​string

Contra 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.

Example: 550e8400-e29b-41d4-a716-446655440001
entryType
​string · enum

Entry 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.

Enum values:
journal
invoice
payment
supplier_invoice
supplier_payment
customer_invoice
customer_payment
Example: supplier_invoice
Default: journal
type
​string · enum

Transaction type (debit or credit)

Enum values:
debit
credit
Example: debit
Default: debit
description
​string · maxLength: 2000

Description of the journal entry

Example: Office supplies purchase
reference
​string

Reference number or identifier

Example: REF-2026-001
customerId
​string

Customer ID (UUID) for customer-related entries

Example: 550e8400-e29b-41d4-a716-446655440002
supplierId
​string

Supplier ID (UUID). Required for supplier_invoice / supplier_payment entry types, and for any posting that touches an accounts-payable control account.

Example: 550e8400-e29b-41d4-a716-446655440003
tagIds
​string[]

Tag/Dimension IDs to attach to the journal entry

Example: ["550e8400-e29b-41d4-a716-446655440003"]
vatCodeId
​string

VAT/Tax code ID (UUID). Applied to the primary account unless split entries are used.

Example: 550e8400-e29b-41d4-a716-446655440000
​AttachmentRequest[] · maxItems: 10

File attachments (base64-encoded). Maximum 10 attachments per entry. Total request size limit is 15MB.

originalAmount
​number

The 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.

Example: 1000
originalCurrency
​string | null · minLength: 3 · maxLength: 3 · pattern: ^[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.

Example: EUR
​DraftSplitEntryLine[] · minItems: 2 · maxItems: 50

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.

externalSystemId
​string · maxLength: 255

Your 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.

Example: erp-7f3a2c91
vendorId
​string · deprecated

Deprecated — use supplierId. Legacy alias for the supplier reference; still accepted, but sending both supplierId and vendorId with different values returns 400.

Example: 550e8400-e29b-41d4-a716-446655440003
amount
​number · deprecated

Deprecated — use originalAmount. The same figure under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.

Example: 1000
currency
​string | null · minLength: 3 · maxLength: 3 · deprecated · pattern: ^[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.

Example: EUR

CreateDraftJournalEntryBatchRequest

​CreateDraftJournalEntryRequest[] · minItems: 1 · maxItems: 100 · required

Array of draft journal entries to create (1-100 entries per batch)

DraftJournalEntryLine

type
​string · enum · required

Which side of the entry this line sits on

Enum values:
debit
credit
Example: debit
accountId
​string

Account this line posts to. Absent on a placeholder line — one persisted with an amount and a side but no account yet, which must be completed before the draft can be booked.

Example: 550e8400-e29b-41d4-a716-446655440000
amount
​number

Amount for this line in the draft's own currency, the one originalCurrency names. Absent on a line persisted without one, which must be completed before the draft can be booked — reported as absent rather than as 0, so an unfinished line is never mistaken for a zero-value one.

Example: 500
vatCodeId
​string

VAT/Tax code ID

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string

Per-line memo

Example: Consulting hours - March
tagIds
​string[]

Tag/Dimension IDs attached to this line. Per-line dimensions override the entry-level tagIds on this specific ledger transaction.

DraftSplitEntryLineResponse

accountId
​string · required

Account ID

Example: 550e8400-e29b-41d4-a716-446655440000
type
​string · required

Transaction type (debit or credit)

Example: debit
amount
​number · required

Amount for this line in transaction currency

Example: 500
vatCodeId
​string

VAT/Tax code ID

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string

Per-line memo

Example: Consulting hours — March
tagIds
​string[]

Tag/Dimension IDs attached to this line. Per-line dimensions override the entry-level tagIds on this specific ledger transaction.

DraftJournalEntryResponse

id
​string · required

Draft journal entry ID

Example: 550e8400-e29b-41d4-a716-446655440000
date
​string · required

Date in YYYY-MM-DD format

Example: 2026-01-15
baseCurrencyAmount
​number · required

How 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.

Example: 7450
originalAmount
​number · required

How 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.

Example: 1000
originalCurrency
​string · required

The 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.

Example: EUR
journalType
​string · required

Journal type

Example: JOURNAL_ENTRY
journalCategoryId
​string | null · uuid · required

ID 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.

Example: 550e8400-e29b-41d4-a716-446655440004
​DraftJournalEntryLine[] · required

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.

status
​string · required

Always "DRAFT" for draft journal entries

Example: DRAFT
createdAt
​string · required

Creation timestamp

Example: 2026-01-15T10:30:00.000Z
updatedAt
​string · required

Last update timestamp

Example: 2026-01-15T10:30:00.000Z
documentDate
​string | null

Document date (date on the invoice/voucher). Null when not set.

Example: 2026-01-15
dueDate
​string | null

Due 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.

Example: 2026-02-14
originalCurrencyToBaseCurrencyExchangeRate
​number | null

What 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.

Example: 7.45
originalCurrencyToBaseCurrencyExchangeRateDate
​string | null

Date the originalCurrencyToBaseCurrencyExchangeRate was captured for. Null whenever that rate is.

Example: 2026-01-15
description
​string

Description

Example: Office supplies purchase
reference
​string

Reference number

Example: REF-2026-001
externalSystemId
​string | null

Your own system's id for this draft, when set. Not unique. null when unset or cleared.

Example: erp-7f3a2c91
type
​string

Transaction type (debit or credit)

Example: debit
accountId
​string

Primary account ID

Example: 550e8400-e29b-41d4-a716-446655440000
contraAccountId
​string

Contra account ID

Example: 550e8400-e29b-41d4-a716-446655440001
customerId
​string

Customer ID

Example: 550e8400-e29b-41d4-a716-446655440002
supplierId
​string

Supplier ID

Example: 550e8400-e29b-41d4-a716-446655440003
vatCodeId
​string

VAT/Tax code ID

Example: 550e8400-e29b-41d4-a716-446655440000
tagIds
​string[]

Tag/Dimension IDs

documentRefs
​string[]

Document IDs attached to the draft

amount
​number · deprecated

Deprecated — 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.

Example: 7450
currency
​string · deprecated

Deprecated — use originalCurrency, which carries the same value. The currency the draft was entered in.

Example: EUR
exchangeRate
​number | null · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRate, which carries the same value.

Example: 7.45
exchangeRateDate
​string | null · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRateDate, which carries the same value.

Example: 2026-01-15
vendorId
​string · deprecated

Deprecated — use supplierId. Legacy alias, emitted with the same value.

Example: 550e8400-e29b-41d4-a716-446655440003
​DraftSplitEntryLineResponse[] · deprecated

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.

CreateDraftJournalEntryBatchResponse

totalCreated
​number · required

Number of draft entries successfully created

Example: 5
​DraftJournalEntryResponse[] · required

Details of all created draft journal entries

ListDraftJournalEntriesResponse

​DraftJournalEntryResponse[] · required

List of draft journal entries

total
​number · required

Total number of matching drafts

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages.

Example: 2

JournalEntryLine

accountId
​string · required

Account this line posts to

Example: 550e8400-e29b-41d4-a716-446655440000
type
​string · enum · required

Which side of the entry this line sits on

Enum values:
debit
credit
Example: debit
accountAmount
​number · required

Amount posted to the account, in that account's own currency (accountCurrency). For an account operating in the company base currency this equals functionalAmount.

Example: 500
accountCurrency
​string · required

The account's operating currency — the currency accountAmount is denominated in.

Example: DKK
functionalAmount
​number · required

Amount posted, converted to the company's base currency. This is the figure to sum when comparing or aggregating across accounts — summing accountAmount across accounts of different currencies would add unlike units.

Example: 500
isVatLine
​boolean · required

True when this line is VAT that the platform derived from another line, rather than a line you posted. Derived VAT lines are included so the lines of an entry balance; vatSourceLineIndex points at the line they came from.

Example: false
originalAmount
​number | null

This line's amount in the entry's originalCurrency — the third currency layer, alongside accountAmount (the account currency) and functionalAmount (the company base). On an entry posted in the base currency all three agree. Do not sum this to get the entry total. It is absent on a derived VAT line — the platform computes VAT in base currency and stores no document figure for it — so the sum falls short by the VAT whenever a line is VAT-coded. Use the entry-level originalAmount for the document total, or sum functionalAmount for the base-currency total. Also absent on historical lines that stored no document amount.

Example: 200
vatSourceLineIndex
​number

Index into this same lines array of the line this VAT was derived from. Set only when isVatLine is true, and omitted in the rare case where the source line is not part of this entry.

Example: 0
vatCodeId
​string

VAT/Tax code in effect for this line. A VAT line derived within this entry stores no code of its own — the code belongs to the line it was derived from — so this reports that source line's code. A VAT line derived from a line in a different entry carries its own code and is reported directly. Absent on a line with no VAT.

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string

Per-line memo, separate from the entry-level description

Example: Consulting hours — March
tagIds
​string[]

Dimension tag IDs attached to this specific line

JournalEntryWarningDetailsDto

accountId
​string

The account the note is about.

Example: 550e8400-e29b-41d4-a716-446655440000

JournalEntryWarningDto

code
​string · enum · required

What the note says. Each value has an en + da translation in the web app.

Enum values:
JOURNAL_ENTRY_YEAR_END_ACCOUNT_POSTED
Example: JOURNAL_ENTRY_YEAR_END_ACCOUNT_POSTED
​JournalEntryWarningDetailsDto

JournalEntryResponse

id
​string · required

Unique identifier of the created journal entry

Example: 550e8400-e29b-41d4-a716-446655440000
entryNumber
​string · required

Entry number assigned to the journal entry

Example: JE-00001
date
​string · required

Date of the journal entry

Example: 2026-01-15
amount
​number · required

Amount 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.

Example: 1000
currency
​string · required

Currency amount is denominated in — the operating currency of that first line's account.

Example: DKK
journalType
​string · required

Journal type

Example: JOURNAL_ENTRY
journalCategoryId
​string | null · uuid · required

ID 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.

Example: 550e8400-e29b-41d4-a716-446655440004
type
​string · required

Transaction type

Example: debit
status
​string · required

Status of the journal entry

Example: POSTED
reversedByEntryId
​string | null · uuid · required

The 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.

Example: null
reversalOfEntryId
​string | null · uuid · required

On a reversal, the id of the entry it reverses; null on every other entry. The entry named here names this one in its reversedByEntryId.

Example: null
accountId
​string · required

One 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.

Example: 550e8400-e29b-41d4-a716-446655440000
createdAt
​string · required

Timestamp when the entry was created

Example: 2026-01-15T10:30:00.000Z
documentDate
​string | null

Document date (date on the invoice/voucher). Null when the entry was booked without one; its VAT period then follows date.

Example: 2026-01-15
dueDate
​string | null

Due 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).

Example: 2026-02-14
originalAmount
​number | null

What 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.

Example: 200
originalCurrency
​string | null

The 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.

Example: EUR
originalCurrencyToBaseCurrencyExchangeRate
​number | null

Rate 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.

Example: 7.45
originalCurrencyToBaseCurrencyExchangeRateDate
​string | null

Date 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.

Example: 2026-01-15
description
​string

Description of the journal entry

Example: Office supplies purchase
reference
​string

Reference number

Example: REF-2026-001
externalSystemId
​string

Your own system's id for this entry, when set. Not unique — several entries may share one id.

Example: erp-7f3a2c91
contraAccountId
​string

The 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.

Example: 550e8400-e29b-41d4-a716-446655440001
​JournalEntryLine[]

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.

customerId
​string

Customer ID if applicable

Example: 550e8400-e29b-41d4-a716-446655440002
supplierId
​string

Supplier ID if applicable

Example: 550e8400-e29b-41d4-a716-446655440003
vatCodeId
​string

VAT/Tax code on the line accountId names, if it has one. Lines can carry different codes — read lines[].vatCodeId for the per-line codes.

Example: 550e8400-e29b-41d4-a716-446655440000
tagIds
​string[]

Tag IDs attached to the entry as a whole. Per-line dimensions are on lines[].tagIds.

documentRefs
​string[]

Document IDs attached to the entry

​JournalEntryWarningDto[]

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.

exchangeRate
​number | null · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRate, which carries the same value.

Example: 7.45
exchangeRateDate
​string | null · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRateDate, which carries the same value.

Example: 2026-01-15
vendorId
​string · deprecated

Deprecated — use supplierId. Legacy alias, emitted with the same value.

Example: 550e8400-e29b-41d4-a716-446655440003

SplitEntryLine

accountId
​string · required

Account ID for this line (UUID). Cannot be a heading or total account.

Example: 550e8400-e29b-41d4-a716-446655440000
type
​string · enum · required

Transaction type for this line (debit or credit)

Enum values:
debit
credit
Example: debit
amount
​number · required

Amount for this line (must be non-negative)

Example: 500
vatCodeId
​string

VAT/Tax code ID for this line (UUID)

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string · maxLength: 500

Optional per-line memo (max 500 characters). Stored on the booked ledger transaction for this line, separate from the entry-level description.

Example: Consulting hours — March
tagIds
​string[]

Dimension tag IDs to attach to this specific line. Per-line tagIds MUST come from single-select (dimension) categories — multi-select tags belong at the entry-level tagIds instead. Each dimension category may appear at most once per line. The booked ledger transaction is tagged with these IDs and VAT derivatives inherit automatically. Validation: a non-dimension tag rejects with JOURNAL_TAG_LINE_TAG_NOT_A_DIMENSION; a repeated category rejects with JOURNAL_TAG_DUPLICATE_LINE_DIMENSION_CATEGORY.

Example: ["550e8400-e29b-41d4-a716-446655440003"]

CreateDraftJournalEntryV2Request

entryType
​string · enum · required

Journal type. For CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE / SUPPLIER_PAYMENT the AR/AP leg is appended automatically; do not include it in lines.

Enum values:
journal
invoice
payment
supplier_invoice
supplier_payment
customer_invoice
customer_payment
date
​string · required

Posting date (YYYY-MM-DD).

originalAmount
​number · required

Face value of the document — what the counterparty is invoiced or pays. NOT the sum of lines. On CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE / SUPPLIER_PAYMENT this value IS the appended AR/AP leg (its absolute value), so an account that appears on both sides of the entry — a clearing or pass-through account — must not be counted into it. Sign carries direction: positive = invoice / payment, negative = credit-note / refund.

​SplitEntryLine[] · minItems: 1 · maxItems: 1000 · required

Counter-side lines (revenue / expense / bank / outlay). For locked types do NOT include the AR/AP leg. The cap is per ENTRY, not per request or per journal category — nothing accumulates across entries, so a company with many unposted drafts is never refused for that reason.

documentDate
​string | null

Document date (YYYY-MM-DD): the date printed on the invoice or voucher. The VAT period follows it, so a supplier invoice dated 28 March and booked on 3 April lands in March. Omit it and the entry has no document date of its own; its VAT period then follows date. null is read as omitted.

Example: 2026-03-28
dueDate
​string | null

Due date (YYYY-MM-DD) of a customer or supplier invoice, used exactly as sent. Omit it and the due date is calculated from the customer's or supplier's payment term (else the company default), counted from documentDate when sent and from date otherwise. Accepted only on customer_invoice, supplier_invoice and the deprecated invoice, and only with a reference, which is what registers the invoice the due date belongs to. Sent on any other entry type, it is refused with 400 JOURNAL_ENTRY_DUE_DATE_NOT_ALLOWED; sent without a reference, with 400 JOURNAL_ENTRY_DUE_DATE_REQUIRES_REFERENCE. null is read as omitted.

Example: 2026-04-27
customerId
​string

Customer reference. Required for CUSTOMER_* types.

supplierId
​string

Supplier reference. Required for SUPPLIER_* types.

description
​string · maxLength: 2000

Optional human-readable description.

reference
​string

Invoice number / external reference. On CUSTOMER_PAYMENT it names the invoice being paid, and the appended receivable leg follows where that invoice was booked: on the one account it sits on, which is the customer group account unless the invoice lines sent the receivable elsewhere (a deposit invoice). An invoice owed across several receivable accounts is cleared one leg per account when the payment pays everything it still has open; a part payment of such an invoice is refused with JOURNAL_ENTRY_RECEIVABLE_SPLIT_REQUIRED, because nothing here states which account it clears and it is never divided in proportion.

externalSystemId
​string · maxLength: 255

Your 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.

Example: erp-7f3a2c91
tagIds
​string[]

Tag IDs applied at the entry level.

journalCategoryId
​string

Journal category ID (UUID). Must belong to the API key's app company; cross-tenant or unknown IDs are rejected with 400 JOURNAL_CATEGORY_NOT_FOUND. When omitted the entry uses the company's default category.

​AttachmentRequest[] · maxItems: 10

Inline file attachments (base64-encoded). Same shape and limits as v1: maximum 10 attachments per entry, a 10MB ceiling on each file measured AFTER base64 decoding (over it is rejected with DOCUMENT_UPLOAD_FILE_TOO_LARGE), and a 15MB ceiling on the total request body (JSON + base64 payload). Either can be the binding one: base64 inflates a payload by about a third, so two 6MB files each clear the per-file bound and exceed the request one. Each attachment becomes a Document linked to the created journal entry — equivalent to what GET /api/v1/journal-entries/:id/attachments returns. An invalid MIME type rejects at DTO validation with 400 SHARED_VALIDATION_FAILED; malformed base64 reaches the service and rejects with 400 JOURNAL_ENTRY_INVALID_ATTACHMENT_TYPE. Either rejects the whole entry, and in a batch the whole batch rolls back.

originalCurrency
​string | null · minLength: 3 · maxLength: 3 · pattern: ^[A-Za-z]{3}$

ISO 4217 alpha-3 code of the currency the draft is entered in; originalAmount and lines[].amount are in this currency. Omitted under both names, the draft is in your company base currency.

Example: EUR
originalCurrencyToBaseCurrencyExchangeRate
​number

What one unit of originalCurrency is worth in your company base currency, e.g. 7.4612 for EUR to DKK. Must be greater than zero; a non-positive rate is rejected whatever the draft currency. Omit it and exchangeRate to have the rate resolved from the rate feed at the posting date. Not applied when the draft is already in your company base currency, where the conversion is the identity.

Example: 7.4612
vendorId
​string · deprecated

Deprecated — use supplierId. Legacy alias; sending both with different values returns 400.

currency
​string | null · minLength: 3 · maxLength: 3 · deprecated · pattern: ^[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.

Example: EUR
exchangeRate
​number · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRate. The same rate under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.

Example: 7.4612

CreateDraftJournalEntryV2BatchRequest

​CreateDraftJournalEntryV2Request[] · minItems: 1 · maxItems: 100 · required

Array of 1–100 draft journal entries, carrying at most 10000 lines in total across the batch. Wrapped in a single transaction; one bad entry rolls back the whole batch.

CreateDraftJournalEntryV2BatchResponse

totalCreated
​number · required

Number of drafts created (= entries.length on success).

​DraftJournalEntryResponse[] · required

Created draft journal entries, ordered to match the request entries[].

UpdateDraftJournalEntryV2Request

date
​string

Posting date (YYYY-MM-DD).

documentDate
​string | null

Document date (YYYY-MM-DD). null clears it, so the VAT period follows date again; omitting the field keeps it.

Example: 2026-03-28
dueDate
​string | null

Due date (YYYY-MM-DD) of a customer or supplier invoice draft. null clears it, so booking calculates one from the payment term again; omitting the field keeps it. The same rules as on create apply: refused on other entry types (JOURNAL_ENTRY_DUE_DATE_NOT_ALLOWED) and on a draft without a reference (JOURNAL_ENTRY_DUE_DATE_REQUIRES_REFERENCE).

Example: 2026-04-27
originalAmount
​number

Face value of the document — what the counterparty is invoiced or pays. NOT the sum of lines. On CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE / SUPPLIER_PAYMENT this value IS the appended AR/AP leg (its absolute value), so an account that appears on both sides of the entry — a clearing or pass-through account — must not be counted into it. Sign carries direction: positive = invoice / payment, negative = credit-note / refund.

customerId
​string | null · uuid

Customer reference. null clears it; omitting keeps it. Changing it reshapes the entry — requires lines and re-runs the per-entryType validation (CUSTOMER_* types cannot clear their counterparty).

supplierId
​string | null · uuid

Supplier reference. null clears it; omitting keeps it. Changing it reshapes the entry — requires lines and re-runs the per-entryType validation (SUPPLIER_* types cannot clear their counterparty).

description
​string · maxLength: 2000

Optional human-readable description.

reference
​string

Invoice number / external reference. On CUSTOMER_PAYMENT it names the invoice being paid, and the appended receivable leg follows where that invoice was booked: on the one account it sits on, which is the customer group account unless the invoice lines sent the receivable elsewhere (a deposit invoice). An invoice owed across several receivable accounts is cleared one leg per account when the payment pays everything it still has open; a part payment of such an invoice is refused with JOURNAL_ENTRY_RECEIVABLE_SPLIT_REQUIRED, because nothing here states which account it clears and it is never divided in proportion.

externalSystemId
​string | null · maxLength: 255

Your own system's id. null clears the value; omitting the field keeps it.

Example: erp-7f3a2c91
​SplitEntryLine[] · minItems: 1 · maxItems: 1000

Counter-side lines (revenue / expense / bank / outlay). For locked types do NOT include the AR/AP leg. The cap is per ENTRY, not per request or per journal category — nothing accumulates across entries, so a company with many unposted drafts is never refused for that reason.

tagIds
​string[]

Tag IDs applied at the entry level.

journalCategoryId
​string

Journal category ID (UUID). Must belong to the API key's app company; cross-tenant or unknown IDs are rejected with 400 JOURNAL_CATEGORY_NOT_FOUND. When omitted the entry uses the company's default category.

originalCurrency
​string | null · minLength: 3 · maxLength: 3 · pattern: ^[A-Za-z]{3}$

ISO 4217 alpha-3 code of the currency the draft is entered in. Omitting it under both names keeps the stored one.

Example: EUR
originalCurrencyToBaseCurrencyExchangeRate
​number

What one unit of originalCurrency is worth in your company base currency, e.g. 7.4612 for EUR to DKK. Must be greater than zero; a non-positive rate is rejected whatever the draft currency. Omit it and exchangeRate to have the rate resolved from the rate feed at the posting date. Not applied when the draft is already in your company base currency, where the conversion is the identity.

Example: 7.4612
vendorId
​string | null · uuid · deprecated

Deprecated — use supplierId. Legacy alias for the supplier reference (null clears it); sending both supplierId and vendorId with different values returns 400.

currency
​string | null · minLength: 3 · maxLength: 3 · deprecated · pattern: ^[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.

Example: EUR
exchangeRate
​number · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRate. The same rate under its old name. Sending both with different values returns 400 DRAFT_DEPRECATED_FIELD_CONFLICT.

Example: 7.4612

JournalEntryAttachmentResponse

id
​string · required

Unique identifier of the attachment/document

Example: 550e8400-e29b-41d4-a716-446655440000
filename
​string · required

Original filename of the attachment

Example: invoice.pdf
contentType
​string · required

MIME type of the attachment

Example: application/pdf
fileSize
​number · required

File size in bytes

Example: 102400
content
​string · required

Base64-encoded file content

Example: JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC...
createdAt
​string · required

Timestamp when the attachment was created

Example: 2026-01-15T10:30:00.000Z

DraftJournalEntryAttachmentsListResponse

draftJournalEntryId
​string · required

Draft journal entry ID the attachments belong to

Example: 550e8400-e29b-41d4-a716-446655440000
​JournalEntryAttachmentResponse[] · required

List of attachments

DraftJournalEntryAttachmentAddedResponse

id
​string · required

ID of the new attachment/document. Pass it to the remove endpoint to take the document off again.

Example: 550e8400-e29b-41d4-a716-446655440000
draftJournalEntryId
​string · required

Draft journal entry ID the attachment was added to

Example: 550e8400-e29b-41d4-a716-446655440000

UpdateJournalEntryRequest

reference
​string · maxLength: 255

Corrected 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.

Example: INV-1042
externalSystemId
​string | null · maxLength: 255

Your 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.

Example: erp-7f3a2c91

UpdateJournalEntryResponse

id
​string · required

Journal entry ID.

Example: 550e8400-e29b-41d4-a716-446655440000
reference
​string | null · required

The reference after the update.

Example: INV-1042
externalSystemId
​string | null · required

The external system id after the update.

Example: erp-7f3a2c91

ReverseJournalEntryRequest

journalEntryId
​string · required

UUID of the posted journal entry to reverse.

Example: 550e8400-e29b-41d4-a716-446655440000
reversalDate
​string

Date 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.

Example: 2026-06-01
reason
​string · maxLength: 500

Free-text reason appended to the reversal description for audit purposes.

Example: Vendor invoice was duplicated

ReverseJournalEntryResponse

reversalId
​string · required

Unique identifier of the posted reversal journal entry.

Example: 550e8400-e29b-41d4-a716-446655440000

JournalEntryCorrectionPreviewLine

accountNumber
​string · required

Account number the line posts to.

Example: 6200
accountName
​string · required

Account name.

Example: Brændstof
amount
​number · required

Line amount, in the currency named by currency.

Example: 5000
type
​string · enum · required

Which side of the entry the line sits on.

Enum values:
debit
credit
currency
​string · required

The line's currency - its ledger account's own.

Example: DKK
vatCodeName
​string

VAT code applied to the line, when it carries one.

Example: I25
isChanged
​boolean

True when this line differs from the original entry. Only set on a reclassification preview.

isVatTransaction
​boolean

True when the line is a VAT leg generated from another line.

JournalEntryCorrectionPreviewEnteredAs

amount
​number · required

The amount as originally keyed.

Example: 1000
currency
​string · required

The currency it was keyed in.

Example: EUR
exchangeRate
​number · required

The rate it was converted at.

Example: 7.45

JournalEntryCorrectionPreviewEntry

description
​string · required

Description the entry would carry.

Example: Correction of INV-1042
date
​string · required

Date the entry would post on (YYYY-MM-DD).

Example: 2026-06-01
entryType
​string · enum · required

Which entry of the correction this is.

Enum values:
reversal
correction_draft
reclassification
original
isDraft
​boolean · required

True when this entry would be created as a draft rather than posted.

​JournalEntryCorrectionPreviewLine[] · required

The postings the entry would carry.

totalDebit
​number · required

Sum of the debit lines, in totalCurrency.

Example: 5000
totalCredit
​number · required

Sum of the credit lines, in totalCurrency.

Example: 5000
totalCurrency
​string · required

The currency the two totals are stated in. Each line carries its own account's currency, so the totals are summed in the company's base currency and this names it - never read the currency off a line.

Example: DKK
​object

What the operator originally keyed, when that differs from the currency the lines are shown in. Display only.

JournalEntryCorrectionPreviewResponse

​object · required

The reversal that would neutralise the original.

​object

The entry as it stands today, for comparison. Present on a reclassification preview.

​object

The replacement entry. Absent for reverseOnly, which posts no replacement.

BatchReverseJournalEntriesRequest

journalEntryIds
​string[] · minItems: 1 · maxItems: 100 · required

IDs 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.

Example: ["550e8400-e29b-41d4-a716-446655440000","550e8400-e29b-41d4-a716-446655440001"]
reversalDate
​string

Date 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.

Example: 2026-06-01
reason
​string · maxLength: 500

Free-text reason appended to every reversal description for audit purposes.

Example: Bulk reversal of misclassified subscription invoices

BatchReverseJournalEntriesResultItem

originalId
​string · required

Original journal entry ID supplied in the request.

Example: 550e8400-e29b-41d4-a716-446655440000
reversalId
​string · required

Unique identifier of the posted reversal journal entry.

Example: 550e8400-e29b-41d4-a716-446655440010

BatchReverseJournalEntriesResponse

totalReversed
​number · required

Number of reversals posted. Equals the count of unique IDs in the request on success.

Example: 2
​BatchReverseJournalEntriesResultItem[] · required

Result rows pairing each original ID with its newly created reversal ID.

BatchReverseJournalEntriesPreviewItem

originalId
​string · required

Original journal entry ID supplied in the request.

Example: 550e8400-e29b-41d4-a716-446655440000
originalEntryNumber
​string | null · required

Entry number of the original journal entry.

Example: JE-00468
reversalDate
​string · required

Date the reversal would post on (YYYY-MM-DD).

Example: 2026-06-01

BatchReverseJournalEntriesPreviewResponse

totalReversible
​number · required

Number of reversals the batch would post. Equals the count of unique IDs in the request.

Example: 2
​BatchReverseJournalEntriesPreviewItem[] · required

Each original entry the batch would reverse, with the date its reversal would carry.

ReclassifyJournalEntryLine

ledgerTransactionId
​string · required

UUID of the ledger transaction (posting line) to move. Read these from GET /api/v1/journal-entries/{id}.

Example: 550e8400-e29b-41d4-a716-446655440000
newAccountId
​string · required

UUID of the ledger account the line should be posted to instead.

Example: 550e8400-e29b-41d4-a716-446655440001
newVatCodeId
​string | null

UUID of the VAT code to apply to the line. Omit to keep the line's current code; pass null to remove VAT from the line. Changing it re-splits the line's gross amount, so the net posted to the account moves.

Example: 550e8400-e29b-41d4-a716-446655440002

PreviewJournalEntryCorrectionRequest

correctionType
​string · enum · required

Which correction to preview.

Enum values:
reverseOnly
reverseAndCorrect
reclassify
Example: reclassify
correctionDate
​string · pattern: ^\d{4}-\d{2}-\d{2}$

Date the correction posts on (YYYY-MM-DD). When omitted, the correction is dated to the original entry so the pair lands in the same period. Must fall in an open posting period.

Example: 2026-06-01
reason
​string · maxLength: 1700

Free-text reason appended to the correction description for audit purposes.

Example: Booked with 0% VAT instead of 25%
​ReclassifyJournalEntryLine[] · maxItems: 100

Line changes to preview (max 100). Required for reclassify, ignored by the other two types.

ReverseAndCorrectJournalEntryRequest

correctionDate
​string · pattern: ^\d{4}-\d{2}-\d{2}$

Date the correction posts on (YYYY-MM-DD). When omitted, the correction is dated to the original entry so the pair lands in the same period. Must fall in an open posting period.

Example: 2026-06-01
reason
​string · maxLength: 1700

Free-text reason appended to the correction description for audit purposes.

Example: Booked with 0% VAT instead of 25%

ReverseAndCorrectJournalEntryResponse

reversalId
​string · required

Unique identifier of the posted reversal journal entry.

Example: 550e8400-e29b-41d4-a716-446655440000
draftId
​string · required

Unique identifier of the unlocked DRAFT holding the replacement entry. Nothing is posted from it until the draft is booked - edit it via the drafts endpoints, then book it.

Example: 550e8400-e29b-41d4-a716-446655440010

PreviewRecreateJournalEntryResponseDto

originalEntryId
​string · required

Unique identifier of the original entry the reversal undid, which the draft rebuilds.

Example: 550e8400-e29b-41d4-a716-446655440000
draftDate
​string · required

The date the draft would take (YYYY-MM-DD): the document's own date for an invoice or a supplier bill, otherwise today.

Example: 2026-03-01

RecreateJournalEntryResponseDto

draftId
​string · required

Unique identifier of the unlocked DRAFT rebuilding the original. Nothing is posted until the draft is booked.

Example: 550e8400-e29b-41d4-a716-446655440010
originalEntryId
​string · required

Unique identifier of the original entry the reversal undid.

Example: 550e8400-e29b-41d4-a716-446655440000

ReclassifyJournalEntryRequest

​ReclassifyJournalEntryLine[] · minItems: 1 · maxItems: 100 · required

The lines to move (1-100). Lines not listed are copied to the replacement entry unchanged.

correctionDate
​string · pattern: ^\d{4}-\d{2}-\d{2}$

Date the correction posts on (YYYY-MM-DD). When omitted, the correction is dated to the original entry so the pair lands in the same period. Must fall in an open posting period.

Example: 2026-06-01
reason
​string · maxLength: 1700

Free-text reason appended to the correction description for audit purposes.

Example: Booked with 0% VAT instead of 25%

ReclassifyJournalEntryResponse

reversalId
​string · required

Unique identifier of the posted reversal of the original entry.

Example: 550e8400-e29b-41d4-a716-446655440000
newEntryId
​string · required

Unique identifier of the posted replacement entry carrying the new account and VAT coding.

Example: 550e8400-e29b-41d4-a716-446655440010
​JournalEntryWarningDto[]

Notes on the replacement entry, as codes. Present only when there is one: JOURNAL_ENTRY_YEAR_END_ACCOUNT_POSTED when it has a line on the company year-end account and every other line is on a balance-sheet account. A replacement with a line there and an income or expense line is refused with 400 JOURNAL_ENTRY_YEAR_END_ACCOUNT_RESULT_LINE.

ListJournalEntriesResponse

​JournalEntryResponse[] · required

List of journal entries

total
​number · required

Total number of matching entries

Example: 150
limit
​number · required

Number of items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages.

Example: 6

JournalEntryAttachmentsListResponse

journalEntryId
​string · required

Journal entry ID the attachments belong to

Example: 550e8400-e29b-41d4-a716-446655440000
​JournalEntryAttachmentResponse[] · required

List of attachments

JournalEntryAttachmentAddedResponse

id
​string · required

ID of the new attachment/document. Pass it to the remove endpoint to take the document off again.

Example: 550e8400-e29b-41d4-a716-446655440000
journalEntryId
​string · required

Journal entry ID the attachment was added to

Example: 550e8400-e29b-41d4-a716-446655440000

CreateJournalEntryV2Dto

entryType
​string · enum · required

Journal type. For CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE / SUPPLIER_PAYMENT the AR/AP leg is appended automatically; do not include it in lines.

Enum values:
journal
invoice
payment
supplier_invoice
supplier_payment
customer_invoice
customer_payment
date
​string · required

Posting date (YYYY-MM-DD).

originalAmount
​number · required

Face value of the document — what the counterparty is invoiced or pays. NOT the sum of lines. On CUSTOMER_INVOICE / CUSTOMER_PAYMENT / SUPPLIER_INVOICE / SUPPLIER_PAYMENT this value IS the appended AR/AP leg (its absolute value), so an account that appears on both sides of the entry — a clearing or pass-through account — must not be counted into it. Sign carries direction: positive = invoice / payment, negative = credit-note / refund.

​SplitEntryLine[] · minItems: 1 · maxItems: 1000 · required

Counter-side lines (revenue / expense / bank / outlay). For locked types do NOT include the AR/AP leg. The cap is per ENTRY, not per request or per journal category — nothing accumulates across entries, so a company with many unposted drafts is never refused for that reason.

documentDate
​string | null

Document date (YYYY-MM-DD): the date printed on the invoice or voucher. The VAT period follows it, so a supplier invoice dated 28 March and booked on 3 April lands in March. Omit it and the entry has no document date of its own; its VAT period then follows date. null is read as omitted.

Example: 2026-03-28
dueDate
​string | null

Due date (YYYY-MM-DD) of a customer or supplier invoice, used exactly as sent. Omit it and the due date is calculated from the customer's or supplier's payment term (else the company default), counted from documentDate when sent and from date otherwise. Accepted only on customer_invoice, supplier_invoice and the deprecated invoice, and only with a reference, which is what registers the invoice the due date belongs to. Sent on any other entry type, it is refused with 400 JOURNAL_ENTRY_DUE_DATE_NOT_ALLOWED; sent without a reference, with 400 JOURNAL_ENTRY_DUE_DATE_REQUIRES_REFERENCE. null is read as omitted.

Example: 2026-04-27
customerId
​string

Customer reference. Required for CUSTOMER_* types.

supplierId
​string

Supplier reference. Required for SUPPLIER_* types.

description
​string · maxLength: 2000

Optional human-readable description.

reference
​string

Invoice number / external reference. On CUSTOMER_PAYMENT it names the invoice being paid, and the appended receivable leg follows where that invoice was booked: on the one account it sits on, which is the customer group account unless the invoice lines sent the receivable elsewhere (a deposit invoice). An invoice owed across several receivable accounts is cleared one leg per account when the payment pays everything it still has open; a part payment of such an invoice is refused with JOURNAL_ENTRY_RECEIVABLE_SPLIT_REQUIRED, because nothing here states which account it clears and it is never divided in proportion.

externalSystemId
​string · maxLength: 255

Your own system's id for this entry. Leading and trailing whitespace is trimmed before storage, and a value that is only whitespace is stored as no id at all — the list filter trims what it is given too, so an untrimmed value would be stored under an id no lookup could match. It is a lookup key, not a deduplication key: LedgerBee enforces no uniqueness on it and never compares it between requests, so several entries may carry the same id and repeating a request creates another entry. Filter GET /journal-entries by externalSystemId to find what an earlier run posted. For retries that must not post twice, send x-api-idempotency-key.

Example: erp-7f3a2c91
originalCurrency
​string | null · minLength: 3 · maxLength: 3 · pattern: ^[A-Za-z]{3}$

ISO 4217 alpha-3 code of the currency the entry is posted in; originalAmount and lines[].amount are in this currency. Omitted under both names, the entry is posted in your company base currency.

Example: EUR
originalCurrencyToBaseCurrencyExchangeRate
​number

What one unit of originalCurrency is worth in your company base currency, e.g. 7.4612 for EUR to DKK. Must be greater than zero; a non-positive rate is rejected whatever the entry currency, so the same body is accepted or refused identically for every tenant. Omit it and exchangeRate to have the rate resolved from the rate feed at the posting date — supplying one lets an integrator that already converted the amount itself post both legs of a settlement against the same rate. Not applied when the entry is already denominated in the company base currency, where the conversion is the identity. A read of the posted entry returns the rate under this name, and again under the deprecated exchangeRate.

Example: 7.4612
tagIds
​string[]

Tag IDs applied at the entry level.

journalCategoryId
​string

Journal category ID (UUID). Must belong to the API key's app company; cross-tenant or unknown IDs are rejected with 400 JOURNAL_CATEGORY_NOT_FOUND. When omitted the entry uses the company's default category.

​AttachmentRequest[] · maxItems: 10

Inline file attachments (base64-encoded). Same shape and limits as v1: maximum 10 attachments per entry, a 10MB ceiling on each file measured AFTER base64 decoding (over it is rejected with DOCUMENT_UPLOAD_FILE_TOO_LARGE), and a 15MB ceiling on the total request body (JSON + base64 payload). Either can be the binding one: base64 inflates a payload by about a third, so two 6MB files each clear the per-file bound and exceed the request one. Each attachment becomes a Document linked to the created journal entry — equivalent to what GET /api/v1/journal-entries/:id/attachments returns. An invalid MIME type rejects at DTO validation with 400 SHARED_VALIDATION_FAILED; malformed base64 reaches the service and rejects with 400 JOURNAL_ENTRY_INVALID_ATTACHMENT_TYPE. Either rejects the whole entry, and in a batch the whole batch rolls back.

vendorId
​string · deprecated

Deprecated — use supplierId. Legacy alias; sending both with different values returns 400.

currency
​string | null · minLength: 3 · maxLength: 3 · deprecated · pattern: ^[A-Za-z]{3}$

Deprecated — use originalCurrency. The same currency code under its old name. Sending both with different codes returns 400 JOURNAL_ENTRY_DEPRECATED_FIELD_CONFLICT.

Example: EUR
exchangeRate
​number · deprecated

Deprecated — use originalCurrencyToBaseCurrencyExchangeRate. The same rate under its old name. Sending both with different values returns 400 JOURNAL_ENTRY_DEPRECATED_FIELD_CONFLICT.

Example: 7.4612

CreateJournalEntryV2BatchRequest

​CreateJournalEntryV2Dto[] · minItems: 1 · maxItems: 100 · required

Array of 1–100 journal entries, carrying at most 10000 lines in total across the batch. Wrapped in a single transaction; one bad entry rolls back the whole batch.

CreateJournalEntryV2BatchResponse

totalCreated
​number · required

Number of journal entries created (= entries.length on success).

​JournalEntryResponse[] · required

Created journal entries, ordered to match the request entries[].

JournalCategoryResponse

id
​string · required

The unique identifier of the journal category

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the journal category

Example: General Journal
isDefault
​boolean · required

Whether this is the default journal category

Example: true
allowedJournalTypes
​array[] · required

Journal entry types that may be posted into this category. A category created without an explicit list carries all eleven. See the endpoint description for what each value means.

Example: ["JOURNAL_ENTRY","SUPPLIER_INVOICE","SUPPLIER_PAYMENT","CUSTOMER_INVOICE","CUSTOMER_PAYMENT"]

CreateJournalCategoryRequest

name
​string · minLength: 2 · maxLength: 100 · required

Name of the journal category. Must be unique within your company.

Example: Sales
allowedJournalTypes
​string[]

Journal entry types that may be posted into this category. Posting an entry of a type not listed here is rejected. Omit this field to allow every type — the same set a company’s first category is created with. An empty array is rejected: it would describe a category nothing could ever be posted into. See the endpoint description for what each value means and which entryType reaches it. Send the field or leave it out — an explicit null is rejected.

Enum values:
JOURNAL_ENTRY
SUPPLIER_INVOICE
SUPPLIER_PAYMENT
CUSTOMER_INVOICE
CUSTOMER_PAYMENT
CUSTOMER_REMINDER
CURRENCY_REVALUATION
VAT_SETTLEMENT
Example: ["CUSTOMER_INVOICE","CUSTOMER_PAYMENT"]
isDefault
​boolean

Make this the default category. Your company always has exactly one default, so passing true moves the flag off the category that currently holds it. Defaults to false.

Example: false

UpdateJournalCategoryRequest

name
​string · minLength: 2 · maxLength: 100

New name for the journal category. Must be unique within your company.

Example: Sales and refunds
allowedJournalTypes
​string[]

Replaces the set of journal entry types that may be posted into this category. The list cannot be empty, and omitting the field here leaves the current set unchanged (unlike on create, where omitting it means every type). Entries already posted are unaffected.

Enum values:
JOURNAL_ENTRY
SUPPLIER_INVOICE
SUPPLIER_PAYMENT
CUSTOMER_INVOICE
CUSTOMER_PAYMENT
CUSTOMER_REMINDER
CURRENCY_REVALUATION
VAT_SETTLEMENT
Example: ["CUSTOMER_INVOICE","CUSTOMER_PAYMENT"]
isDefault
​boolean

Pass true to make this the default category, which moves the flag off the category that currently holds it. Passing false is only accepted when another category is already the default — to move the default, mark its successor rather than clearing the incumbent.

Example: true

MeterSubscriptionProductDTO

id
​string · required

Product ID

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Product name

Example: API Calls Package
productNumber
​string · required

Product number

Example: PROD-001

MeterSubscriptionDTO

id
​string · required

Subscription ID

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Subscription name

Example: Enterprise Plan
status
​string · required

Subscription status

Example: active
​MeterSubscriptionProductDTO[] · required

Products in this subscription that use the meter

MeterSubscriptionsResponseDTO

meterId
​string · required

Meter ID

Example: 550e8400-e29b-41d4-a716-446655440000
meterName
​string · required

Meter name

Example: api_calls
​MeterSubscriptionDTO[] · required

Subscriptions with products using this meter

PaymentMethodResponse

id
​string · required

Unique identifier of the payment method

Example: 019D1234-ABCD-7000-8000-123456789ABC
customerId
​string · required

Customer ID this payment method belongs to

Example: 019CBD16-4BFF-766B-BAD7-2F7C36DC3377
provider
​string · enum · required

Payment provider

Enum values:
ONPAY
STRIPE
Example: ONPAY
label
​string · required

Human-readable label for the payment method

Example: Dankort •••• 1234
isDefault
​boolean · required

Whether this is the default payment method for the customer

Example: false
status
​string · enum · required

Current status of the payment method

Enum values:
ACTIVE
EXPIRED
CANCELLED
Example: ACTIVE
createdAt
​string · required

When the payment method was created

Example: 2026-03-25T10:30:00.000Z
cardMask
​string

Masked card number

Example: 457199XXXXXX1234
cardType
​string

Card type as reported by the provider

Example: dankort
expiryMonth
​number

Card expiry month

Example: 12
expiryYear
​number

Card expiry year

Example: 2029

CreateCardSaveLinkRequest

provider
​string · enum · required

Payment provider to use for saving the card

Enum values:
ONPAY
STRIPE
Example: ONPAY

PaymentLinkResponse

url
​string · required

URL to the payment provider window. Send this to your customer.

Example: https://onpay.io/window/v3/00000000-0000-0000-0000-000000000000?k=example
expiresAt
​string · required

When the payment link expires

Example: 2026-03-25T11:30:00.000Z

PublicSubscriptionPlanPhaseProduct

priceId
​string · required

Price ID of the product

Example: 550e8400-e29b-41d4-a716-446655440000
quantity
​number

Quantity for the product

Example: 1
customPrice
​string

Custom unit price override

Example: 89.99

PublicSubscriptionPlanIntervalDiscount

billingInterval
​string · enum · required

Billing interval the discount applies to

Enum values:
day
week
month
year
Example: month
billingIntervalCount
​number · required

Billing interval count (e.g. 1 = monthly, 6 = every 6 months)

Example: 1
discountType
​string · enum · required

Discount type: flat (subtract amount) or period_total (set the period’s target total)

Enum values:
flat
period_total
Example: flat
value
​string · required

Discount value (NET, excluding VAT)

Example: 50.00
description
​string

Optional description shown on the invoice

Example: Negotiated rate discount

PublicSubscriptionPlanPhase

id
​string · required

Phase ID

Example: 550e8400-e29b-41d4-a716-446655440000
sequence
​number · required

Sequence order of the phase (1-based)

Example: 1
discountType
​string · enum · required

Type of discount applied during the phase

Enum values:
none
percentage
Example: percentage
​PublicSubscriptionPlanPhaseProduct[] · required

Products for this phase

name
​string

Phase name

Example: Intro promo
discountValue
​string

Discount value for the phase

Example: 10.00
durationValue
​number

Phase duration value

Example: 3
durationUnit
​string · enum

Phase duration unit

Enum values:
day
week
month
year
Example: month
​PublicSubscriptionPlanIntervalDiscount[]

Per-billing-interval (period) discounts configured for this phase

PublicSubscriptionPlanResponse

id
​string · required

Subscription plan ID

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Subscription plan name

Example: Premium Plan
isActive
​boolean · required

Whether the subscription plan is active

Example: true
currency
​string · required

Currency code (ISO 4217)

Example: DKK
defaultBillingDirection
​string · enum · required

Default billing direction for new customer subscriptions

Enum values:
advance
arrears
Example: advance
​PublicSubscriptionPlanPhase[] · required

Phases configured for this plan

createdAt
​string · required

Date the plan was created

Example: 2024-01-01T00:00:00.000Z
updatedAt
​string · required

Date the plan was last updated

Example: 2024-01-01T00:00:00.000Z
description
​string

Subscription plan description

Example: Our premium subscription plan with all features

PublicListSubscriptionPlansResponse

​PublicSubscriptionPlanResponse[] · required

List of subscription plans

total
​number · required

Total number of subscription plans matching the query

Example: 42
page
​number · required

Current page number (1-indexed)

Example: 1
limit
​number · required

Maximum number of items per page

Example: 25
totalPages
​number · required

Total number of pages available

Example: 2

PublicCreateSubscriptionPlanPhaseProduct

priceId
​string · required

Price ID of an existing product price to include in this phase

Example: 550e8400-e29b-41d4-a716-446655440000
quantity
​number

Quantity for the product (defaults to 1)

Example: 1
customPrice
​string

Custom unit price override for this line (defaults to the price’s own amount)

Example: 89.99

PublicCreateSubscriptionPlanIntervalDiscount

billingInterval
​string · enum · required

Billing interval the discount applies to

Enum values:
day
week
month
year
Example: month
billingIntervalCount
​number · min: 1 · required

Billing interval count (e.g. 1 = monthly, 6 = every 6 months)

Example: 1
discountType
​string · enum · required

Discount type: flat (subtract amount) or period_total (set the period’s target total)

Enum values:
flat
period_total
Example: flat
value
​string · required

Discount value (NET, excluding VAT). For flat: amount to subtract; for period_total: the target total.

Example: 50.00
description
​string

Optional description shown on the invoice

Example: Negotiated rate discount

PublicCreateSubscriptionPlanPhase

​PublicCreateSubscriptionPlanPhaseProduct[] · maxItems: 200 · required

Products included in this phase. At least one is required.

name
​string

Display name for the phase

Example: Intro promo
discountType
​string | null · enum

Type of discount applied across the whole phase. Defaults to none when omitted or null.

Enum values:
none
percentage
Example: none
discountValue
​string

Discount value for the phase. Percentage (0-100), fixed amount, or total target depending on discountType.

Example: 10.00
​PublicCreateSubscriptionPlanIntervalDiscount[]

Per-billing-interval (period) discounts. Use these to discount specific cadences (e.g. a flat amount off the yearly price) independently of the phase-level discount. At most one discount per period type (billing interval + count), and each must target a period type a product in this phase bills at — so the count is bounded by the phase’s distinct product period types.

durationValue
​number · min: 1

Length of the phase. Omit on the last phase to leave it open-ended.

Example: 3
durationUnit
​string · enum

Unit for the phase duration

Enum values:
day
week
month
year
Example: month

PublicCreateSubscriptionPlanRequest

name
​string · required

Subscription plan name. Must be unique within your company.

Example: Premium Plan
​PublicCreateSubscriptionPlanPhase[] · maxItems: 50 · required

Phases defining the plan’s billing structure. At least one phase is required.

description
​string

Subscription plan description

Example: Our premium subscription plan with all features
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217). Omit to bill in the company's own base currency.

Example: DKK
defaultBillingDirection
​string · enum

Default billing direction applied to new customer subscriptions created from this plan

Enum values:
advance
arrears
Example: advance

PublicCancelSubscriptionRequest

id
​string · required

Customer subscription ID to cancel

Example: 550e8400-e29b-41d4-a716-446655440000
strategy
​string · enum · required

Cancellation strategy

Enum values:
immediately
end_of_cycle
specific_date
clear_schedule
Example: end_of_cycle
effectiveDate
​string

Effective churn date (ISO 8601). Required when strategy is SPECIFIC_DATE.

Example: 2024-06-30
refundBehavior
​string · enum

Refund behavior when canceling immediately

Enum values:
none
last_invoice
prorated
Example: none
Default: none
cancellationReason
​string

Optional reason for cancelling the subscription

Example: Customer requested downgrade

EntitlementRef

id
​string · required

Entitlement ID

name
​string · required

Entitlement name

Example: Advanced reporting
key
​string | null

Stable integration key

Example: advanced_reporting

PublicSubscriptionAddon

subscriptionId
​string · required

The add-on’s own subscription id — the id to read or cancel it by.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionName
​string · required

The add-on’s current subscription name

Example: Extra seats
planId
​string | null · required

The plan the add-on currently runs on (null for an add-on created without a plan)

Example: 550e8400-e29b-41d4-a716-446655440000
status
​string · enum · required

Status of the add-on subscription

Enum values:
scheduled
trial
awaiting_payment
active
pending_cancellation
paused
cancelled
expired
Example: active
addedOn
​string · required

The date (YYYY-MM-DD) the add-on was added to this subscription.

Example: 2024-03-10
effectiveNextBillingDate
​string | null · required

The date the add-on’s NEXT charge is created (ISO 8601). It is billed on the parent’s invoice, so this is the parent invoice its next period rides on.

Example: 2024-04-01
monthlyRevenue
​string · required

The add-on’s own monthly revenue. The parent’s invoice carries the parent’s amount plus every add-on’s, so the parent’s full recurring amount is its own monthlyRevenue plus these. What the subscription bills per month today, as a decimal string, in currency, excluding VAT. Every billing interval is converted to one month: a quarter is divided by 3, half a year by 6, a year by 12, and weekly prices are multiplied by 52/12. Plan discounts, interval discounts and recurring surcharges are applied; one-off charges are not included. Add-ons are not included either: each add-on is its own subscription with its own monthlyRevenue, so adding up every subscription counts nothing twice, and the invoice a parent sends carries its own figure plus its add-ons’. Usage-based lines are left out, because their consumption is not known until the period closes: a metered line counts only through a prepaid commitment, or a fee its price charges at zero usage (see hasMeteredProducts, and GET /v1/subscriptions/{id}/usage for the usage recorded so far). A change scheduled for a later date shows from the day it takes effect. During a trial it is the price billing starts at. 0 for a subscription that has not started yet or has ended.

Example: 99.99
currency
​string · required

Currency code (ISO 4217). Always the parent’s currency.

Example: DKK

DiscountType

string · enum
Enum values:
percentage
fixed
per_unit

DiscountScope

string · enum
Enum values:
line
document

PublicSubscriptionDiscount

discountId
​string · required

The discount record.

Example: 0197A943-2325-7829-B835-B6C71A293065
name
​string · required

Printed as the reason on the e-invoice allowance.

Example: Loyalty 10%
type
​string · enum · required
Enum values:
percentage
fixed
per_unit
scope
​string · enum · required
Enum values:
line
document
percentagePct
​string | null · required

A percentage discount only.

Example: 10
amountInCurrency
​string | null · required

A fixed or per-unit discount's amount in the subscription currency; null for a percentage.

Example: null
active
​boolean · required

False: the discount is switched off and takes nothing off any period.

endsAt
​string | null · required

YYYY-MM-DD. The discount applies to each billing period that starts before this day; null: no end.

Example: 2026-12-01
targetsNoProduct
​boolean · required

True for a line-scope discount that names none of the subscription products: it takes nothing off until one of its products is added or it is assigned to one of these.

PublicSubscriptionProduct

productId
​string · required

Catalogue product id. Stays the same when the product gets a new price.

Example: 0198A0F1-2B33-7D44-8E55-6F778899AABB
productName
​string · required

The product’s name in the catalogue today. An invoice already issued keeps the name it was billed under.

Example: Bookkeeping Pro license
productNumber
​string · required

Product number from the catalogue.

Example: 1001
priceId
​string · required

The price this line bills from — the priceId POST /v1/subscriptions/{id}/product-changes takes for the line. GET /v1/product-prices/{priceId} returns the price as the catalogue has it today.

Example: 0198A0F1-2B33-7D44-8E55-6F778899AACC
billingPeriodType
​string · enum · required

How the line is billed: recurring bills quantity every period, usage bills what was consumed in the period, one_time bills once, and surcharge is a percentage of the subscription’s other lines.

Enum values:
recurring
usage
one_time
surcharge
Example: recurring
pricingModel
​string · enum · required

How the price is calculated. flat_rate is one unit price; volume, graduated and package are priced from tiers, so unitPrice is null (unless an agreed price is set) and the tiers are on GET /v1/product-prices/{priceId}.

Enum values:
flat_rate
package
volume
graduated
Example: flat_rate
quantity
​number | null · required

Quantity on the line. Null when the line carries no fixed quantity.

Example: 3
unitPrice
​string | null · required

The unit price the line bills at, as a decimal string in the subscription’s currency, excluding VAT: customPrice when one is set, else the price fixed when the subscription’s current billing period was set up. A later catalogue price change reaches it only when the subscription changes again. Null for a tiered price with no agreed price, a surcharge, and a subscription with no billing period in effect (one that has ended).

Example: 499.00
customPrice
​string | null · required

The unit price agreed for this subscription, as a decimal string in the subscription’s currency. Null when the line bills the catalogue price.

Example: 89.99
description
​string | null · required

The line description shown on the invoice, when one was set.

Example: Agreed price for 2026

PublicCancelSubscriptionResponse

id
​string · required

Customer subscription ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerId
​string · required

Customer ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerName
​string · required

Customer name

Example: Acme Corporation
subscriptionName
​string · required

Subscription name

Example: Premium Plan
startDate
​string · required

Start date (ISO 8601)

Example: 2024-01-01
status
​string · enum · required

Status of the customer subscription

Enum values:
scheduled
trial
awaiting_payment
active
pending_cancellation
paused
cancelled
expired
Example: active
currency
​string · required

Currency code (ISO 4217)

Example: DKK
monthlyRevenue
​string · required

What the subscription bills per month today, as a decimal string, in currency, excluding VAT. Every billing interval is converted to one month: a quarter is divided by 3, half a year by 6, a year by 12, and weekly prices are multiplied by 52/12. Plan discounts, interval discounts and recurring surcharges are applied; one-off charges are not included. Add-ons are not included either: each add-on is its own subscription with its own monthlyRevenue, so adding up every subscription counts nothing twice, and the invoice a parent sends carries its own figure plus its add-ons’. Usage-based lines are left out, because their consumption is not known until the period closes: a metered line counts only through a prepaid commitment, or a fee its price charges at zero usage (see hasMeteredProducts, and GET /v1/subscriptions/{id}/usage for the usage recorded so far). A change scheduled for a later date shows from the day it takes effect. During a trial it is the price billing starts at. 0 for a subscription that has not started yet or has ended.

Example: 15000.00
hasMeteredProducts
​boolean · required

Whether any product on the subscription is billed on a meter. When true, monthlyRevenue leaves the metered consumption out; read GET /v1/subscriptions/{id}/usage for the usage recorded so far in the current period.

Example: false
billingDirection
​string · enum · required

Billing direction: ADVANCE bills at period start, ARREARS at period end

Enum values:
advance
arrears
Example: advance
effectiveBillingDirection
​string · enum · required

Effective billing direction for the current period. Can differ from billingDirection if the direction was changed mid-period.

Enum values:
advance
arrears
Example: advance
addonOfSubscriptionId
​string | null · required

The subscription this one is an add-on of, or null. An add-on bills on its parent’s invoice, inside the parent’s section, and ends when the parent is cancelled.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionName
​string | null · required

Current name of the subscription this one is an add-on of, or null when it is not an add-on.

Example: Premium Plan
​PublicSubscriptionAddon[] · required

The add-ons billed on this subscription’s invoice, inside its section. Empty when it has none, and always empty on an add-on — an add-on cannot have add-ons of its own.

​PublicSubscriptionDiscount[] · required

The discount records the subscription references, in the order they apply, each as the record is now with the end date this subscription carries for it. Empty when it references none.

​PublicSubscriptionProduct[] · required

The products the subscription bills today, newest line first. A change scheduled for a later date is listed under GET /v1/subscriptions/{id}/scheduled-changes and appears here once it takes effect. An add-on’s products are on the add-on’s own subscription.

cascadedAddonSubscriptionIds
​string[] · required

The add-ons cancelled together with this subscription, by their subscription ids. On an immediate cancellation these ended now; on a scheduled one they are the add-ons that will end with it, as they stand when the request is made. Empty when the subscription has no add-ons, and for clear_schedule.

Example: ["0197A943-2325-7829-B835-B6C71A293065"]
​EntitlementRef[]

Entitlements currently granted by the subscription

planId
​string

Subscription plan ID (null for ad-hoc subscriptions)

Example: 550e8400-e29b-41d4-a716-446655440000
endDate
​string

End date (ISO 8601)

Example: 2025-01-01
scheduledChurnDate
​string

Scheduled churn date (ISO 8601). On an add-on this is its parent’s scheduled churn date: a scheduled cancellation of the parent ends every add-on with it.

Example: 2024-07-15
trialDays
​number

Number of trial days granted

Example: 14
cancellationReason
​string

Reason provided when the subscription was cancelled

Example: Customer requested downgrade
effectiveNextBillingDate
​string

The date the NEXT invoice will be created (ISO 8601). This is an invoicing schedule marker, not a payment marker — it does not say what the customer has paid for; see paidThroughDate.

Example: 2024-02-01
paidThroughDate
​string | null

The date the subscription is paid through (ISO 8601): the first day not yet paid for. It is the end of the contiguous run of settled service periods starting at the earliest billed period, so an unpaid period caps it rather than being skipped. Null when the earliest billed period is not settled (or nothing is billed yet). Payment timing never shifts this backwards: a late payment settles exactly the period its invoice stated.

Example: 2024-02-01
commitmentEndDate
​string

End date of the customer commitment period (ISO 8601)

Example: 2025-12-31
originalStartDate
​string

Original start date from source system for migrated subscriptions (ISO 8601)

Example: 2023-01-01
paymentMethodId
​string | null

Assigned payment method ID

Example: 550e8400-e29b-41d4-a716-446655440000
automaticBilling
​boolean

Whether automatic billing is enabled

Example: true
allowedPaymentProviders
​string[]

The connected card provider the buyer may pay this subscription with - at most one. Empty means card payment is off. A subscription needs it before the buyer can add a first card through POST /v1/checkout/subscriptions/{id}/card-window, which otherwise answers 400 SUBSCRIPTION_MANAGE_PROVIDER_NOT_ALLOWED. It allows card payment and attaches no card: the buyer still enters the card themselves. Two providers of the same kind answer 400 INVOICE_MULTIPLE_CARD_PROVIDERS.

Enum values:
ONPAY
STRIPE
Example: ["STRIPE"]
partnerReferenceId
​string | null

Your reconciliation reference (the clientReferenceId you passed at embedded-checkout bind time), echoed back so you can match this subscription to your order. Null for any subscription not created through a partner-bound checkout.

Example: order_7f3a9c21
billingGroupId
​string | null

The billing group this subscription is billed together with others on, or null when it bills on its own. A grouped subscription is billed on the group’s document and charged on the group’s card, so its own paymentMethodId is null and automaticBilling is false. A subscription that merely has other subscriptions billed as part of its own section is not grouped: it reports null and keeps its own card. So does one that IS such a section. A subscription that has joined a group but not yet reached its first shared billing date already reports the group.

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicSubscriptionAddonRef

subscriptionId
​string · required

The add-on’s own subscription id — the id to read or cancel it by.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionName
​string · required

The add-on’s current subscription name

Example: Extra seats

PublicCustomerSubscriptionListItem

id
​string · required

Customer subscription ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerId
​string · required

Customer ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerName
​string · required

Customer name

Example: Acme Corporation
subscriptionName
​string · required

Subscription plan name

Example: Premium Plan
status
​string · enum · required

Status of the customer subscription

Enum values:
scheduled
trial
awaiting_payment
active
pending_cancellation
paused
cancelled
expired
Example: active
startDate
​string · required

Start date (ISO 8601)

Example: 2024-01-01
currency
​string · required

Currency code (ISO 4217)

Example: DKK
monthlyRevenue
​string · required

What the subscription bills per month today, as a decimal string, in currency, excluding VAT. Every billing interval is converted to one month: a quarter is divided by 3, half a year by 6, a year by 12, and weekly prices are multiplied by 52/12. Plan discounts, interval discounts and recurring surcharges are applied; one-off charges are not included. Add-ons are not included either: each add-on is its own subscription with its own monthlyRevenue, so adding up every subscription counts nothing twice, and the invoice a parent sends carries its own figure plus its add-ons’. Usage-based lines are left out, because their consumption is not known until the period closes: a metered line counts only through a prepaid commitment, or a fee its price charges at zero usage (see hasMeteredProducts, and GET /v1/subscriptions/{id}/usage for the usage recorded so far). A change scheduled for a later date shows from the day it takes effect. During a trial it is the price billing starts at. 0 for a subscription that has not started yet or has ended.

Example: 15000.00
hasMeteredProducts
​boolean · required

Whether any product on the subscription is billed on a meter. When true, monthlyRevenue leaves the metered consumption out; read GET /v1/subscriptions/{id}/usage for the usage recorded so far in the current period.

Example: false
addonOfSubscriptionId
​string | null · required

The subscription this one is an add-on of, or null. An add-on bills on its parent’s invoice, inside the parent’s section, and ends when the parent is cancelled. Read the parent to see its add-ons.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionName
​string | null · required

Current name of the subscription this one is an add-on of, or null when it is not an add-on.

Example: Premium Plan
​PublicSubscriptionAddonRef[] · required

The add-ons billed on this subscription’s invoice, oldest first. Empty on an add-on and on a subscription without add-ons. Read the subscription for each add-on’s plan, status and next billing date.

​PublicSubscriptionProduct[] · required

The products the subscription bills today, newest line first. A change scheduled for a later date is listed under GET /v1/subscriptions/{id}/scheduled-changes and appears here once it takes effect. An add-on’s products are on the add-on’s own subscription.

customerNumber
​string

Customer number

Example: C001
planId
​string

Subscription plan ID (null for ad-hoc subscriptions)

Example: 550e8400-e29b-41d4-a716-446655440000
effectiveNextBillingDate
​string

The date the NEXT invoice will be created (ISO 8601). This is an invoicing schedule marker, not a payment marker — it does not say what the customer has paid for; see paidThroughDate.

Example: 2024-02-01
paidThroughDate
​string | null

The date the subscription is paid through (ISO 8601): the first day not yet paid for. It is the end of the contiguous run of settled service periods starting at the earliest billed period, so an unpaid period caps it rather than being skipped. Null when the earliest billed period is not settled (or nothing is billed yet). Payment timing never shifts this backwards: a late payment settles exactly the period its invoice stated.

Example: 2024-02-01
partnerReferenceId
​string | null

Your reconciliation reference (the clientReferenceId you passed at embedded-checkout bind time), echoed back so you can match this subscription to your order. Null for any subscription not created through a partner-bound checkout. Filter the list by partnerReferenceId to recover a missed webhook.

Example: order_7f3a9c21
billingGroupId
​string | null

The billing group this subscription is billed together with others on, or null when it bills on its own. A subscription that has joined a group but not yet reached its first shared billing date already reports the group. A subscription that merely has other subscriptions billed as part of its own section is not grouped and reports null, and so does one that IS such a section.

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicListCustomerSubscriptionsResponse

​PublicCustomerSubscriptionListItem[] · required

List of customer subscriptions

total
​number · required

Total number of customer subscriptions matching the query

Example: 42
limit
​number · required

Maximum number of items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages available.

Example: 2

PublicAssignSubscriptionProductOverride

priceId
​string · required

Price ID of the product to override

Example: 550e8400-e29b-41d4-a716-446655440000
quantity
​number

Quantity to assign (overrides the plan template quantity). Not valid on usage-metered prices. Omit when the override only carries prepaid-commitment settings.

Example: 25
customPrice
​string

Unit price excluding VAT, as a decimal string, replacing the list price on this subscription. Omit to bill the list price. Valid only on flat-rate prices that are not usage-metered.

Example: 149.00
committedQuantity
​number | null

Prepaid usage commitment: quantity billed up front each period (usage-metered prices on advance billing only). Actual consumption is trued up at period end. Null = no commitment; 0 is a valid zero commitment.

Example: 100
usageCarryoverMode
​string | null · enum

How the next period derives its committed quantity from the settled period: reset (authored quantity), track_actual (last actual), ratchet_up (grow only), ratchet_down (shrink only). Null reads as reset.

Enum values:
reset
track_actual
ratchet_up
ratchet_down
underageMode
​string | null · enum

What happens to underage (actual below committed) at settlement: forfeit (kept) or refund (credited). Null reads as forfeit.

Enum values:
forfeit
refund
minimumCommittedQuantity
​number | null

Floor for downward carryover (0 <= floor <= committedQuantity). Null = no floor.

committedUnitPrice
​number | null

Flat per-unit price for the committed units, replacing the price tier ladder on the commitment line only. Consumption above the commitment still walks the ladder, starting from the step the committed quantity occupies. Requires reset carryover + forfeit underage. Null = ladder-priced; 0 is a valid free commitment.

Example: 8
discardPreAssignmentUsage
​boolean

Don't bill usage events dated before this assignment for this subscription (usage-metered prices only; other subscriptions on the same meter still bill them). Persists a per-price usage window floor at the assignment date.

Example: true

PublicAssignSubscriptionAddon

planId
​string · required

Subscription plan ID the add-on is created from

Example: 550e8400-e29b-41d4-a716-446655440000
​PublicAssignSubscriptionProductOverride[] · maxItems: 200

Optional quantity and price overrides for products in the add-on’s plan

cadence
​string

How often the add-on bills, as <interval>-<count> (month-1, month-3, year-1). Omit to bill at the plan’s own cadence. Any other value must be one of the plan’s alternative cadences; one the plan does not offer is refused with 400 SHARED_VALIDATION_FAILED, details.reason = ADDON_CADENCE_NOT_ON_PLAN. An add-on on a shorter cadence than its parent bills its cycles on the parent’s invoice between the parent’s own billing dates.

Example: month-1

PublicAssignSubscriptionRequest

customerId
​string · required

Customer ID to assign the subscription to

Example: 550e8400-e29b-41d4-a716-446655440000
planId
​string · required

Subscription plan ID

Example: 550e8400-e29b-41d4-a716-446655440000
startDate
​string · required

Start date (ISO 8601)

Example: 2024-01-01
endDate
​string

End date (ISO 8601)

Example: 2025-01-01
billingCycleAnchor
​string

Billing cycle anchor date (ISO 8601). When the billing cycle should align to. Defaults to startDate if not provided.

Example: 2024-02-01
prorationBehavior
​string · enum

How to handle proration from startDate to billingCycleAnchor

Enum values:
create_prorations
always_invoice
none
Example: none
Default: none
trialDays
​number · min: 0 · max: 365

Trial period in days

Example: 14
billingDirection
​string · enum

Billing direction for this subscription

Enum values:
advance
arrears
Example: advance
customerDepartmentId
​string

Customer department ID for invoice delivery

Example: 550e8400-e29b-41d4-a716-446655440000
departmentContactOverrideId
​string

Contact override ID for department invoice delivery

Example: 550e8400-e29b-41d4-a716-446655440000
​PublicAssignSubscriptionProductOverride[] · maxItems: 200

Optional quantity and price overrides for products in the plan

automaticBilling
​boolean

Whether to enable automatic billing

Example: false
allowedPaymentProviders
​string[]

The connected card provider the buyer may pay this subscription with - at most one. Empty means card payment is off. A subscription needs it before the buyer can add a first card through POST /v1/checkout/subscriptions/{id}/card-window, which otherwise answers 400 SUBSCRIPTION_MANAGE_PROVIDER_NOT_ALLOWED. It allows card payment and attaches no card: the buyer still enters the card themselves. Two providers of the same kind answer 400 INVOICE_MULTIPLE_CARD_PROVIDERS.

Enum values:
ONPAY
STRIPE
Example: ["STRIPE"]
collectViaLeverandorservice
​boolean

Collect each billing cycle via Leverandørservice (Danish direct debit) instead of a card charge. DKK-only. Requires the tenant to hold the Leverandørservice license, a configured creditor number, and a registered mandate for the customer.

Example: false
joinBillingGroupId
​string

Create the subscription straight onto this billing group of the same customer. The group replaces billingCycleAnchor with its own billing date, and the assignment and the join commit together, so a refused join creates no subscription. startDate and prorationBehavior still decide the period up to the group's date. Cannot be combined with formBillingGroupWithSubscriptionId.

Example: 0197A943-2325-7829-B835-B6C71A293065
formBillingGroupWithSubscriptionId
​string

Create the subscription and form a NEW billing group with this existing subscription of the same customer as the lead: the lead's next billing date replaces billingCycleAnchor, and its terms are written onto the new subscription. The assignment and the formation commit together. Cannot be combined with joinBillingGroupId.

Example: 0197A943-2325-7829-B835-B6C71A293065
discountIds
​string[] · maxItems: 20

Discount records the subscription references, in the order they apply, by id. Each bills on every period that starts before its end: a discount that lasts a number of periods ends that many billing periods after the first one billed (after any trial), and one without a duration has no end. Each is checked when attached: it exists, a fixed or per-unit one has an amount in the subscription currency, it combines with the others, and it is not code-only. The subscription takes one use of each discount limit, however many periods it bills. Refusals: DISCOUNT_NOT_FOUND, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_APPLICABLE, DISCOUNT_REDEMPTION_LIMIT_REACHED, DISCOUNT_CUSTOMER_REDEMPTION_LIMIT_REACHED, DISCOUNT_DURATION_NEEDS_RECURRING_PRODUCT.

Example: ["0197A943-2325-7829-B835-B6C71A293065"]
​PublicAssignSubscriptionAddon[] · maxItems: 19

Add-ons created together with this subscription. Each becomes a subscription of its own that bills on this subscription’s invoice, inside its section, and ends when this subscription is cancelled. An add-on takes its customer, dates, billing direction and invoice details from this subscription, so it names only its plan and product overrides. The subscription and its add-ons commit together: a refused add-on creates nothing. Cannot be combined with joinBillingGroupId or formBillingGroupWithSubscriptionId (400 SHARED_VALIDATION_FAILED, details.reason = ADDONS_WITH_BILLING_GROUP_PLACEMENT). To add an add-on to an existing subscription, use POST /v1/subscriptions/{id}/addons.

discountCode
​string · maxLength: 64

A discount code the customer gave, matched without regard to case or surrounding spaces. Its discount is attached to this subscription (not to its add-ons) and bills on every period that starts before the discount ends: a discount that lasts N periods ends N billing periods after the first one billed, which with trialDays is the first period after the trial. A code that is unknown, switched off, expired, for another customer or with no use left is refused with its DISCOUNT_* code and nothing is created. The subscription takes one use of the discount and of the code, whatever number of periods it bills.

Example: WELCOME10
paymentMethodId
​string · deprecated

Deprecated and non-functional. Cards are attached by the buyer with their consent (card-save link / portal checkout); any value here is rejected. Field retained only so the request is validated cleanly.

Example: 550e8400-e29b-41d4-a716-446655440000

PublicCustomerSubscriptionResponse

id
​string · required

Customer subscription ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerId
​string · required

Customer ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerName
​string · required

Customer name

Example: Acme Corporation
subscriptionName
​string · required

Subscription name

Example: Premium Plan
startDate
​string · required

Start date (ISO 8601)

Example: 2024-01-01
status
​string · enum · required

Status of the customer subscription

Enum values:
scheduled
trial
awaiting_payment
active
pending_cancellation
paused
cancelled
expired
Example: active
currency
​string · required

Currency code (ISO 4217)

Example: DKK
monthlyRevenue
​string · required

What the subscription bills per month today, as a decimal string, in currency, excluding VAT. Every billing interval is converted to one month: a quarter is divided by 3, half a year by 6, a year by 12, and weekly prices are multiplied by 52/12. Plan discounts, interval discounts and recurring surcharges are applied; one-off charges are not included. Add-ons are not included either: each add-on is its own subscription with its own monthlyRevenue, so adding up every subscription counts nothing twice, and the invoice a parent sends carries its own figure plus its add-ons’. Usage-based lines are left out, because their consumption is not known until the period closes: a metered line counts only through a prepaid commitment, or a fee its price charges at zero usage (see hasMeteredProducts, and GET /v1/subscriptions/{id}/usage for the usage recorded so far). A change scheduled for a later date shows from the day it takes effect. During a trial it is the price billing starts at. 0 for a subscription that has not started yet or has ended.

Example: 15000.00
hasMeteredProducts
​boolean · required

Whether any product on the subscription is billed on a meter. When true, monthlyRevenue leaves the metered consumption out; read GET /v1/subscriptions/{id}/usage for the usage recorded so far in the current period.

Example: false
billingDirection
​string · enum · required

Billing direction: ADVANCE bills at period start, ARREARS at period end

Enum values:
advance
arrears
Example: advance
effectiveBillingDirection
​string · enum · required

Effective billing direction for the current period. Can differ from billingDirection if the direction was changed mid-period.

Enum values:
advance
arrears
Example: advance
addonOfSubscriptionId
​string | null · required

The subscription this one is an add-on of, or null. An add-on bills on its parent’s invoice, inside the parent’s section, and ends when the parent is cancelled.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionName
​string | null · required

Current name of the subscription this one is an add-on of, or null when it is not an add-on.

Example: Premium Plan
​PublicSubscriptionAddon[] · required

The add-ons billed on this subscription’s invoice, inside its section. Empty when it has none, and always empty on an add-on — an add-on cannot have add-ons of its own.

​PublicSubscriptionDiscount[] · required

The discount records the subscription references, in the order they apply, each as the record is now with the end date this subscription carries for it. Empty when it references none.

​PublicSubscriptionProduct[] · required

The products the subscription bills today, newest line first. A change scheduled for a later date is listed under GET /v1/subscriptions/{id}/scheduled-changes and appears here once it takes effect. An add-on’s products are on the add-on’s own subscription.

​EntitlementRef[]

Entitlements currently granted by the subscription

planId
​string

Subscription plan ID (null for ad-hoc subscriptions)

Example: 550e8400-e29b-41d4-a716-446655440000
endDate
​string

End date (ISO 8601)

Example: 2025-01-01
scheduledChurnDate
​string

Scheduled churn date (ISO 8601). On an add-on this is its parent’s scheduled churn date: a scheduled cancellation of the parent ends every add-on with it.

Example: 2024-07-15
trialDays
​number

Number of trial days granted

Example: 14
cancellationReason
​string

Reason provided when the subscription was cancelled

Example: Customer requested downgrade
effectiveNextBillingDate
​string

The date the NEXT invoice will be created (ISO 8601). This is an invoicing schedule marker, not a payment marker — it does not say what the customer has paid for; see paidThroughDate.

Example: 2024-02-01
paidThroughDate
​string | null

The date the subscription is paid through (ISO 8601): the first day not yet paid for. It is the end of the contiguous run of settled service periods starting at the earliest billed period, so an unpaid period caps it rather than being skipped. Null when the earliest billed period is not settled (or nothing is billed yet). Payment timing never shifts this backwards: a late payment settles exactly the period its invoice stated.

Example: 2024-02-01
commitmentEndDate
​string

End date of the customer commitment period (ISO 8601)

Example: 2025-12-31
originalStartDate
​string

Original start date from source system for migrated subscriptions (ISO 8601)

Example: 2023-01-01
paymentMethodId
​string | null

Assigned payment method ID

Example: 550e8400-e29b-41d4-a716-446655440000
automaticBilling
​boolean

Whether automatic billing is enabled

Example: true
allowedPaymentProviders
​string[]

The connected card provider the buyer may pay this subscription with - at most one. Empty means card payment is off. A subscription needs it before the buyer can add a first card through POST /v1/checkout/subscriptions/{id}/card-window, which otherwise answers 400 SUBSCRIPTION_MANAGE_PROVIDER_NOT_ALLOWED. It allows card payment and attaches no card: the buyer still enters the card themselves. Two providers of the same kind answer 400 INVOICE_MULTIPLE_CARD_PROVIDERS.

Enum values:
ONPAY
STRIPE
Example: ["STRIPE"]
partnerReferenceId
​string | null

Your reconciliation reference (the clientReferenceId you passed at embedded-checkout bind time), echoed back so you can match this subscription to your order. Null for any subscription not created through a partner-bound checkout.

Example: order_7f3a9c21
billingGroupId
​string | null

The billing group this subscription is billed together with others on, or null when it bills on its own. A grouped subscription is billed on the group’s document and charged on the group’s card, so its own paymentMethodId is null and automaticBilling is false. A subscription that merely has other subscriptions billed as part of its own section is not grouped: it reports null and keeps its own card. So does one that IS such a section. A subscription that has joined a group but not yet reached its first shared billing date already reports the group.

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicScheduledChange

changeId
​string · required

Identifier of this queued change. Ephemeral — valid only until the change activates or is cancelled, so re-fetch rather than caching it.

Example: 550e8400-e29b-41d4-a716-446655440000
kind
​string · required

The kind of queued change: one of replace_plan, edit_products, change_direction, or churn.

Example: replace_plan
effectiveDate
​string · required

The date (YYYY-MM-DD) the change takes effect.

Example: 2024-07-01
planId
​string | null · required

The plan the subscription moves to when the change activates (null for ad-hoc / non-plan changes).

Example: 550e8400-e29b-41d4-a716-446655440000
subscriptionName
​string · required

The plan name the change moves to.

Example: Pro (annual)

PublicSubscriptionUsageLine

meterId
​string | null · required

The meter the usage is recorded on.

Example: 0197A943-2325-7829-B835-B6C71A293065
meterName
​string | null · required

The meter’s display name.

Example: Bookings
priceId
​string · required

The price the usage is billed at. A meter sold at two prices reports one line per price.

Example: 0197A943-2325-7829-B835-B6C71A293065
productName
​string | null · required

The product name the invoice line will carry.

Example: Commission
periodStart
​string · required

First day of the billing period the usage falls in (YYYY-MM-DD).

Example: 2026-10-01
periodEnd
​string · required

The day the period closes (YYYY-MM-DD, exclusive). Its usage is invoiced on or after this date, in arrears.

Example: 2026-11-01
quantity
​number · required

Quantity recorded so far in the period, after the meter’s aggregation (sum, count, maximum or last value). Usage recorded before a date the operator chose not to bill from is left out, as it is on the invoice.

Example: 1250
amount
​string · required

What the period’s usage comes to so far, as a decimal string in currency, excluding VAT, priced exactly as the invoice will price it: the price the subscription is locked to, tiers included. For a line with a prepaid commitment it is only the settlement: the usage above what was prepaid (or, when the commitment refunds unused units, a negative amount for what was not used). The up-front commitment charge is not included. Usage already invoiced is not included. Plan and interval discounts are separate lines on the invoice and are not deducted here.

Example: 4950.00
quantityIsShared
​boolean · required

Whether another line reads the same units. Usage is recorded per customer and meter, not per subscription, so every line on the same meter (another price on this subscription, or another of the customer’s subscriptions) reports the same quantity. Amounts on such lines add up; quantities do not.

Example: false

PublicSubscriptionUsage

subscriptionId
​string · required

The stable subscription id.

Example: 019F3C59-7988-7264-82D7-EB456918ED02
currency
​string · required

Currency code (ISO 4217) of every amount.

Example: DKK
​PublicSubscriptionUsageLine[] · required

One entry per metered price and billing period that has usage not yet invoiced. A subscription behind on billing can report more than one period for a price. Empty when the subscription has no metered products.

PublicSubscriptionProductChangeLine

priceId
​string · required

Price ID of the product line.

Example: 550e8400-e29b-41d4-a716-446655440000
quantity
​number

Quantity from the effective date. Omit to keep the quantity the line has today; a price the subscription does not carry yet starts at 1. Not valid on usage-metered prices.

Example: 3
customPrice
​string | null

Unit price excluding VAT, as a decimal string, replacing the list price from the effective date. Omit to keep the price the line has today; send null to bill the list price. Not valid on usage-metered prices.

Example: 149.00
description
​string | null

Text printed on the invoice line. Omit to keep the description the line has today; send null to remove it.

Example: Support seats

PublicSubscriptionDiscountEndDate

discountId
​string · required

A discount the subscription references.

endsAt
​string | null · required

The day the discount stops (YYYY-MM-DD): a period starting on or after it is billed without it.

Example: 2026-12-01

PublicChangeSubscriptionProductsRequest

effectiveDate
​string · required

The date the change takes effect (YYYY-MM-DD). A date in the future queues the change; it is listed under the subscription’s scheduled changes until then. Today or an earlier date takes effect at once; the earliest date accepted is the day the subscription’s current terms took effect.

Example: 2026-11-01
​PublicSubscriptionProductChangeLine[] · minItems: 1 · maxItems: 50

Every product line the subscription has from the effective date. A line for a price the subscription carries today changes that line; a line for a new price adds it; a price left out of the list is removed. Each price may appear once. May be left out when the change sends discountIds or discountEndDates: the products then stay as they are.

discountIds
​string[] · maxItems: 20

The full set of discount records the subscription references from the effective date, in the order they apply. Omit to keep the ones it has; [] removes them all. A discount added is checked and takes one use of its limits; one removed gives its use back unless an invoice already applied it. The refusals are those of discountIds on POST /v1/subscriptions.

​PublicSubscriptionDiscountEndDate[] · maxItems: 20

End dates for discounts the subscription references after the change, replacing the ones they have. A period that starts on or after the end date is billed without the discount; null removes the end. A discount the subscription does not reference is refused with DISCOUNT_END_DATE_NOT_REFERENCED.

prorationBehavior
​string · enum

How the billing period the effective date falls inside is settled on a subscription billed in advance. The modes are described in the Proration guide. Omit for create_prorations. A subscription billed in arrears ignores it: its invoice at the end of the period bills each part of the period at the terms in force, by days.

Enum values:
create_prorations
always_invoice
none
Example: create_prorations

PublicRetryPaymentResponseDTO

status
​string · required

Always "succeeded" — a failed retry returns a coded error instead.

Example: succeeded
subscriptionId
​string · required

The stable subscription id the retry ran against.

Example: 01890a5d-ac96-774b-b9aa-9d0f8f6c3b45
invoiceId
​string · required

Id of the outstanding invoice the cleared charge paid.

Example: 01890a5d-ac96-774b-b9aa-9d0f8f6c3b46

PublicSubscriptionAddonEligibilityRequest

subscriptionIds
​string[]

Existing subscriptions you intend to attach as add-ons (0-19, each once). Omit to ask only whether this subscription can take add-ons at all.

Example: ["0197A943-2325-7829-B835-B6C71A293065"]

PublicAddonRefusal

code
​string · required

The error code the attach would answer with

Example: SUBSCRIPTION_ADDON_PARENT_MISMATCH
subscriptionId
​string | null · required

The subscription the refusal is about, or null when it is about the request as a whole.

​object · required

The refusal’s details, as the attach would answer them.

PublicRemovedCard

subscriptionId
​string | null · required

The subscription whose own card is taken off: an add-on bills on its parent’s invoice, which only the parent’s card pays. Null when the card is a billing group’s.

billingGroupId
​string | null · required

The billing group whose card is taken off, because attaching leaves it billing one subscription, whose own invoice the group card cannot pay. Null when the card is a subscription’s.

paymentMethodId
​string · required

The saved card that stops being charged

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicSubscriptionAddonEligibilityResponse

eligible
​boolean · required

True when the attach would be accepted as asked

​PublicAddonRefusal[] · required

Every refusal the attach would answer, one per problem

​PublicRemovedCard[] · required

The saved cards the attach would stop charging. Attaching cannot be undone, and a removed card is not put back: the buyer adds one again through a card flow if they want it.

PublicAttachSubscriptionAddonsRequest

subscriptionIds
​string[] · required

Existing subscriptions of the same customer to turn into add-ons of this one (1-19, each once). Each keeps its own id, plan and products, and from then on bills on this subscription’s invoice.

Example: ["0197A943-2325-7829-B835-B6C71A293065"]

PublicAttachSubscriptionAddonsResponse

id
​string · required

Customer subscription ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerId
​string · required

Customer ID

Example: 550e8400-e29b-41d4-a716-446655440000
customerName
​string · required

Customer name

Example: Acme Corporation
subscriptionName
​string · required

Subscription name

Example: Premium Plan
startDate
​string · required

Start date (ISO 8601)

Example: 2024-01-01
status
​string · enum · required

Status of the customer subscription

Enum values:
scheduled
trial
awaiting_payment
active
pending_cancellation
paused
cancelled
expired
Example: active
currency
​string · required

Currency code (ISO 4217)

Example: DKK
monthlyRevenue
​string · required

What the subscription bills per month today, as a decimal string, in currency, excluding VAT. Every billing interval is converted to one month: a quarter is divided by 3, half a year by 6, a year by 12, and weekly prices are multiplied by 52/12. Plan discounts, interval discounts and recurring surcharges are applied; one-off charges are not included. Add-ons are not included either: each add-on is its own subscription with its own monthlyRevenue, so adding up every subscription counts nothing twice, and the invoice a parent sends carries its own figure plus its add-ons’. Usage-based lines are left out, because their consumption is not known until the period closes: a metered line counts only through a prepaid commitment, or a fee its price charges at zero usage (see hasMeteredProducts, and GET /v1/subscriptions/{id}/usage for the usage recorded so far). A change scheduled for a later date shows from the day it takes effect. During a trial it is the price billing starts at. 0 for a subscription that has not started yet or has ended.

Example: 15000.00
hasMeteredProducts
​boolean · required

Whether any product on the subscription is billed on a meter. When true, monthlyRevenue leaves the metered consumption out; read GET /v1/subscriptions/{id}/usage for the usage recorded so far in the current period.

Example: false
billingDirection
​string · enum · required

Billing direction: ADVANCE bills at period start, ARREARS at period end

Enum values:
advance
arrears
Example: advance
effectiveBillingDirection
​string · enum · required

Effective billing direction for the current period. Can differ from billingDirection if the direction was changed mid-period.

Enum values:
advance
arrears
Example: advance
addonOfSubscriptionId
​string | null · required

The subscription this one is an add-on of, or null. An add-on bills on its parent’s invoice, inside the parent’s section, and ends when the parent is cancelled.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionName
​string | null · required

Current name of the subscription this one is an add-on of, or null when it is not an add-on.

Example: Premium Plan
​PublicSubscriptionAddon[] · required

The add-ons billed on this subscription’s invoice, inside its section. Empty when it has none, and always empty on an add-on — an add-on cannot have add-ons of its own.

​PublicSubscriptionDiscount[] · required

The discount records the subscription references, in the order they apply, each as the record is now with the end date this subscription carries for it. Empty when it references none.

​PublicSubscriptionProduct[] · required

The products the subscription bills today, newest line first. A change scheduled for a later date is listed under GET /v1/subscriptions/{id}/scheduled-changes and appears here once it takes effect. An add-on’s products are on the add-on’s own subscription.

​PublicRemovedCard[] · required

The saved cards the attach stopped charging. Empty when none was.

​EntitlementRef[]

Entitlements currently granted by the subscription

planId
​string

Subscription plan ID (null for ad-hoc subscriptions)

Example: 550e8400-e29b-41d4-a716-446655440000
endDate
​string

End date (ISO 8601)

Example: 2025-01-01
scheduledChurnDate
​string

Scheduled churn date (ISO 8601). On an add-on this is its parent’s scheduled churn date: a scheduled cancellation of the parent ends every add-on with it.

Example: 2024-07-15
trialDays
​number

Number of trial days granted

Example: 14
cancellationReason
​string

Reason provided when the subscription was cancelled

Example: Customer requested downgrade
effectiveNextBillingDate
​string

The date the NEXT invoice will be created (ISO 8601). This is an invoicing schedule marker, not a payment marker — it does not say what the customer has paid for; see paidThroughDate.

Example: 2024-02-01
paidThroughDate
​string | null

The date the subscription is paid through (ISO 8601): the first day not yet paid for. It is the end of the contiguous run of settled service periods starting at the earliest billed period, so an unpaid period caps it rather than being skipped. Null when the earliest billed period is not settled (or nothing is billed yet). Payment timing never shifts this backwards: a late payment settles exactly the period its invoice stated.

Example: 2024-02-01
commitmentEndDate
​string

End date of the customer commitment period (ISO 8601)

Example: 2025-12-31
originalStartDate
​string

Original start date from source system for migrated subscriptions (ISO 8601)

Example: 2023-01-01
paymentMethodId
​string | null

Assigned payment method ID

Example: 550e8400-e29b-41d4-a716-446655440000
automaticBilling
​boolean

Whether automatic billing is enabled

Example: true
allowedPaymentProviders
​string[]

The connected card provider the buyer may pay this subscription with - at most one. Empty means card payment is off. A subscription needs it before the buyer can add a first card through POST /v1/checkout/subscriptions/{id}/card-window, which otherwise answers 400 SUBSCRIPTION_MANAGE_PROVIDER_NOT_ALLOWED. It allows card payment and attaches no card: the buyer still enters the card themselves. Two providers of the same kind answer 400 INVOICE_MULTIPLE_CARD_PROVIDERS.

Enum values:
ONPAY
STRIPE
Example: ["STRIPE"]
partnerReferenceId
​string | null

Your reconciliation reference (the clientReferenceId you passed at embedded-checkout bind time), echoed back so you can match this subscription to your order. Null for any subscription not created through a partner-bound checkout.

Example: order_7f3a9c21
billingGroupId
​string | null

The billing group this subscription is billed together with others on, or null when it bills on its own. A grouped subscription is billed on the group’s document and charged on the group’s card, so its own paymentMethodId is null and automaticBilling is false. A subscription that merely has other subscriptions billed as part of its own section is not grouped: it reports null and keeps its own card. So does one that IS such a section. A subscription that has joined a group but not yet reached its first shared billing date already reports the group.

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicCreateSubscriptionAddonRequest

planId
​string · required

Subscription plan ID the add-on is created from

Example: 550e8400-e29b-41d4-a716-446655440000
​PublicAssignSubscriptionProductOverride[] · maxItems: 200

Optional quantity and price overrides for products in the add-on’s plan

cadence
​string

How often the add-on bills, as <interval>-<count> (month-1, month-3, year-1). Omit to bill at the plan’s own cadence. Any other value must be one of the plan’s alternative cadences; one the plan does not offer is refused with 400 SHARED_VALIDATION_FAILED, details.reason = ADDON_CADENCE_NOT_ON_PLAN. An add-on on a shorter cadence than its parent bills its cycles on the parent’s invoice between the parent’s own billing dates.

Example: month-1
startDate
​string

Start date (ISO 8601) — when the customer gets the add-on. Defaults to today. The add-on bills on the parent’s invoices, on cycles that break on the parent’s billing dates walked back to this start: an add-on on the parent’s cadence that starts on one of the parent’s billing dates (today included) bills its first full period from that date.

Example: 2024-03-10
prorationBehavior
​string · enum

How to handle a partial period from startDate to the add-on’s first full cycle on the parent’s grid

Enum values:
create_prorations
always_invoice
none
Example: create_prorations
Default: none

PublicUpdateSubscriptionRequest

paymentMethodId
​string | null

The card linked to the subscription. Send null to remove it. You may also echo back the card already linked (a no-op, so a full-object round-trip works), but you cannot attach or change to a different card - cards are attached by the buyer with their consent, so any value other than the currently-linked card or null is rejected with a 400.

Example: null
automaticBilling
​boolean

Whether to automatically charge the saved card during billing

Example: true
allowedPaymentProviders
​string[]

The connected card provider the buyer may pay this subscription with - at most one. Empty means card payment is off. A subscription needs it before the buyer can add a first card through POST /v1/checkout/subscriptions/{id}/card-window, which otherwise answers 400 SUBSCRIPTION_MANAGE_PROVIDER_NOT_ALLOWED. It allows card payment and attaches no card: the buyer still enters the card themselves. Two providers of the same kind answer 400 INVOICE_MULTIPLE_CARD_PROVIDERS.

Enum values:
ONPAY
STRIPE
Example: ["STRIPE"]

PublicBillingGroupEligibilityRequest

mode
​string · enum · required

form asks whether leadSubscriptionId and memberSubscriptionIds could form a group; join asks whether subscriptionIds could join billingGroupId.

Enum values:
form
join
Example: form
leadSubscriptionId
​string

form: the subscription whose terms the group would take.

memberSubscriptionIds
​string[]

form: the subscriptions that would join, 0 to 19. Omitted or empty asks whether the lead could lead a group at all.

billingGroupId
​string

join: the group to join.

subscriptionIds
​string[]

join: the subscriptions that would join, 1 to 19.

PublicBillingGroupRefusal

code
​string · required

The error code the write would answer with.

Example: SUBSCRIPTION_BILLING_GROUP_CURRENCY_MISMATCH
subscriptionId
​string | null

The subscription the refusal is about, or null for a refusal about the whole set (the member limit, a dissolved group).

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicBillingGroupEligibilityResponse

eligible
​boolean · required

True when the write would be accepted today.

Example: true
​PublicBillingGroupRefusal[] · required

Every refusal, at most one per subscription plus at most one about the set. Empty when eligible. A subscription refused for two reasons reports the first; the second appears once the first is fixed.

PublicFormBillingGroupRequest

leadSubscriptionId
​string · required

The subscription whose terms the group takes: its next billing date becomes the group's billing date, and its payment terms, invoice delivery and send offset are written onto every member. Not repeated in memberSubscriptionIds.

Example: 0197A943-2325-7829-B835-B6C71A293065
memberSubscriptionIds
​string[] · required

The other subscriptions of the same customer that join the group: 1 to 19, distinct, none already in a group. A group uses at most 20 slots: one for the lead, one for each member, and one for each add-on any of them brings along.

invoiceTemplateId
​string | null

A consolidated document template for the shared invoice. Omitted or null uses the customer's, then your default.

Example: null
includeMemberDetailsPdf
​boolean

Attach a zip with one detail document per member to each send. Defaults to false.

Example: false

PublicBillingGroupAddon

subscriptionId
​string · required

An add-on of the member it is listed under: its own subscription, whose lines bill inside that member's section of the shared invoice. The same stable id every subscription endpoint takes.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionName
​string · required

The add-on subscription's current name.

Example: Extra seats
planId
​string | null · required

The plan the add-on runs on, or null for an ad-hoc subscription.

Example: 0197A943-2325-7829-B835-B6C71A293065
addedOn
​string · required

The day the add-on was attached to its member (YYYY-MM-DD).

Example: 2026-09-15
effectiveNextBillingDate
​string | null · required

The add-on's next billing date (YYYY-MM-DD), or null when it no longer bills. It bills on its member's invoice on that date, on its own cadence.

Example: 2026-10-01
monthlyRevenue
​string · required

The add-on's own monthly recurring revenue, as a decimal string. Not included in its member's.

Example: 99.00
currency
​string · required

Currency code (ISO 4217). The same as its member’s.

Example: DKK

PublicBillingGroupMemberRef

subscriptionId
​string · required

The subscription, by its stable id.

Example: 0197A943-2325-7829-B835-B6C71A293065
​PublicBillingGroupAddon[] · required

The subscription's add-ons, which came into the group with it and bill inside its section. Empty when it has none.

PublicFormBillingGroupResponse

billingGroupId
​string · required

The new group.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingActiveFrom
​string · required

The day the set starts billing together (YYYY-MM-DD).

Example: 2026-10-01
leadSubscriptionId
​string · required

The subscription whose terms the group took, echoed from the request.

Example: 0197A943-2325-7829-B835-B6C71A293065
​PublicBillingGroupMemberRef[] · required

Every member, the lead included, each with the add-ons it brought into the group.

PublicBillingGroupMember

subscriptionId
​string · required

One of the subscriptions billed together on the group’s document — the same stable id every subscription endpoint takes.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionName
​string · required

The subscription's current name.

Example: Pro plan
billingActiveFrom
​string · required

The day this member starts billing on the group's shared invoice (YYYY-MM-DD). Ahead of today for a member that has joined and still bills on its own until then.

Example: 2026-10-01
monthlyRevenue
​string · required

The member's own monthly recurring revenue, as a decimal string. The group has no revenue of its own; sum the members.

Example: 499.00
currency
​string · required

Currency code (ISO 4217). Every member of a group shares one.

Example: DKK
​PublicBillingGroupAddon[] · required

The member's add-ons, oldest first: subscriptions whose lines bill inside this member's section of the shared invoice. Each holds one of the group’s slots. Empty when it has none.

effectiveNextBillingDate
​string | null

The member's next billing date (YYYY-MM-DD), or null when it no longer bills.

Example: 2026-10-01

PublicBillingGroup

id
​string · required

Billing group id

Example: 0197A943-2325-7829-B835-B6C71A293065
customerId
​string · required

The one customer every member belongs to.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingActiveFrom
​string · required

The day the group started, or starts, billing as a set (YYYY-MM-DD).

Example: 2026-10-01
billsTogether
​boolean · required

True while two or more subscriptions hold a place in the group, including one that starts billing on it later. False once the group has dissolved or only one subscription is left in it: members is then empty, the remaining subscription bills on its own invoice, and the group answers here only because an invoice or credit note names it.

Example: true
billsTogetherUntil
​string | null · required

When the group stopped billing its subscriptions together (ISO 8601): when it dissolved, or otherwise when the last subscription to leave it left. Null while billsTogether is true. Turning a member into another member’s add-on records no date, so a group that stopped billing together that way reports the last departure before it, or null when none left.

Example: 2026-11-14T09:12:00.000Z
slotsUsed
​number · required

The slots the group uses: one per member and one per add-on listed under a member. This is what maxSlots caps, so adding a subscription that carries add-ons uses one slot for it and one for each add-on. Zero when billsTogether is false.

Example: 3
maxSlots
​number · required

The most slots a group can use, add-ons included.

Example: 20
chargesByCard
​boolean · required

True when the next shared invoice is charged to the group's card rather than sent for bank payment. The card is the group's; members hold none of their own.

Example: false
includeMemberDetailsPdf
​boolean · required

Whether each send also attaches a zip with one detail document per member.

Example: false
​PublicBillingGroupMember[] · required

The subscriptions billed together on the group’s document, ordered by the day they start billing on the group and then by id, each with its add-ons. Holds at least two while billsTogether is true, and is empty when it is false.

dissolvedAt
​string | null

When the group dissolved (ISO 8601), or null while the group row stands. A dissolved group keeps answering here because the invoices it issued still name it.

Example: null
invoiceTemplateId
​string | null

The consolidated document template the shared invoice renders from, or null to use the customer's, then your default.

Example: null

PublicAddBillingGroupMembersRequest

subscriptionIds
​string[] · required

Subscriptions of the group's customer that join it: 1 to 19, distinct, none already in a group. The group's billing date does not move; each joiner is moved onto it.

PublicAddBillingGroupMembersResponse

billingGroupId
​string · required

The group joined.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingActiveFrom
​string · required

The day the joiners start billing on the group's invoice (YYYY-MM-DD).

Example: 2026-10-01
​PublicBillingGroupMemberRef[] · required

The subscriptions that joined, each with the add-ons it brought into the group.

PublicRemoveBillingGroupMemberResponse

billingGroupId
​string · required

The group the subscription left.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionId
​string · required

The subscription that left, by its stable id.

Example: 0197A943-2325-7829-B835-B6C71A293065
groupDissolved
​boolean · required

True when this departure left fewer than two subscriptions billing together, so the group ended: the remaining subscription bills on its own document from its next billing date.

Example: false

CheckoutReadinessStripeConnect

connected
​boolean · required

Whether an active Stripe Connect account backs the card rail.

status
​string | null · required

The connected account’s status, when one exists.

settlementCurrency
​string | null · required

Settlement currency of the connected account.

allowCrossCurrencyCharges
​boolean · required

Whether cross-currency charges are enabled on your Stripe account.

chargeableCurrencies
​string[] · required

Catalogue currencies that pass the charge predicate — a card step offered in any other currency would be refused.

CheckoutReadinessResponse

subscriptionLicense
​boolean · required

Whether you hold the Subscription license — without it nothing is checkoutable.

publishedPlans
​number · required

Number of published plans.

checkoutablePlans
​number · required

Number of published plans with a sellable item — checkoutable on this surface.

generalTermsPublished
​boolean · required

Informational, never a gate: whether published GENERAL terms exist in LedgerBee. When true, quote and session responses carry them and confirm records per-version acceptance evidence; when false, you host your own terms and confirm records your acceptance assertion.

​CheckoutReadinessStripeConnect · required
embeddableOrigins
​string[] · required

The configured embeddableOrigins allowlist — required for HOSTED card windows’ returnUrl.

CheckoutQuantitySelection

priceId
​string · uuid · required

The snapshot price id the quantity applies to.

quantity
​number · required

The buyer-chosen quantity. Clamped to the card’s quantity rules server-side.

CheckoutAddonSelection

planId
​string · uuid · required

The add-on plan the buyer takes: one of the catalogue item’s addons[].planId. An id the item does not offer is refused with PORTAL_CHECKOUT_ADDON_NOT_OFFERED (details.reason: NOT_ON_CARD, NO_CADENCE_AT_CARD_PERIOD or CURRENCY_UNAVAILABLE; details.planId names the add-on).

​CheckoutQuantitySelection[]

Buyer-chosen quantities for the add-on’s quantity-bearing products, keyed by the add-on’s own snapshot price ids. They follow the add-on’s own quantity rules (the quote’s addonQuantityRows lists them, matched on planId) and are clamped to those rules server-side. Absent or empty → the add-on’s default quantities.

CheckoutQuoteRequest

planVersionId
​string · uuid · required

The plan version to quote (from the catalogue).

planItemId
​string · uuid · required

The pricing-card item on that version.

country
​string · required

Buyer country, ISO 3166-1 alpha-2 — REQUIRED so VAT resolves exactly.

Example: DK
customerType
​string · enum · required

Whether the buyer is a business or a private person.

Enum values:
BUSINESS
PRIVATE_PERSON
vatNumber
​string

The buyer’s VAT number (BUSINESS only — refused otherwise).

startDate
​string

Requested start date (YYYY-MM-DD). Defaults to today; never in the past.

currency
​string

Presentment currency (ISO 4217). Must be in the card’s availableCurrencies; refused with PORTAL_CHECKOUT_CURRENCY_NOT_AVAILABLE otherwise. Absent → the card’s own currency.

Example: DKK
​CheckoutQuantitySelection[]

Buyer-chosen quantities for quantity-bearing products.

​CheckoutAddonSelection[]

Add-ons the buyer takes with the plan, each named by the catalogue item’s addons[].planId, with optional quantities. An add-on checkout sells bills at the plan’s period, on the same invoice as the plan. The same planId twice is refused with VALIDATION_FAILED. Absent or empty → the plan alone.

discountCode
​string · maxLength: 64

A discount code the buyer typed. Priced onto the first period (quote.discount states what it takes off, until when, and whether the first period is charged to the card) and attached to the subscription for its periods. An unknown, used-up or inapplicable code is refused with its DISCOUNT_* code; each request naming a code spends one use of the API key’s code-attempt budget (429 DISCOUNT_CHECK_RATE_LIMITED).

Example: WELCOME10
billingDirection
​string · enum

Whether the subscription bills each period in advance or in arrears. advance: the first period is invoiced on firstInvoiceDate, which is at confirm for a start date of today. arrears: nothing is invoiced at confirm, and the first invoice comes when the first period ends (firstInvoiceDate). Absent → the company’s default billing direction. The session pins the direction; confirm creates the subscription in it.

Enum values:
advance
arrears
Example: advance
language
​string · enum

Language for display texts, terms and the disclosure.

Enum values:
en
da

CheckoutQuoteResponse

quote
​object · required

First-period quote — the SAME payload the hosted portal renders (display parity is structural): plan title/description + display lines, pricing (subtotal, per-rate VAT breakdown, total, currency), quantity rows, the quantity rows of every add-on the card offers (addonQuantityRows, each naming its add-on by planId; addonSubscriptionId carries the same value), terms bodies, the resolved start date, allowed payment methods and cardPaymentsEnabled. With a discountCode, discount states what the code takes off the first period before VAT (firstPeriodAmountOff), the day the regular price starts (endsAt, null when it never ends) and whether the discounted first period is charged to the card (firstPeriodChargedToCard); plan.items keep the regular price and pricing is net of the discount. Null without a code.

firstPeriodChargeable
​boolean · required

False when the first period nets to zero (free trial / 100% discount), when a discount code takes it below what a card can be charged while the regular price is not, or when the subscription bills in arrears (its first invoice is charged to the saved card on firstInvoiceDate). The card window still opens save-only — the card is stored for the first real charge and nothing is authorized ("no charge today"). A first invoice a discount code takes below the card minimum is then paid by bank transfer and the card is charged from the first full-price period; in arrears the first invoice is charged to the saved card on firstInvoiceDate.

billingDirection
​string · enum · required

The direction the subscription would bill in: the request’s billingDirection, else the company’s default.

Enum values:
advance
arrears
firstInvoiceDate
​string · required

The day the first invoice is issued (YYYY-MM-DD). advance: today for a start date of today, or the start date less the company’s send offset for a later one. arrears: the end of the first period. The first invoice bills the first period quote.pricing states.

Example: 2026-11-15

CheckoutBuyer

customerType
​string · enum · required

Whether the buyer is a business or a private person.

Enum values:
BUSINESS
PRIVATE_PERSON
name
​string · required

Company name (BUSINESS) or the person’s full name (PRIVATE_PERSON).

Example: Acme ApS
email
​string · required

The buyer’s identity email: consent evidence is recorded against it and the self-service manage link is sent to it.

Example: buyer@example.com
customerGroupId
​string · uuid · required

REQUIRED: one of your customer groups, for classifying the created customer. Discover valid groups via GET /v1/customers/groups. Unknown ids are refused with PORTAL_CHECKOUT_CUSTOMER_GROUP_INVALID.

country
​string · required

Buyer country, ISO 3166-1 alpha-2 — drives VAT resolution.

Example: DK
vatNumber
​string

The buyer’s VAT number (BUSINESS only — refused otherwise). Checked against the country’s published format; registry (VIES) verification is not performed.

Example: DK12345678
address
​string

Billing address line.

postalCode
​string

Billing postal code.

city
​string

Billing city.

billingEmail
​string

Where invoices, receipts and payment notices are sent when it differs from the buyer’s identity email. Absent → the identity email receives them.

Example: billing@example.com
existingCustomerId
​string · uuid

An EXISTING customer this purchase belongs to, so a returning buyer keeps one record instead of accumulating duplicates. Reuse is authorized at confirm: the buyer’s email must already hold the customer (or nobody may).

CheckoutSessionRequest

planVersionId
​string · uuid · required

The plan version to check out (from the catalogue).

planItemId
​string · uuid · required

The pricing-card item on that version.

​object · required

The buyer — plain request data; no tokens, no ceremony.

startDate
​string

Requested start date (YYYY-MM-DD). Defaults to today; never in the past.

currency
​string

Presentment currency (ISO 4217); must be in the card’s availableCurrencies.

​CheckoutQuantitySelection[]

Buyer-chosen quantities.

​CheckoutAddonSelection[]

Add-ons the buyer takes with the plan, each named by the catalogue item’s addons[].planId, with optional quantities. An add-on checkout sells bills at the plan’s period, on the same invoice as the plan. The same planId twice is refused with VALIDATION_FAILED. Absent or empty → the plan alone. The session pins the selection; confirm sells exactly what was pinned.

discountCode
​string · maxLength: 64

A discount code the buyer typed. Priced onto the first period (quote.discount states what it takes off, until when, and whether the first period is charged to the card) and attached to the subscription for its periods. An unknown, used-up or inapplicable code is refused with its DISCOUNT_* code; each request naming a code spends one use of the API key’s code-attempt budget (429 DISCOUNT_CHECK_RATE_LIMITED).

Example: WELCOME10
billingDirection
​string · enum

Whether the subscription bills each period in advance or in arrears. advance: the first period is invoiced on firstInvoiceDate, which is at confirm for a start date of today. arrears: nothing is invoiced at confirm, and the first invoice comes when the first period ends (firstInvoiceDate). Absent → the company’s default billing direction. The session pins the direction; confirm creates the subscription in it.

Enum values:
advance
arrears
Example: advance
expiresInMinutes
​number · min: 5 · max: 1440

Session TTL in minutes. Default 30.

reference
​string

Your own order/cart id (Stripe client_reference_id parity) — echoed on session reads, the confirm response and every checkout.* webhook payload.

language
​string · enum

Language for display texts, terms and the disclosure.

Enum values:
en
da

CheckoutPinnedAddon

planId
​string · uuid · required

The add-on plan (catalogue addons[].planId).

​CheckoutQuantitySelection[] · required

The quantities the mint request named for this add-on. Empty → it bills at its default quantities.

CheckoutPinned

currency
​string · required

Pinned presentment currency (ISO 4217).

Example: DKK
netMajor
​number · required

Pinned first-period net, in major units.

totalGrossMajor
​number · required

Pinned first-period total (gross where VAT resolved), in major units. Confirm re-runs the billing engine against the pinned inputs and refuses a different output with PORTAL_CHECKOUT_AUTHORIZED_AMOUNT_CHANGED.

startDate
​string · required

Pinned start date (YYYY-MM-DD).

disclosureVersion
​string · required

Pinned recurring-billing disclosure version.

disclosureText
​string · required

The server-rendered recurring-billing disclosure text for the pinned version — render it (or your own equivalent) before the buyer accepts recurring billing.

acceptedTermsVersionIds
​string[] · required

The terms version ids pinned at mint. Acceptance evidence is written against exactly these; a terms republish mid-session makes confirm refuse with a 410 — re-mint the session.

expiresInMinutes
​number · required

The session TTL that was applied, in minutes.

​CheckoutPinnedAddon[] · required

The add-ons the session pinned, as the mint request named them, each with the quantities it was sent with. Empty when the plan is sold alone. Confirm creates exactly these, billed at the plan’s period on the plan’s invoice.

discountCode
​string | null · required

The discount code the session pinned, as the mint request sent it; null when none was applied. The card window and confirm judge it again: a code that ran out since the mint is refused there with its DISCOUNT_* code and nothing is created.

billingDirection
​string | null · enum · required

The billing direction the session pinned: the mint request’s billingDirection, else the company’s default at mint. Confirm creates the subscription in it, whatever the company default says by then.

Enum values:
advance
arrears
firstInvoiceDate
​string | null · required

The day the first invoice is issued (YYYY-MM-DD), as the quote states it for the pinned direction. Confirm creates the subscription with the send offset this date was computed from, whatever the company setting says by then.

Example: 2026-11-15

CheckoutSessionResponse

sessionId
​string · required

The opaque session id — your handle for every later call.

expiresAt
​string · required

When the session expires (ISO 8601). Expired sessions answer 410.

reference
​string | null · required

Your reference, echoed.

quote
​object · required

The same first-period quote payload POST /v1/checkout/quote returns.

​object · required

What the session pinned — render exactly this.

firstPeriodChargeable
​boolean · required

False when the pinned first period nets to zero, when a discount code takes it below what a card can be charged, or when the session bills in arrears (save-only card window).

CheckoutSessionView

sessionId
​string · required

The opaque session id.

expiresAt
​string · required

When the session expires (ISO 8601).

reference
​string | null · required

Your reference, echoed.

planVersionId
​string · uuid · required

The pinned plan version.

planItemId
​string · uuid · required

The pinned pricing-card item.

buyer
​object · required

The buyer payload the session was minted with.

​CheckoutPinned · required
firstPeriodChargeable
​boolean · required

False when the pinned first period nets to zero, when a discount code takes it below what a card can be charged, or when the session bills in arrears.

cardWindowOpened
​boolean · required

Whether a card window has been opened on this session.

CheckoutCardWindowRequest

uiMode
​string · enum

How the buyer meets Stripe's card form: 'embedded' (default) returns a client secret you mount on your page with Stripe.js; 'hosted' returns a redirect URL to checkout.stripe.com.

Enum values:
embedded
hosted
returnUrl
​string

Where Stripe sends the buyer back after a HOSTED window. REQUIRED for hosted (its origin must be on your embeddableOrigins allowlist); refused for embedded, which completes in-page.

CheckoutCardWindowResponse

mode
​string · enum · required

STRIPE_EMBEDDED → mount with clientSecret; REDIRECT → navigate the buyer to redirectUrl.

Enum values:
STRIPE_EMBEDDED
REDIRECT
handoffToken
​string · required

The card handoff token. It outlives the session: carry it into a fresh session’s confirm after an expiry and the buyer never re-enters card details.

expiresAt
​string · required

When the provider window expires (ISO 8601).

clientSecret
​string

Stripe embedded Checkout client secret (STRIPE_EMBEDDED only).

publishableKey
​string

Publishable key for Stripe.js (STRIPE_EMBEDDED only).

stripeAccountId
​string

The connected Stripe account id for Stripe.js (STRIPE_EMBEDDED only).

redirectUrl
​string

The hosted window URL to send the buyer to (REDIRECT only).

CheckoutCardDisplay

label
​string · required

Ready-to-render label.

Example: Visa •••• 4242
cardType
​string | null · required

Card network/brand, if known.

cardMask
​string | null · required

Masked card number, if known.

accountIdentifier
​string | null · required

Masked identifier for non-card methods (e.g. a Link email).

CheckoutCardStatusResponse

status
​string · enum · required

PENDING: keep polling (or listen for checkout.card_ready). CARD_READY: confirm may proceed. EXPIRED: the window lapsed — open a fresh one.

Enum values:
PENDING
CARD_READY
EXPIRED
card
​object | null

The captured card (CARD_READY only).

CheckoutCardReleaseResponse

status
​string · enum · required

SAVE_ONLY: the card survives — re-quote, re-mint and confirm; the first charge is sized at billing. RECAPTURE_REQUIRED: discard the card and open a fresh window.

Enum values:
SAVE_ONLY
RECAPTURE_REQUIRED

CheckoutConfirmRequest

sessionId
​string · required

The session to confirm. Single-use: consumed whatever the outcome.

paymentMethod
​string · enum · required

The payment rail the buyer chose.

Enum values:
CARD
INVOICE
termsAccepted
​boolean · required

Your assertion that the buyer accepted the pinned terms on your surface. Must be true — false/absent refuses with PORTAL_CHECKOUT_CONSENT_REQUIRED.

acceptedAt
​string · required

When the buyer accepted (ISO 8601). Evidence, not authority — implausible instants (future, or older than an hour) are replaced with the server’s own clock.

recurringConsentAccepted
​boolean

Your assertion that the buyer accepted recurring billing. REQUIRED true on the CARD rail.

cardHandoffToken
​string

A card handoff token carried from an EXPIRED session (the edit-after-card loop) — the captured card survives into this confirm. Defaults to the card window this session opened.

CheckoutConfirmResponse

subscriptionId
​string · uuid · required

The created subscription.

reference
​string | null · required

Your reference, echoed.

billingPending
​boolean · required

True when the first invoice is billed asynchronously after this response (INVOICE rail, and CARD confirms whose charge is queued). Listen for subscription.billed / poll the subscription.

PublicCheckoutVouchPrefill

customerType
​string

BUSINESS or PRIVATE_PERSON.

Example: BUSINESS
companyName
​string

Company name, for a BUSINESS buyer.

Example: Acme ApS
firstName
​string
lastName
​string
vatNumber
​string
address
​string
postalCode
​string
city
​string
countryCode
​string

ISO 3166-1 alpha-2.

Example: DK

PublicMintCheckoutVouchRequest

email
​string · required

The buyer you are vouching for. This becomes their portal login identity, so the embedded checkout pre-fills it and LOCKS it — a buyer who is not this person uses the checkout's own escape rather than typing over it, and a confirm carrying a different address is refused. Distinct from contactEmail below, which is only where the paperwork goes.

Example: alice@acme.example
contactEmail
​string

Where invoices and receipts should go, when that differs from the login identity above. Written to the customer's default contact. Omit and billing follows email.

Example: billing@acme.example
customerId
​string

A customer you already hold the LedgerBee id for - typically one whose earlier subscription ended and who is now buying again. The purchase lands on that record instead of a second one, so a returning buyer does not accumulate duplicates. The customer must exist, be active, and belong to the API key's tenant; otherwise the mint returns 404 CUSTOMER_NOT_FOUND and nothing is minted.

This does not make the checkout read-only: the Details step still shows only what you prefilled, never the stored record, and whatever the buyer submits is written over the record at confirm. Omit for a first-time buyer - creating the customer at confirm is the default.

Example: 550e8400-e29b-41d4-a716-446655440010
​object

Optional starting values for the checkout Details step. Every field stays EDITABLE — this is a convenience for the buyer, never an assertion of fact, and whatever they submit is what we persist. Anything you omit renders empty.

allowIdentityChange
​boolean

Whether the buyer may reject the vouched identity and continue as an anonymous buyer (the checkout shows a "Not you?" escape). It does NOT let them type a different address - the vouch is dropped and the checkout restarts unvouched, because we cannot vouch for someone we were not told about. Defaults to true: a buyer who genuinely is not the person you named has no other way out, and stranding them is worse than showing a link. Set false when your authentication makes a wrong identity impossible.

Example: true
Default: true
clientReferenceId
​string

Your own opaque reference for this order (Stripe client_reference_id parity). It rides onto the created subscription (as partnerReferenceId), into every later subscription webhook, AND onto the customer.created event — which is the only field that maps a brand-new customer back to the cart that created it. Pass it. Server-to-server only; it never reaches a client/iframe surface. Max 200 chars, [A-Za-z0-9_-] only.

Example: order_7f3a9c21
discountCode
​string · maxLength: 64

A discount code to apply for this buyer, matched without regard to case or surrounding spaces. It is checked when you mint: a code that is unknown, switched off, expired, for another customer or with no use left is refused with its DISCOUNT_* code, and spends one use of the code-attempt budget this API key shares with the cart check and code lookup (429 DISCOUNT_CHECK_RATE_LIMITED). The embedded checkout then opens with the code applied to the plan the buyer picks; the buyer can remove it. A code that does not cover that plan, or has run out by then, is left off and the regular price shown.

Example: WELCOME10

PublicMintCheckoutVouchResponse

checkoutVouchToken
​string · required

Opaque, single-use, 60-second vouch reference. Return it from your page's fetchBindToken provider at checkout-start; the embedded checkout redeems it server-side. Mint it just-in-time — the TTL is deliberately shorter than a page's lifetime, and the provider is re-invoked per checkout.

Example: k7Fq2mZ8x1vN4pQ...
expiresAt
​string · required

ISO 8601 expiry of the reference above.

Example: 2026-08-07T12:01:00.000Z

DefaultContactDto

name
​string · required

Contact name

Example: John Doe
email
​string

Contact email

Example: john@acme.com
phone
​string

Contact phone number

Example: +45 12345678

CreateCustomerRequestDto

customerType
​string · enum · required

Specifies whether the customer is a business or a private person

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
Default: BUSINESS
name
​string · required

Customer name

Example: Acme Corporation
vatZone
​string · enum · required

VAT zone classification

Enum values:
domestic
eu
abroad
domestic_without_vat
eu_at
eu_be
eu_bg
eu_cy
Example: domestic
customerGroupId
​string · required

Customer group ID

Example: 01HQ3Y1234567890ABCDEFGHIJ
countryCode
​string · required

Two-letter country code

Example: DK
customerNumber
​string

Unique customer number. Omit it, or send an empty value, to have the next number assigned from the company customer sequence.

Example: 1042
email
​string

Email address

Example: contact@acme.com
phone
​string

Phone number

Example: +45 12345678
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
vatNumber
​string

VAT registration number

Example: DK12345678
eanNumber
​string

EAN/GLN number for Peppol routing

Example: 5790000000001
externalSystemId
​string

External system identifier for tracking the customer across other systems. Unique per company.

Example: crm-12345
website
​string

Website URL

Example: https://acme.com
notes
​string · maxLength: 2000

Additional notes

Example: Key account customer
locale
​string

Locale for formatting invoice data

Example: da-DK
language
​string

Language code for communications

Example: da
creditLimit
​object · min: 0

Credit limit

Example: 50000
openingBalance
​object

Opening balance in the company base currency, seeding receivables that predate LedgerBee. Signed: positive = the customer owes us, negative = a credit position. Folds into the entity balance only (not into invoiced totals or overdue ageing).

Example: 1000
paymentTerms
​number · min: 0

Payment terms in days

Example: 30
paymentTermType
​string · enum

Payment term type. Defaults to NET_DAYS.

Enum values:
NET_DAYS
CASH
RUNNING_MONTH_PLUS_DAYS
Default: NET_DAYS
defaultCashAccountId
​string | null

Default cash payment account ID. Only relevant for CASH payment terms. Send null to clear.

defaultCurrency
​string · pattern: ^[A-Za-z]{3}$

The customer's default invoicing currency, ISO 4217 alpha-3. Omit it, or send a blank one, to leave the answer to the server.

Example: DKK
poNumber
​string

Default purchase-order number ("PO-nr.") prefilled onto sales documents

Example: PO-12345
ourReference
​string

Default "Vores ref." (our-side reference) prefilled onto sales documents

Example: Jane Doe
invoiceDeliveryTypePreference
​string | null · enum

Preferred invoice delivery type for this customer. If set, overrides the app company default for billing.

Enum values:
Email
Sproom
reminderConfigId
​string | null

Reminder config profile ID. Send null to clear.

followsDefaultReminderConfig
​boolean

The customer follows the company's default reminder profile: whichever profile is marked default when a reminder is due. A specific reminderConfigId wins over it, and setting one clears this. With neither, the customer gets no reminders.

isActive
​boolean

Whether the customer is active

Example: true
Default: true
​object

Default contact to create for the customer. If not provided, customer name/email/phone will be used as fallback.

invoiceTemplateId
​string

Invoice PDF template override

creditNoteTemplateId
​string

Credit note PDF template override

quoteTemplateId
​string

Quote PDF template override

orderConfirmationTemplateId
​string

Order confirmation PDF template override

parentInvoiceTemplateId
​string | null

Parent single invoice PDF template override. Send null to clear.

includeChildDetailsPdf
​boolean

Whether to attach a zip of per-child detail PDFs when sending consolidated invoices

selfServiceDetailsEnabled
​boolean

Whether this customer's portal users may fill in their own billing details (VAT number, street, postal code, city), both on the portal's Company settings page and during checkout, instead of only confirming a read-only copy of the record. Country and customer type stay operator-owned either way, which is what keeps them inside the VAT regime the operator assigned.

parentCustomerId
​string | null

Parent customer ID. Send null to clear.

billingRelationship
​string · enum

Billing relationship

Enum values:
self
parent_pays
consolidationMode
​string | null · enum

Consolidation mode. Send null to clear.

Enum values:
single_invoice
per_child_invoice
billingDay
​number | null

Billing day (1-28). Required for single invoice mode. Send null to clear.

​object

Key-value metadata to attach to the customer

PublicProvisionCustomerRequest

email
​string · required

Email of the portal user to grant access to. A credential-less portal user is created if none exists.

Example: jane.doe@acme.example
customerId
​string

The customer's LedgerBee id. The customer must already exist in the API key's tenant; this endpoint never creates one from an id (a 404 CUSTOMER_NOT_FOUND is returned if it doesn't). Supply either customerId or a customer payload.

Example: 550e8400-e29b-41d4-a716-446655440010
​object

A customer to upsert, identified idempotently by its customerNumber: an existing customer of the API key's tenant with that number is reused, otherwise a new one is created with this payload. Same shape as the gated POST /customers request (so vatZone and countryCode are required here). If customer.email is omitted, the portal-user email below is used as the customer's contact email (and its auto-created default contact). Supply either this or customerId.

role
​string · enum

Membership role to grant. Defaults to USER; the org's first member is force-assigned OWNER regardless.

Enum values:
OWNER
ADMIN
BILLING_ADMIN
USER
Example: USER
userName
​string

Display name of the portal user (set on first creation).

Example: Jane Doe
organizationDisplayName
​string

Display name for the customer organization (first-invite bootstrap).

mintHandoff
​boolean

When true, also mint a back-channel handoff reference in the same call (one round-trip "Go to portal"). Requires the API key to ALSO carry the portal-sso-mint scope, and the tenant to have back-channel handoff enabled.

Example: false
sub
​string

The partner's stable, unique user identifier — required when mintHandoff is true; keys the handoff identity (with the per-tenant handoff issuer).

Example: partner-user-7f3a9c21
mintCheckoutBindToken
​boolean

When true, also mint a one-time CHECKOUT-BIND reference in the same call — an opaque token the partner's fetchBindToken provider returns to the embed at checkout-start so the embedded checkout subscribes directly against THIS customer instead of staging an anonymous magic-link signup. Requires the API key to ALSO carry the portal-sso-mint scope. Independent of mintHandoff (login): a checkout-bind ref can never mint a login session.

Example: false
clientReferenceId
​string

Your own opaque reference for this order (Stripe client_reference_id parity), e.g. your internal order or cart id. It rides the minted checkout-bind ref onto the resulting subscription (as partnerReferenceId) and into every later subscription webhook, so you can reconcile our subscription to your record. Server-to-server only — it never reaches a client/iframe surface. Max 200 chars, [A-Za-z0-9_-] only.

Example: order_7f3a9c21

PublicProvisionCustomerResponse

customerId
​string · required

Resolved customer id.

Example: 550e8400-e29b-41d4-a716-446655440010
customerCreated
​boolean · required

Whether a new customer was created (false = an existing one was reused).

Example: true
portalUserId
​string · required

Resolved portal user id.

Example: 550e8400-e29b-41d4-a716-446655440020
membershipId
​string · required

The active organization membership id.

Example: 550e8400-e29b-41d4-a716-446655440030
role
​string · enum · required

The granted membership role.

Enum values:
OWNER
ADMIN
BILLING_ADMIN
USER
Example: OWNER
handoffRef
​string | null

Opaque, single-use, 60s handoff reference — present only when mintHandoff was requested. Null otherwise.

Example: Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s
handoffExpiresAt
​string | null

ISO-8601 expiry of the handoff reference, when minted. Null otherwise.

Example: 2026-06-04T12:34:56.000Z
checkoutBindToken
​string | null

Opaque, single-use, 60s checkout-bind reference — present only when mintCheckoutBindToken was requested. Null otherwise. The partner's fetchBindToken provider returns this to the embed at checkout-start; the embedded checkout redeems it to subscribe directly against this customer.

Example: Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s
checkoutBindExpiresAt
​string | null

ISO-8601 expiry of the checkout-bind reference, when minted. Null otherwise.

Example: 2026-06-04T12:34:56.000Z

PublicResolvePortalPlansRequest

customerType
​string · enum

Buyer customer type for gross-price resolution.

Enum values:
BUSINESS
PRIVATE_PERSON
Example: BUSINESS
vatNumber
​string

Buyer VAT number for gross-price resolution. Accepted only with customerType: 'BUSINESS' (a coded 400 otherwise). Requires a country hint to have any effect. On the resolve read it is ignored when customerId is supplied — a customer-backed resolve stays net-only.

Example: DK12345678
currency
​string

Presentment currency for every card's pricing. Must be in each card's availableCurrencies; cards that can't resolve it render null prices. Defaults to each card's own currency.

Example: EUR
customerId
​string

The buyer's LedgerBee customer id (an identity HANDLE — the server hydrates customer group / country / type from it; raw rule attributes are never accepted). The customer must exist in the API key's tenant (a 404 CUSTOMER_NOT_FOUND otherwise). When present, the server-resolved identity wins and the countryCode/customerType hints are ignored.

Example: 550e8400-e29b-41d4-a716-446655440010
buyerEmail
​string

The specific person (their email) the partner is acting on behalf of under customerId — e.g. the user currently signed in on the partner's site. Bound into the catalog token: when that token is later exchanged for a portal login handoff, THIS person is logged in (or bootstrapped credential-less under the customer's organization), instead of the customer's contact email / first member. Ignored without customerId; does not affect catalog visibility.

Example: buyer@partner.example
countryCode
​string

ISO 3166-1 alpha-2 country hint for the no-customer-yet preview (drives the country rule clause). Ignored when customerId is supplied.

Example: DK
planIds
​string[]

Resolve only these plan ids. Omit to resolve every ACTIVE plan of the tenant. Each must be a uuid.

Example: ["550e8400-e29b-41d4-a716-446655440100"]
language
​string · enum

Language the resolved cards are localized to. Defaults to en.

Enum values:
en
da
Example: en
discountCode
​string · maxLength: 64

A discount code a buyer typed. Each SUBSCRIPTION card then carries discount: the code priced for that card's first period exactly as the checkout quote prices it (the first invoice before VAT with the code, firstPeriodNetMinor; what the code takes off it, firstPeriodAmountOffMinor; and the day the regular price starts, endsAt). A card the code cannot price carries discount: null. A code that is unknown, used up or not for this buyer is refused with its DISCOUNT_* code. A request naming a code spends one use of the code-attempt budget this API key shares with the checkout quote, the session and the discount cart check. Without it, or with a code of spaces alone, no card carries discount. With customerId, that customer's own uses of the code count against its per-customer limit.

Example: WELCOME10

PublicPortalPlanItemFeature

label
​string · required

Translated label, resolved for the request language.

iconKey
​string | null · required

Optional Lu* icon key picked by the operator; null = default check icon.

Example: null

PublicPortalPricingTier

fromQuantity
​number · required

First quantity covered by this tier.

Example: 0
toQuantity
​number | null · required

Last quantity in this tier; null for the final unbounded tier.

Example: 100
unitAmountMinor
​number | null · required

Per-unit amount in minor units; null when not set for this tier.

Example: 1000
flatFeeMinor
​number | null · required

Flat fee for the tier in minor units; null when not set.

Example: null

PublicPortalPlanItemProduct

priceId
​string · required

Snapshot price id — stable identity / render key.

label
​string · required

Product display name (frozen product name, falling back to the price nickname).

description
​string | null · required

Operator-authored product description; null when unset.

Example: null
quantity
​number · required

Template quantity bundled in the plan. Defaults to 1 when unset.

Example: 1
pricingModel
​string · required

Pricing model: 'flat_rate' | 'graduated' | 'package' | 'volume'.

Example: flat_rate
kind
​string · enum · required

'RECURRING' for period-billed lines, 'ONE_OFF' for one-time charges, 'METERED' for usage lines. A METERED line is period-bound like a recurring one, but its priceMinor is a rate per unit consumed rather than a period amount, so it contributes nothing to a period total.

Enum values:
RECURRING
ONE_OFF
METERED
unitPriceMinor
​number | null · required

Headline unit price in minor units (first-unit "from" price for tiered models); null when unresolvable.

Example: 1000
currency
​string · required

Currency code for unitPriceMinor.

Example: DKK
tiered
​boolean · required

True for tiered models — the card prefixes the price with a "from" marker.

​PublicPortalPricingTier[] · required

Tier ladder for tiered models, resolved for the currency (minor units). Empty for flat_rate products.

billingInterval
​string | null · required

Recurring interval (e.g. 'month'); null for one-time charges.

Example: month
billingIntervalCount
​number | null · required

Interval count (e.g. 1, 3, 12); null for one-time charges.

Example: 1

PublicPortalPlanItemVat

resolved
​boolean · required

Whether VAT resolved for the supplied buyer hints. false = every gross field below is null.

grossPriceMinor
​number | null · required

Gross headline price (minor units) for the active cadence; null when unresolved.

Example: 12375
​object · required

Gross per cadence, mirroring cadencePrices. Empty object when unresolved.

Example: {"month-1":12375,"year-1":123750}
grossOneTimeMinor
​number | null · required

Gross one-time charges total (minor units), mirroring oneTimeMinor; null when unresolved.

PublicPortalPlanItemAddon

planId
​string · uuid · required

The add-on's plan id — send it back as addons[].planId on the checkout quote and session to pick the add-on.

sourceSubscriptionId
​string · uuid · required

The same value as planId, kept for compatibility. New integrations read planId.

name
​string · required
description
​string | null · required
priceMinor
​number | null · required

Recurring price per period, minor units, net. Null when not flat-rate (metered / tiered).

cadenceKey
​object · required

The cadence key the price is for — the card's canonical one.

Example: month-1
oneTimeMinor
​number | null · required

One-time charges on the first invoice, minor units, net.

​PublicPortalPlanItemProduct[] · required

PublicPortalPlanItemDiscount

code
​string · required

The code as the company wrote it.

Example: WELCOME10
name
​string · required

The discount's name.

Example: Welcome offer
type
​string · enum · required

How the discount is measured: a share of the price, an amount per period, or an amount per unit.

Enum values:
percentage
fixed
per_unit
firstPeriodNetMinor
​number · required

The card's first invoice with the code, before VAT, in minor units of the card's currency. One-time charges on that invoice are included.

Example: 8000
firstPeriodAmountOffMinor
​number · required

What the code takes off that invoice, before VAT, in minor units of the card's currency. Positive; 0 when the code touches none of the card's lines.

Example: 2000
endsAt
​string | null · required

YYYY-MM-DD: a period that starts on or after this day is billed at the regular price, for a checkout that starts today. Null when the discount has no end.

Example: 2026-11-14
durationInPeriods
​number | null · required

How many billing periods the discount lasts; null when it has no end.

Example: 1

PublicPortalPlanItem

id
​string · required
itemType
​string · enum · required

Card kind: 'SUBSCRIPTION' (priced card, CTA starts checkout) or 'CUSTOM_CTA' (subscription-less card whose CTA navigates ctaLink).

Enum values:
SUBSCRIPTION
CUSTOM_CTA
sourceSubscriptionId
​string | null · required

Source subscription id (the chosen template, sent back on signup); null for CUSTOM_CTA items.

ctaLink
​string | null · required

Link the CTA navigates to (https / relative / mailto: / tel:); non-null only for CUSTOM_CTA items.

ctaPresetKey
​string | null · required

CTA preset ('contactUs' | 'bookDemo' | 'scheduleTime'); null for subscription cards or unmatched labels.

displayOrder
​number · required
planName
​string · required

Plan name (operator-edited title, language-resolved, falling back to the snapshot name).

description
​string | null · required

Short pitch (language-resolved).

​array · required

Bullet list; each entry is a plain string or a { label, iconKey } object, already resolved per language.

isMostPopular
​boolean · required

Whether to render the "recommended" treatment.

ctaLabel
​string | null · required

CTA copy; null falls back to the SPA default getStarted label.

titleColor
​string | null · required

Optional inline title color override (any CSS color).

ctaColor
​string | null · required

Optional inline CTA color override (any CSS color).

planIconKey
​string | null · required

Operator-picked glyph key for the plan-card header icon.

planIconColor
​string | null · required

Optional inline override for the plan-card header icon color.

hidePlanIcon
​boolean · required

When true, the card renders without the header icon.

featureIconColor
​string | null · required

Optional inline override for every feature-bullet icon color.

currency
​string · required

Currency code for priceMinor / oneTimeMinor.

Example: DKK
availableCurrencies
​string[] · required

Currencies this card can be presented (and sold) in — the intersection across recurring products and allowed cadences of the currencies every price resolves for. For SUBSCRIPTION items it always contains currency; a requested checkout currency outside this set is a coded 400. CUSTOM_CTA items carry no pricing, so theirs is empty (and currency is '').

Example: ["DKK","EUR"]
priceMinor
​number | null · required

Headline price in minor units; null when no canonical recurring price exists.

Example: 9900
cadenceKey
​string | null · required

Cadence key driving priceMinor (e.g. 'month-1'); null when priceMinor is null.

Example: month-1
allowedCadences
​string[] · required

Cadences this item supports (drives the row-level cadence selector); empty when none is recoverable.

Example: ["month-1","year-1"]
defaultCadence
​string | null · required

Cadence selected on first render; null when no cadence is recoverable for this item.

Example: month-1
​object · required

Price in minor units keyed by cadence; a present key with a null value is allowed-but-unpriced (renders as em-dash).

Example: {"month-1":9900,"year-1":99000}
oneTimeMinor
​number | null · required

One-time charges total in minor units (setup fees); null = no one-time line.

​array | null · required

Products bundled in this tier (ACTIVE cadence). null for CUSTOM_CTA items; [] for a subscription tier with no products.

​object · required

Product composition resolved per cadence, keyed by cadence; {} for CUSTOM_CTA items.

​object · required

Buyer-specific VAT projection. resolved=false (all gross fields null) when the read carried no buyer hints, a rate could not be resolved, or the buyer zone is OSS-overridable — net figures stay authoritative either way.

​PublicPortalPlanItemAddon[] · required

Add-on plans a buyer may take with this card, priced at the card's canonical cadence in its presented currency. [] for CUSTOM_CTA items and cards with none.

discount
​object | null

The discountCode the read named, priced for this card's first period exactly as the checkout quote prices it. Present only when the read named a code; null on a card the code cannot price (a CUSTOM_CTA card, or a discount with no amount in the card's currency).

PublicPortalComparisonCell

kind
​string · enum · required

Cell kind.

Enum values:
empty
check
cross
text
value
​string

Cell text; present only when kind is 'text'.

PublicPortalComparisonRow

label
​string · required

Operator-authored row label (language-resolved).

​object · required

Per-item presence keyed by plan item id.

PublicPortalComparisonSection

title
​string · required

Operator-authored section heading (language-resolved).

​PublicPortalComparisonRow[] · required

PublicPortalComparison

​PublicPortalComparisonSection[] · required

PublicPortalPlan

id
​string · required
planVersionId
​string · required

Published portal_plan_version id — the version pinned for checkout when the buyer clicked "Get started".

vanity
​string | null · required

Public vanity slug (the /embed/ key); non-null only for PUBLIC plans, null for gated plans.

title
​string | null · required

Customer-facing title, language-resolved (en → da fallback); null when the operator entered none.

description
​string | null · required

Operator-authored summary, same language fallback as title.

cardStyle
​string | null · enum · required

Card style; null falls back to variant1 client-side.

Enum values:
variant1
variant2
displayedCadences
​array | null · required

Plan-level cadence allow-list driving the row selector; null/empty falls back to the union of item cadences.

Example: ["month-1","year-1"]
defaultDisplayedCadence
​string | null · required

Pinned default for the row cadence selector; must be a member of displayedCadences. Null falls back to the first entry.

​PublicPortalPlanItem[] · required
comparison
​object | null · required

Operator-authored comparison matrix (columns are plan.items); null when none authored.

PublicPortalCatalogEntry

​PublicPortalPlan · required
displayOrder
​number · required

Operator-controlled ordering inside the catalogue. Lower first.

isLegacyForVisitor
​boolean · required

True when the visitor holds an active subscription to this plan AND the plan is archived. Returned as false in v1.

checkoutable
​boolean · required

Whether a checkout of this plan can currently complete (its terms containers resolve to published versions). Buyer-facing projections filter on it; the tenant projection annotates without filtering, so plans needing operator attention stay visible.

PublicResolvePortalPlansDiagnostics

activePlansConsidered
​number · required

ACTIVE plans the resolve considered (before any gate).

tenantHasNoVisibilityRules
​boolean · required

True when the tenant has configured NO visibility rules at all — resolution is fail-closed (default hidden), so with no rules every plan drops. The fix is publishing a SHOW rule, not a hidden default.

droppedByVisibility
​number · required

Plans dropped because no rule made them visible to this buyer.

droppedByCheckoutable
​number · required

Plans dropped because their terms do not currently resolve (not checkout-able).

PublicResolvePortalPlansResponse

​PublicPortalCatalogEntry[] · required

The plans visible AND checkout-able to the resolved buyer, each carrying the full card content the partner renders. Non-public (gated) plans appear here when the buyer matches their rule.

catalogToken
​string · required

Opaque, reusable, read-only load-time catalog token (43-char base64url). The partner returns it to each embed iframe via its fetchCatalogToken provider; the iframe presents it as a Bearer token to the by-id pricing-card / checkout-document reads. Scoped to the resolved buyer + the returned plans — replay yields only the same already-authorized cards. Treat it as a client secret (TLS-only, never log, never put on a URL).

Example: Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s
expiresAt
​string · required

ISO-8601 expiry of the catalog token.

Example: 2026-06-06T12:34:56.000Z
​object · required

Why plans were (or were not) returned — the "why is my catalogue empty" answer.

PublicPortalPlansListResponse

​PublicPortalCatalogEntry[] · required

Every ACTIVE plan with a PUBLISHED version in the API key's tenant, projected as its canonical native card and ordered by display order. This is the integrator's full catalogue — NOT filtered by any per-visitor visibility rule and NOT run through the plan-routing rule engine — though a plan whose every card references a retired/archived subscription template is omitted (nothing renderable or sellable remains). Each entry carries the full card content the integrator renders.

PublicPortalPlanResponse

​object · required

A single plan projected as its canonical native card. Returns 404 PORTAL_PLAN_NOT_FOUND when the plan id is unknown to the API key's tenant, has no published version, or every card on the published version references a retired/archived subscription template (nothing renderable or sellable remains) — never filtered by visibility rules or the rule engine.

PublicPortalSsoJwks

​object[] · required

The published public JWK(s). Public key material only — never any private component.

Example: [{"kty":"RSA","use":"sig","alg":"RS256","kid":"abc123","n":"…","e":"AQAB"}]

PublicHandoffMembership

customerId
​string · required

The id of the customer (the GET /v1/customers resource) this user belongs to. The portal organization is resolved from it server-side — created automatically on first login if it doesn't exist yet — and a customer that doesn't belong to the API key's tenant is rejected.

Example: 550e8400-e29b-41d4-a716-446655440010
role
​string · required

Role to grant within that organization. One of OWNER, ADMIN, BILLING_ADMIN, USER. Unknown roles are rejected.

Example: OWNER
primary
​boolean

Marks this membership as the organization the user is signed into for this session. When more than one membership is asserted, EXACTLY ONE must be primary (otherwise the mint is rejected with a 400). With a single membership it is the implied sign-in organization, so the flag is optional.

Example: true

PublicHandoffMintRequest

email
​string · required

Email of the partner-provisioned user. Links a first-time SSO login to an existing invited customer-portal user.

Example: jane.doe@partner-customer.com
sub
​string · required

The partner's stable, unique identifier for the user. Keyed together with the per-tenant handoff issuer to resolve the portal user across logins.

Example: partner-user-7f3a9c21
​PublicHandoffMembership[] · required

At least one customer membership to grant this user — required. The customer's portal organization (an opaque internal container) and the membership are created automatically server-side at redeem, so a prior provision call is NOT needed; you only ever reference customers, never organizations. Validated at mint: a customerId that isn't a customer of the API key's tenant, or an unknown role, is rejected with a 400 (rather than failing the user's browser redirect). A handoff with no membership can't establish a portal session, so an empty/omitted array is rejected here rather than minting a ref that would fail at redeem.

Example: [{"customerId":"550e8400-e29b-41d4-a716-446655440010","role":"OWNER"}]
name
​string

Display name of the user; used to populate the customer-portal user's name on first login.

Example: Jane Doe

PublicHandoffMintResponse

ref
​string · required

Opaque, single-use, short-TTL reference. Carries NO identity — the identity lives only in server-side storage keyed by this reference until it is redeemed once at the customer portal.

Example: Yk3pQ9sV2nR7tW1xZ4cB8mL6dF0aH5jE2gN9uK3pQ7s
expiresAt
​string · required

ISO-8601 timestamp after which the reference can no longer be redeemed (60 seconds after minting).

Example: 2026-06-03T12:34:56.000Z

PublicRevokeSessionsRequest

sub
​string · required

The partner's stable subject id for the user — the same sub used when minting their handoff. Every active portal session of that user is force-refreshed.

Example: partner-user-7f3a9c21

PublicRevokeSessionsResponse

revoked
​number · required

Number of memberships whose sessions were force-refreshed (0 when the user has no active sessions).

Example: 2

VatCodeResponse

id
​string · required

The unique identifier of the VAT code

Example: 550e8400-e29b-41d4-a716-446655440000
vatCode
​string · required

VAT code identifier

Example: VAT25
name
​string · required

Name/description of the VAT code

Example: 25% Standard VAT
vatRate
​number · required

VAT rate percentage

Example: 25
type
​string · enum · required

What the code is for: which side of the VAT return it reports on and how the VAT is posted. Every type belongs to exactly one group, reported as group.

Enum values:
Foreign sales to non-EU countries
Purchased products/abroad
Purchased products EU - Rubrik A
Purchased services/abroad
Purchased services EU - Rubrik A
Purchased products/domestic (reverse charge)
Domestic without VAT
Input/purchase
Example: Output/sales
principle
​string · required

VAT principle - Gross (VAT included) or Net (VAT excluded)

Example: gross
group
​string | null · enum

The group the type belongs to, which the VAT-code form shows above the type: output for sales, input for purchases, reverse_charge for purchases where the buyer accounts for the VAT. Membership by type — output: Output/sales, Domestic without VAT, Sales to other EU countries, Sales of services to other EU countries, Foreign sales to non-EU countries, Sales of products EU country-specific, Sales of services EU country-specific; input: Input/purchase; reverse_charge: Purchased products/abroad, Purchased services/abroad, Purchased products/domestic (reverse charge), Purchased products EU - Rubrik A, Purchased services EU - Rubrik A. The group follows from the type on every read and is not accepted on create or update: choose the type, and the group is set. Null when the stored type is one this version does not name.

Enum values:
output
input
reverse_charge
Example: output
country
​string | null

Country the code is specific to (ISO 3166-1 alpha-2) on the country-specific EU sales types; null on every other type

Example: null
accountToBookId
​string

The ledger account ID to book VAT to

Example: 550e8400-e29b-41d4-a716-446655440001
accountToBookNumber
​number

The ledger account number to book VAT to

Example: 6910
accountToBookName
​string

The ledger account name to book VAT to

Example: Output VAT
contraAccountToBookId
​string

The contra account ID for VAT entries

Example: 550e8400-e29b-41d4-a716-446655440002
contraAccountToBookNumber
​number

The contra account number for VAT entries

Example: 6920
contraAccountToBookName
​string

The contra account name for VAT entries

Example: Input VAT

CreateVatCodeRequest

vatCode
​string · maxLength: 50 · required

Short code, unique within the company

Example: U25
name
​string · maxLength: 255 · required

Name of the VAT code

Example: 25% Standard VAT
vatRate
​number · min: 0 · max: 100 · required

VAT rate in percent. A rate above 0 and below 1 is refused (VAT_CODE_RATE_FRACTION), and so is 100 itself (VAT_CODE_RATE_HUNDRED).

Example: 25
type
​string · enum · required

What the code is for: which side of the VAT return it reports on and how the VAT is posted

Enum values:
Foreign sales to non-EU countries
Purchased products/abroad
Purchased products EU - Rubrik A
Purchased services/abroad
Purchased services EU - Rubrik A
Purchased products/domestic (reverse charge)
Domestic without VAT
Input/purchase
Example: Output/sales
accountToBookId
​string · required

Account the VAT amount is booked to; one of the company's accounts

Example: 550e8400-e29b-41d4-a716-446655440001
principle
​string · enum

Gross when the amount on a line includes VAT, Net when VAT is added on top. Each type demands one principle (Net on the reverse-charge types, Gross on the rest); omitted, it follows the type.

Enum values:
Gross
Net
Example: Gross
contraAccountToBookId
​string | null

Account the offsetting VAT amount is booked to. Required on the reverse-charge types, which post the VAT on both sides. Null clears it.

Example: null
country
​string | null

Country (ISO 3166-1 alpha-2) on the country-specific EU sales types, where it is required; refused on every other type. Null clears it.

Example: null

UpdateVatCodeRequest

principle
​string · enum

Gross when the amount on a line includes VAT, Net when VAT is added on top. Each type demands one principle (Net on the reverse-charge types, Gross on the rest); omitted, it follows the type.

Enum values:
Gross
Net
Example: Gross
contraAccountToBookId
​string | null

Account the offsetting VAT amount is booked to. Required on the reverse-charge types, which post the VAT on both sides. Null clears it.

Example: null
country
​string | null

Country (ISO 3166-1 alpha-2) on the country-specific EU sales types, where it is required; refused on every other type. Null clears it.

Example: null
vatCode
​string · maxLength: 50

Short code, unique within the company

Example: U25
name
​string · maxLength: 255

Name of the VAT code

Example: 25% Standard VAT
vatRate
​number · min: 0 · max: 100

VAT rate in percent. A rate above 0 and below 1 is refused (VAT_CODE_RATE_FRACTION), and so is 100 itself (VAT_CODE_RATE_HUNDRED) unless the code already holds that rate.

Example: 25
type
​string · enum

What the code is for. A new type carries its own principle unless one is stated.

Enum values:
Foreign sales to non-EU countries
Purchased products/abroad
Purchased products EU - Rubrik A
Purchased services/abroad
Purchased services EU - Rubrik A
Purchased products/domestic (reverse charge)
Domestic without VAT
Input/purchase
Example: Output/sales
accountToBookId
​string

Account the VAT amount is booked to; one of the company's accounts

Example: 550e8400-e29b-41d4-a716-446655440001

VendorGroupResponse

id
​string · required

The unique identifier of the vendor group

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the vendor group

Example: Domestic Vendors
description
​string

Description of the vendor group

Example: All domestic vendor accounts
defaultAccountId
​string

Default ledger account ID

Example: 550e8400-e29b-41d4-a716-446655440001

VendorDepartmentResponse

id
​string · required

The unique identifier of the department

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the department

Example: Headquarters
isDefault
​boolean · required

Whether this is the default department for the vendor

Example: true
isActive
​boolean · required

Whether the department is active

Example: true
poNumber
​string

Purchase order number

Example: PO-12345
eanNumber
​string

EAN number for e-invoicing

Example: 5790000000000
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK

VendorContactResponse

id
​string · required

The unique identifier of the contact

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the contact

Example: John Doe
isDefaultForVendor
​boolean · required

Whether this is the default contact for the vendor

Example: true
email
​string

Email address

Example: john.doe@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678

VendorResponse

id
​string · required

The unique identifier of the vendor

Example: 550e8400-e29b-41d4-a716-446655440000
vendorNumber
​string · required

Vendor number

Example: V001
name
​string · required

Name of the vendor

Example: Acme Supplies
vendorGroupId
​string · required

Vendor group ID

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · required

Currency code

Example: DKK
status
​string · enum · required

Vendor status

Enum values:
active
inactive
archived
Example: active
vendorGroupName
​string

Vendor group name

Example: Domestic Vendors
email
​string

Email address

Example: contact@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK
vatNumber
​string

VAT registration number

Example: DK12345678
attention
​string

Attention field

Example: Accounts Payable
paymentTerms
​number

Payment terms in days

Example: 30
openingBalance
​number

Opening balance in the company base currency (signed: positive = we owe the vendor)

Example: 1000
​object

Key-value metadata attached to the vendor

Example: {"erpVendorId":"V-10042","tier":"preferred"}

PublicListVendorsResponse

​VendorResponse[] · required

Vendors on this page

total
​number · required

Total vendors matching the query

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

CreateVendorContactRequest

name
​string · required

Contact name

Example: John Doe
isDefault
​boolean · required

Whether this is the default contact for the vendor

Example: true
email
​string

Email address

Example: john.doe@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678

CreateVendorRequest

vendorNumber
​string · required

Unique vendor number

Example: V001
name
​string · required

Vendor name

Example: Acme Supplies
vendorGroupId
​string · required

Vendor group ID

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · pattern: ^[A-Za-z]{3}$ · required

The currency this vendor bills us in, ISO 4217 alpha-3.

Example: DKK
countryCode
​string · required

Two-letter country code

Example: DK
​CreateVendorContactRequest[] · minItems: 1 · maxItems: 50 · required

Contacts for the vendor. At least one contact with isDefault: true is required.

email
​string

Email address

Example: contact@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678
address
​string · maxLength: 255

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
vatNumber
​string

VAT registration number

Example: DK12345678
attention
​string

Attention field

Example: Accounts Payable
paymentTerms
​number · min: 0

Payment terms in days

Example: 30
openingBalance
​number

Opening balance in the company base currency, seeding payables that predate LedgerBee. Signed: positive = we owe the vendor, negative = a credit position.

Example: 1000
defaultAccountId
​string

Default ledger account ID

Example: 550e8400-e29b-41d4-a716-446655440002
​object

Key-value metadata to attach to the vendor. At most 50 entries; keys up to 128 characters, string values up to 500 characters. Read it back, or filter on it, through the list endpoint.

Example: {"erpVendorId":"V-10042"}

CreateVendorResponse

id
​string · required

The unique identifier of the created vendor

Example: 550e8400-e29b-41d4-a716-446655440000
vendorNumber
​string · required

Vendor number

Example: V001

SupplierGroupResponse

id
​string · required

The unique identifier of the supplier group

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the supplier group

Example: Domestic Suppliers
description
​string

Description of the supplier group

Example: All domestic supplier accounts
defaultAccountId
​string

Default ledger account ID

Example: 550e8400-e29b-41d4-a716-446655440001

SupplierDepartmentResponse

id
​string · required

The unique identifier of the department

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the department

Example: Headquarters
isDefault
​boolean · required

Whether this is the default department for the supplier

Example: true
isActive
​boolean · required

Whether the department is active

Example: true
poNumber
​string

Purchase order number

Example: PO-12345
eanNumber
​string

EAN number for e-invoicing

Example: 5790000000000
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK

SupplierContactResponse

id
​string · required

The unique identifier of the contact

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Name of the contact

Example: John Doe
isDefaultForSupplier
​boolean · required

Whether this is the default contact for the supplier

Example: true
email
​string

Email address

Example: john.doe@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678

SupplierResponse

id
​string · required

The unique identifier of the supplier

Example: 550e8400-e29b-41d4-a716-446655440000
supplierNumber
​string · required

Supplier number

Example: V001
name
​string · required

Name of the supplier

Example: Acme Supplies
supplierGroupId
​string · required

Supplier group ID

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · required

Currency code

Example: DKK
status
​string · enum · required

Supplier status

Enum values:
active
inactive
archived
Example: active
supplierGroupName
​string

Supplier group name

Example: Domestic Suppliers
email
​string

Email address

Example: contact@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678
address
​string

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
countryCode
​string

Two-letter country code (ISO 3166-1 alpha-2)

Example: DK
vatNumber
​string

VAT registration number

Example: DK12345678
attention
​string

Attention field

Example: Accounts Payable
paymentTerms
​number

Payment terms in days

Example: 30
openingBalance
​number

Opening balance in the company base currency (signed: positive = we owe the supplier)

Example: 1000
​object

Key-value metadata attached to the supplier

Example: {"erpVendorId":"V-10042","tier":"preferred"}

PublicListSuppliersResponse

​SupplierResponse[] · required

Suppliers on this page

total
​number · required

Total suppliers matching the query

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

CreateSupplierContactRequest

name
​string · required

Contact name

Example: John Doe
isDefault
​boolean · required

Whether this is the default contact for the supplier

Example: true
email
​string

Email address

Example: john.doe@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678

CreateSupplierRequest

supplierNumber
​string · required

Unique supplier number

Example: V001
name
​string · required

Supplier name

Example: Acme Supplies
supplierGroupId
​string · required

Supplier group ID

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · pattern: ^[A-Za-z]{3}$ · required

The currency this supplier bills us in, ISO 4217 alpha-3.

Example: DKK
countryCode
​string · required

Two-letter country code

Example: DK
​CreateSupplierContactRequest[] · minItems: 1 · maxItems: 50 · required

Contacts for the supplier. At least one contact with isDefault: true is required.

email
​string

Email address

Example: contact@acme-supplies.com
phone
​string

Phone number

Example: +45 12345678
address
​string · maxLength: 255

Street address

Example: 123 Main Street
city
​string

City

Example: Copenhagen
postalCode
​string

Postal code

Example: 2100
vatNumber
​string

VAT registration number

Example: DK12345678
attention
​string

Attention field

Example: Accounts Payable
paymentTerms
​number · min: 0

Payment terms in days

Example: 30
openingBalance
​number

Opening balance in the company base currency, seeding payables that predate LedgerBee. Signed: positive = we owe the supplier, negative = a credit position.

Example: 1000
defaultAccountId
​string

Default ledger account ID

Example: 550e8400-e29b-41d4-a716-446655440002
​object

Key-value metadata to attach to the supplier. At most 50 entries; keys up to 128 characters, string values up to 500 characters. Read it back, or filter on it, through the list endpoint.

Example: {"erpVendorId":"V-10042"}

CreateSupplierResponse

id
​string · required

The unique identifier of the created supplier

Example: 550e8400-e29b-41d4-a716-446655440000
supplierNumber
​string · required

Supplier number

Example: V001

CreateWebhookEndpointRequest

url
​string · required

The HTTPS URL events are delivered to. Must be a public https URL (loopback/private/link-local hosts are rejected).

Example: https://example.com/webhooks/ledgerbee
enabledEvents
​string[] · required

The events to subscribe to. Must contain at least one known event type.

Available events:

  • subscription.assigned — Fired when a subscription is assigned to a customer (may be future-dated / upcoming).
  • subscription.started — Fired when a subscription becomes active — grant entitlement/access on this event, not on assigned.
  • subscription.updated — Fired when a config property changes without a structural transition (e.g. name, payment method, billing direction).
  • subscription.transitioned — Fired on a structural change: plan replace, product edit, billing cadence change, phase change, or realign.
  • subscription.paused — Fired when a subscription is paused.
  • subscription.resumed — Fired when a subscription resumes from a pause.
  • subscription.trial_ended — Fired when a subscription trial ends. The payload outcome says whether billing begins (ACTIVE) or the subscription was held for a missing payment card (PAUSED).
  • subscription.cancellation_scheduled — Fired when a future cancellation is scheduled for a subscription (still active until then).
  • subscription.cancellation_cleared — Fired when a previously scheduled cancellation is cleared.
  • subscription.churned — Fired when a subscription is cancelled/finalized — revoke entitlement on this event.
  • subscription.billed — Fired once per subscription that billed onto an invoice — one per child on a parent-paid consolidated invoice, one per member on a billing-group invoice. amount is always the whole document total; deduplicate on invoiceId, attribute on billingGroupId, never sum amount across events.
  • subscription.billing_held — Fired when a billing run holds an invoice instead of issuing it, because it is below the minimum invoice amount or below the smallest amount the subscription's card can be charged: nothing is invoiced or charged, and the held periods are added to the subscription's next invoice. One event per subscription with a period on the held invoice.
  • subscription.payment_succeeded — Fired when a card charge for the subscription clears — the success pair of the charge_failed error signal. On a billing-group card charge one event fires per member, each carrying the full charged amount and the shared billingGroupId.
  • subscription.error — Fired when a delivery/processing problem occurs for a subscription (e.g. undeliverable recipient).
  • billing.invoice_sent — Fired when an invoice document is sent to the customer.
  • billing.credit_note_sent — Fired when a credit note document is sent to the customer.
  • billing.invoice_updated — Fired when an invoice is changed, in the app or through the API alike: its fields, its lines or their order, or its status. A draft scheduled or cancelled fires it, and so does an invoice reaching sent once it is delivered, beside billing.invoice_sent. A save that changes nothing fires nothing; changedFields names what moved.
  • billing.invoice_deleted — Fired when a draft invoice is deleted, in the app or through the API alike. Only drafts can be deleted; a sent invoice is corrected with a credit note instead.
  • billing.invoice_paid — Fired when a customer invoice becomes paid in full: by payments, by a settlement, or by a credit note applied to it. Only the invoice fires it — the credit note it was settled against does not, and neither does a reminder fee or an advance. A partial payment fires nothing. An invoice reopened (a payment reverted) and paid again fires again. Invoices brought in by an import do not fire it.
  • customer.created — Fired when a customer is created (payload flags whether it was a portal self-signup).
  • card.added — Fired when a card is successfully saved for a customer (provider-opaque).
  • card.removed — Fired when a saved card is removed in-app or cancelled at the provider.
  • card.updated — Fired when a saved card’s details change (network auto-update or refresh).
  • card.expiring — Fired when a saved card is approaching expiry.
  • card.expired — Fired when a saved card is observed to have expired.
  • card.default_changed — Fired when the customer’s default card changes (explicit or auto-default).
  • card.backup_changed — Fired when the customer’s designated backup card is set, replaced, or cleared.
  • card.add_failed — Fired when a card-save attempt fails (decline or authentication failure).
  • quote.sent — Fired when a quote is sent to the customer.
  • quote.converted — Fired when a quote is converted into an order confirmation or an invoice.
  • order_confirmation.sent — Fired when an order confirmation is sent to the customer.
  • order_confirmation.converted — Fired when an order confirmation is converted into an invoice.
  • checkout.card_ready — Fired when the buyer's card lands on a checkout session's card window — confirm may proceed. The card-status poll remains authoritative.
  • checkout.card_failed — Fired when a checkout card window closes without a card (the provider window expired mid-capture) — open a fresh window to retry.
  • checkout.session_expired — Fired when a checkout session expires unconsumed — the abandoned-checkout signal.
  • project.created — Fired when a project is created (payload carries the owned dimension id for correlation with the dimensions API).
  • project.updated — Fired when a project's fields are updated (payload lists the changed field names). Also fires on un-archive.
  • project.archived — Fired when a project is archived (its dimension is deactivated; postings history is preserved).
  • stock.balance_changed — Fired for every stock movement that changes sellable stock, carrying the position's on-hand after it — the signal a sales channel republishes availability on.
  • shipment.dispatched — Fired when a shipment leaves the warehouse and its cost of goods sold posts.
  • shipment.cancelled — Fired when a DISPATCHED shipment is cancelled and its posting unwound. Cancelling a draft moves nothing and fires nothing.
  • flow.tap — Fired when a flow tap this endpoint is named on fires: once per document, carrying the tap id, the optional subject and body the tap was written with, and the object the step declares for that outcome when the tap attaches it (otherwise null). Subscribing makes the endpoint available to taps; it receives only the taps that name it.
  • agent.message — Fired when an agent's Post block that names this endpoint posts: once per message that reaches the block, carrying the agent, the run, the post's title and text, and the message's structured content. Subscribing makes the endpoint available to Post blocks; it receives only the posts of the blocks that name it.
Enum values:
subscription.assigned
subscription.started
subscription.updated
subscription.transitioned
subscription.paused
subscription.resumed
subscription.trial_ended
subscription.cancellation_scheduled
Example: ["subscription.assigned"]
description
​string · maxLength: 512

Optional human-facing description.

Example: Production billing sync

WebhookEndpointWithSecret

id
​string · required

Unique identifier of the webhook endpoint.

Example: 0192f3a1-...
url
​string · required

The HTTPS URL events are delivered to.

Example: https://example.com/webhooks/ledgerbee
enabledEvents
​string[] · required

The events this endpoint is subscribed to. An event is delivered to every enabled endpoint subscribed to its type.

Available events:

  • subscription.assigned — Fired when a subscription is assigned to a customer (may be future-dated / upcoming).
  • subscription.started — Fired when a subscription becomes active — grant entitlement/access on this event, not on assigned.
  • subscription.updated — Fired when a config property changes without a structural transition (e.g. name, payment method, billing direction).
  • subscription.transitioned — Fired on a structural change: plan replace, product edit, billing cadence change, phase change, or realign.
  • subscription.paused — Fired when a subscription is paused.
  • subscription.resumed — Fired when a subscription resumes from a pause.
  • subscription.trial_ended — Fired when a subscription trial ends. The payload outcome says whether billing begins (ACTIVE) or the subscription was held for a missing payment card (PAUSED).
  • subscription.cancellation_scheduled — Fired when a future cancellation is scheduled for a subscription (still active until then).
  • subscription.cancellation_cleared — Fired when a previously scheduled cancellation is cleared.
  • subscription.churned — Fired when a subscription is cancelled/finalized — revoke entitlement on this event.
  • subscription.billed — Fired once per subscription that billed onto an invoice — one per child on a parent-paid consolidated invoice, one per member on a billing-group invoice. amount is always the whole document total; deduplicate on invoiceId, attribute on billingGroupId, never sum amount across events.
  • subscription.billing_held — Fired when a billing run holds an invoice instead of issuing it, because it is below the minimum invoice amount or below the smallest amount the subscription's card can be charged: nothing is invoiced or charged, and the held periods are added to the subscription's next invoice. One event per subscription with a period on the held invoice.
  • subscription.payment_succeeded — Fired when a card charge for the subscription clears — the success pair of the charge_failed error signal. On a billing-group card charge one event fires per member, each carrying the full charged amount and the shared billingGroupId.
  • subscription.error — Fired when a delivery/processing problem occurs for a subscription (e.g. undeliverable recipient).
  • billing.invoice_sent — Fired when an invoice document is sent to the customer.
  • billing.credit_note_sent — Fired when a credit note document is sent to the customer.
  • billing.invoice_updated — Fired when an invoice is changed, in the app or through the API alike: its fields, its lines or their order, or its status. A draft scheduled or cancelled fires it, and so does an invoice reaching sent once it is delivered, beside billing.invoice_sent. A save that changes nothing fires nothing; changedFields names what moved.
  • billing.invoice_deleted — Fired when a draft invoice is deleted, in the app or through the API alike. Only drafts can be deleted; a sent invoice is corrected with a credit note instead.
  • billing.invoice_paid — Fired when a customer invoice becomes paid in full: by payments, by a settlement, or by a credit note applied to it. Only the invoice fires it — the credit note it was settled against does not, and neither does a reminder fee or an advance. A partial payment fires nothing. An invoice reopened (a payment reverted) and paid again fires again. Invoices brought in by an import do not fire it.
  • customer.created — Fired when a customer is created (payload flags whether it was a portal self-signup).
  • card.added — Fired when a card is successfully saved for a customer (provider-opaque).
  • card.removed — Fired when a saved card is removed in-app or cancelled at the provider.
  • card.updated — Fired when a saved card’s details change (network auto-update or refresh).
  • card.expiring — Fired when a saved card is approaching expiry.
  • card.expired — Fired when a saved card is observed to have expired.
  • card.default_changed — Fired when the customer’s default card changes (explicit or auto-default).
  • card.backup_changed — Fired when the customer’s designated backup card is set, replaced, or cleared.
  • card.add_failed — Fired when a card-save attempt fails (decline or authentication failure).
  • quote.sent — Fired when a quote is sent to the customer.
  • quote.converted — Fired when a quote is converted into an order confirmation or an invoice.
  • order_confirmation.sent — Fired when an order confirmation is sent to the customer.
  • order_confirmation.converted — Fired when an order confirmation is converted into an invoice.
  • checkout.card_ready — Fired when the buyer's card lands on a checkout session's card window — confirm may proceed. The card-status poll remains authoritative.
  • checkout.card_failed — Fired when a checkout card window closes without a card (the provider window expired mid-capture) — open a fresh window to retry.
  • checkout.session_expired — Fired when a checkout session expires unconsumed — the abandoned-checkout signal.
  • project.created — Fired when a project is created (payload carries the owned dimension id for correlation with the dimensions API).
  • project.updated — Fired when a project's fields are updated (payload lists the changed field names). Also fires on un-archive.
  • project.archived — Fired when a project is archived (its dimension is deactivated; postings history is preserved).
  • stock.balance_changed — Fired for every stock movement that changes sellable stock, carrying the position's on-hand after it — the signal a sales channel republishes availability on.
  • shipment.dispatched — Fired when a shipment leaves the warehouse and its cost of goods sold posts.
  • shipment.cancelled — Fired when a DISPATCHED shipment is cancelled and its posting unwound. Cancelling a draft moves nothing and fires nothing.
  • flow.tap — Fired when a flow tap this endpoint is named on fires: once per document, carrying the tap id, the optional subject and body the tap was written with, and the object the step declares for that outcome when the tap attaches it (otherwise null). Subscribing makes the endpoint available to taps; it receives only the taps that name it.
  • agent.message — Fired when an agent's Post block that names this endpoint posts: once per message that reaches the block, carrying the agent, the run, the post's title and text, and the message's structured content. Subscribing makes the endpoint available to Post blocks; it receives only the posts of the blocks that name it.
Enum values:
subscription.assigned
subscription.started
subscription.updated
subscription.transitioned
subscription.paused
subscription.resumed
subscription.trial_ended
subscription.cancellation_scheduled
Example: ["subscription.assigned"]
status
​string · enum · required

Delivery status. disabled endpoints are retained but receive no events.

Enum values:
enabled
disabled
Example: enabled
createdAt
​string · required

ISO 8601 creation timestamp.

Example: 2026-05-29T10:00:00.000Z
updatedAt
​string · required

ISO 8601 last-update timestamp.

Example: 2026-05-29T10:00:00.000Z
secret
​string · required

The signing secret (shown only on create and roll-secret). Used to verify the webhook-signature header.

Example: whsec_...
description
​string | null

Optional human-facing description of what this endpoint is used for.

Example: Production billing sync

WebhookEndpoint

id
​string · required

Unique identifier of the webhook endpoint.

Example: 0192f3a1-...
url
​string · required

The HTTPS URL events are delivered to.

Example: https://example.com/webhooks/ledgerbee
enabledEvents
​string[] · required

The events this endpoint is subscribed to. An event is delivered to every enabled endpoint subscribed to its type.

Available events:

  • subscription.assigned — Fired when a subscription is assigned to a customer (may be future-dated / upcoming).
  • subscription.started — Fired when a subscription becomes active — grant entitlement/access on this event, not on assigned.
  • subscription.updated — Fired when a config property changes without a structural transition (e.g. name, payment method, billing direction).
  • subscription.transitioned — Fired on a structural change: plan replace, product edit, billing cadence change, phase change, or realign.
  • subscription.paused — Fired when a subscription is paused.
  • subscription.resumed — Fired when a subscription resumes from a pause.
  • subscription.trial_ended — Fired when a subscription trial ends. The payload outcome says whether billing begins (ACTIVE) or the subscription was held for a missing payment card (PAUSED).
  • subscription.cancellation_scheduled — Fired when a future cancellation is scheduled for a subscription (still active until then).
  • subscription.cancellation_cleared — Fired when a previously scheduled cancellation is cleared.
  • subscription.churned — Fired when a subscription is cancelled/finalized — revoke entitlement on this event.
  • subscription.billed — Fired once per subscription that billed onto an invoice — one per child on a parent-paid consolidated invoice, one per member on a billing-group invoice. amount is always the whole document total; deduplicate on invoiceId, attribute on billingGroupId, never sum amount across events.
  • subscription.billing_held — Fired when a billing run holds an invoice instead of issuing it, because it is below the minimum invoice amount or below the smallest amount the subscription's card can be charged: nothing is invoiced or charged, and the held periods are added to the subscription's next invoice. One event per subscription with a period on the held invoice.
  • subscription.payment_succeeded — Fired when a card charge for the subscription clears — the success pair of the charge_failed error signal. On a billing-group card charge one event fires per member, each carrying the full charged amount and the shared billingGroupId.
  • subscription.error — Fired when a delivery/processing problem occurs for a subscription (e.g. undeliverable recipient).
  • billing.invoice_sent — Fired when an invoice document is sent to the customer.
  • billing.credit_note_sent — Fired when a credit note document is sent to the customer.
  • billing.invoice_updated — Fired when an invoice is changed, in the app or through the API alike: its fields, its lines or their order, or its status. A draft scheduled or cancelled fires it, and so does an invoice reaching sent once it is delivered, beside billing.invoice_sent. A save that changes nothing fires nothing; changedFields names what moved.
  • billing.invoice_deleted — Fired when a draft invoice is deleted, in the app or through the API alike. Only drafts can be deleted; a sent invoice is corrected with a credit note instead.
  • billing.invoice_paid — Fired when a customer invoice becomes paid in full: by payments, by a settlement, or by a credit note applied to it. Only the invoice fires it — the credit note it was settled against does not, and neither does a reminder fee or an advance. A partial payment fires nothing. An invoice reopened (a payment reverted) and paid again fires again. Invoices brought in by an import do not fire it.
  • customer.created — Fired when a customer is created (payload flags whether it was a portal self-signup).
  • card.added — Fired when a card is successfully saved for a customer (provider-opaque).
  • card.removed — Fired when a saved card is removed in-app or cancelled at the provider.
  • card.updated — Fired when a saved card’s details change (network auto-update or refresh).
  • card.expiring — Fired when a saved card is approaching expiry.
  • card.expired — Fired when a saved card is observed to have expired.
  • card.default_changed — Fired when the customer’s default card changes (explicit or auto-default).
  • card.backup_changed — Fired when the customer’s designated backup card is set, replaced, or cleared.
  • card.add_failed — Fired when a card-save attempt fails (decline or authentication failure).
  • quote.sent — Fired when a quote is sent to the customer.
  • quote.converted — Fired when a quote is converted into an order confirmation or an invoice.
  • order_confirmation.sent — Fired when an order confirmation is sent to the customer.
  • order_confirmation.converted — Fired when an order confirmation is converted into an invoice.
  • checkout.card_ready — Fired when the buyer's card lands on a checkout session's card window — confirm may proceed. The card-status poll remains authoritative.
  • checkout.card_failed — Fired when a checkout card window closes without a card (the provider window expired mid-capture) — open a fresh window to retry.
  • checkout.session_expired — Fired when a checkout session expires unconsumed — the abandoned-checkout signal.
  • project.created — Fired when a project is created (payload carries the owned dimension id for correlation with the dimensions API).
  • project.updated — Fired when a project's fields are updated (payload lists the changed field names). Also fires on un-archive.
  • project.archived — Fired when a project is archived (its dimension is deactivated; postings history is preserved).
  • stock.balance_changed — Fired for every stock movement that changes sellable stock, carrying the position's on-hand after it — the signal a sales channel republishes availability on.
  • shipment.dispatched — Fired when a shipment leaves the warehouse and its cost of goods sold posts.
  • shipment.cancelled — Fired when a DISPATCHED shipment is cancelled and its posting unwound. Cancelling a draft moves nothing and fires nothing.
  • flow.tap — Fired when a flow tap this endpoint is named on fires: once per document, carrying the tap id, the optional subject and body the tap was written with, and the object the step declares for that outcome when the tap attaches it (otherwise null). Subscribing makes the endpoint available to taps; it receives only the taps that name it.
  • agent.message — Fired when an agent's Post block that names this endpoint posts: once per message that reaches the block, carrying the agent, the run, the post's title and text, and the message's structured content. Subscribing makes the endpoint available to Post blocks; it receives only the posts of the blocks that name it.
Enum values:
subscription.assigned
subscription.started
subscription.updated
subscription.transitioned
subscription.paused
subscription.resumed
subscription.trial_ended
subscription.cancellation_scheduled
Example: ["subscription.assigned"]
status
​string · enum · required

Delivery status. disabled endpoints are retained but receive no events.

Enum values:
enabled
disabled
Example: enabled
createdAt
​string · required

ISO 8601 creation timestamp.

Example: 2026-05-29T10:00:00.000Z
updatedAt
​string · required

ISO 8601 last-update timestamp.

Example: 2026-05-29T10:00:00.000Z
description
​string | null

Optional human-facing description of what this endpoint is used for.

Example: Production billing sync

WebhookEndpointList

​WebhookEndpoint[] · required
total
​number · required

Total number of endpoints matching the query.

Example: 3
page
​number · required

Current page (1-based).

Example: 1
pageSize
​number · required

Page size.

Example: 25

UpdateWebhookEndpointRequest

url
​string

New HTTPS delivery URL.

Example: https://example.com/webhooks/v2
enabledEvents
​string[]

Replace the full set of subscribed events.

Available events:

  • subscription.assigned — Fired when a subscription is assigned to a customer (may be future-dated / upcoming).
  • subscription.started — Fired when a subscription becomes active — grant entitlement/access on this event, not on assigned.
  • subscription.updated — Fired when a config property changes without a structural transition (e.g. name, payment method, billing direction).
  • subscription.transitioned — Fired on a structural change: plan replace, product edit, billing cadence change, phase change, or realign.
  • subscription.paused — Fired when a subscription is paused.
  • subscription.resumed — Fired when a subscription resumes from a pause.
  • subscription.trial_ended — Fired when a subscription trial ends. The payload outcome says whether billing begins (ACTIVE) or the subscription was held for a missing payment card (PAUSED).
  • subscription.cancellation_scheduled — Fired when a future cancellation is scheduled for a subscription (still active until then).
  • subscription.cancellation_cleared — Fired when a previously scheduled cancellation is cleared.
  • subscription.churned — Fired when a subscription is cancelled/finalized — revoke entitlement on this event.
  • subscription.billed — Fired once per subscription that billed onto an invoice — one per child on a parent-paid consolidated invoice, one per member on a billing-group invoice. amount is always the whole document total; deduplicate on invoiceId, attribute on billingGroupId, never sum amount across events.
  • subscription.billing_held — Fired when a billing run holds an invoice instead of issuing it, because it is below the minimum invoice amount or below the smallest amount the subscription's card can be charged: nothing is invoiced or charged, and the held periods are added to the subscription's next invoice. One event per subscription with a period on the held invoice.
  • subscription.payment_succeeded — Fired when a card charge for the subscription clears — the success pair of the charge_failed error signal. On a billing-group card charge one event fires per member, each carrying the full charged amount and the shared billingGroupId.
  • subscription.error — Fired when a delivery/processing problem occurs for a subscription (e.g. undeliverable recipient).
  • billing.invoice_sent — Fired when an invoice document is sent to the customer.
  • billing.credit_note_sent — Fired when a credit note document is sent to the customer.
  • billing.invoice_updated — Fired when an invoice is changed, in the app or through the API alike: its fields, its lines or their order, or its status. A draft scheduled or cancelled fires it, and so does an invoice reaching sent once it is delivered, beside billing.invoice_sent. A save that changes nothing fires nothing; changedFields names what moved.
  • billing.invoice_deleted — Fired when a draft invoice is deleted, in the app or through the API alike. Only drafts can be deleted; a sent invoice is corrected with a credit note instead.
  • billing.invoice_paid — Fired when a customer invoice becomes paid in full: by payments, by a settlement, or by a credit note applied to it. Only the invoice fires it — the credit note it was settled against does not, and neither does a reminder fee or an advance. A partial payment fires nothing. An invoice reopened (a payment reverted) and paid again fires again. Invoices brought in by an import do not fire it.
  • customer.created — Fired when a customer is created (payload flags whether it was a portal self-signup).
  • card.added — Fired when a card is successfully saved for a customer (provider-opaque).
  • card.removed — Fired when a saved card is removed in-app or cancelled at the provider.
  • card.updated — Fired when a saved card’s details change (network auto-update or refresh).
  • card.expiring — Fired when a saved card is approaching expiry.
  • card.expired — Fired when a saved card is observed to have expired.
  • card.default_changed — Fired when the customer’s default card changes (explicit or auto-default).
  • card.backup_changed — Fired when the customer’s designated backup card is set, replaced, or cleared.
  • card.add_failed — Fired when a card-save attempt fails (decline or authentication failure).
  • quote.sent — Fired when a quote is sent to the customer.
  • quote.converted — Fired when a quote is converted into an order confirmation or an invoice.
  • order_confirmation.sent — Fired when an order confirmation is sent to the customer.
  • order_confirmation.converted — Fired when an order confirmation is converted into an invoice.
  • checkout.card_ready — Fired when the buyer's card lands on a checkout session's card window — confirm may proceed. The card-status poll remains authoritative.
  • checkout.card_failed — Fired when a checkout card window closes without a card (the provider window expired mid-capture) — open a fresh window to retry.
  • checkout.session_expired — Fired when a checkout session expires unconsumed — the abandoned-checkout signal.
  • project.created — Fired when a project is created (payload carries the owned dimension id for correlation with the dimensions API).
  • project.updated — Fired when a project's fields are updated (payload lists the changed field names). Also fires on un-archive.
  • project.archived — Fired when a project is archived (its dimension is deactivated; postings history is preserved).
  • stock.balance_changed — Fired for every stock movement that changes sellable stock, carrying the position's on-hand after it — the signal a sales channel republishes availability on.
  • shipment.dispatched — Fired when a shipment leaves the warehouse and its cost of goods sold posts.
  • shipment.cancelled — Fired when a DISPATCHED shipment is cancelled and its posting unwound. Cancelling a draft moves nothing and fires nothing.
  • flow.tap — Fired when a flow tap this endpoint is named on fires: once per document, carrying the tap id, the optional subject and body the tap was written with, and the object the step declares for that outcome when the tap attaches it (otherwise null). Subscribing makes the endpoint available to taps; it receives only the taps that name it.
  • agent.message — Fired when an agent's Post block that names this endpoint posts: once per message that reaches the block, carrying the agent, the run, the post's title and text, and the message's structured content. Subscribing makes the endpoint available to Post blocks; it receives only the posts of the blocks that name it.
Enum values:
subscription.assigned
subscription.started
subscription.updated
subscription.transitioned
subscription.paused
subscription.resumed
subscription.trial_ended
subscription.cancellation_scheduled
Example: ["subscription.assigned"]
status
​string · enum

Enable or disable delivery without deleting the endpoint.

Enum values:
enabled
disabled
description
​string | null · maxLength: 512

Update the description. Send null to clear it.

Example: Updated description

TestWebhookEndpointRequest

event
​string · enum · required

The event type to simulate. Must be one of the endpoint’s subscribed events.

Available events:

  • subscription.assigned — Fired when a subscription is assigned to a customer (may be future-dated / upcoming).
  • subscription.started — Fired when a subscription becomes active — grant entitlement/access on this event, not on assigned.
  • subscription.updated — Fired when a config property changes without a structural transition (e.g. name, payment method, billing direction).
  • subscription.transitioned — Fired on a structural change: plan replace, product edit, billing cadence change, phase change, or realign.
  • subscription.paused — Fired when a subscription is paused.
  • subscription.resumed — Fired when a subscription resumes from a pause.
  • subscription.trial_ended — Fired when a subscription trial ends. The payload outcome says whether billing begins (ACTIVE) or the subscription was held for a missing payment card (PAUSED).
  • subscription.cancellation_scheduled — Fired when a future cancellation is scheduled for a subscription (still active until then).
  • subscription.cancellation_cleared — Fired when a previously scheduled cancellation is cleared.
  • subscription.churned — Fired when a subscription is cancelled/finalized — revoke entitlement on this event.
  • subscription.billed — Fired once per subscription that billed onto an invoice — one per child on a parent-paid consolidated invoice, one per member on a billing-group invoice. amount is always the whole document total; deduplicate on invoiceId, attribute on billingGroupId, never sum amount across events.
  • subscription.billing_held — Fired when a billing run holds an invoice instead of issuing it, because it is below the minimum invoice amount or below the smallest amount the subscription's card can be charged: nothing is invoiced or charged, and the held periods are added to the subscription's next invoice. One event per subscription with a period on the held invoice.
  • subscription.payment_succeeded — Fired when a card charge for the subscription clears — the success pair of the charge_failed error signal. On a billing-group card charge one event fires per member, each carrying the full charged amount and the shared billingGroupId.
  • subscription.error — Fired when a delivery/processing problem occurs for a subscription (e.g. undeliverable recipient).
  • billing.invoice_sent — Fired when an invoice document is sent to the customer.
  • billing.credit_note_sent — Fired when a credit note document is sent to the customer.
  • billing.invoice_updated — Fired when an invoice is changed, in the app or through the API alike: its fields, its lines or their order, or its status. A draft scheduled or cancelled fires it, and so does an invoice reaching sent once it is delivered, beside billing.invoice_sent. A save that changes nothing fires nothing; changedFields names what moved.
  • billing.invoice_deleted — Fired when a draft invoice is deleted, in the app or through the API alike. Only drafts can be deleted; a sent invoice is corrected with a credit note instead.
  • billing.invoice_paid — Fired when a customer invoice becomes paid in full: by payments, by a settlement, or by a credit note applied to it. Only the invoice fires it — the credit note it was settled against does not, and neither does a reminder fee or an advance. A partial payment fires nothing. An invoice reopened (a payment reverted) and paid again fires again. Invoices brought in by an import do not fire it.
  • customer.created — Fired when a customer is created (payload flags whether it was a portal self-signup).
  • card.added — Fired when a card is successfully saved for a customer (provider-opaque).
  • card.removed — Fired when a saved card is removed in-app or cancelled at the provider.
  • card.updated — Fired when a saved card’s details change (network auto-update or refresh).
  • card.expiring — Fired when a saved card is approaching expiry.
  • card.expired — Fired when a saved card is observed to have expired.
  • card.default_changed — Fired when the customer’s default card changes (explicit or auto-default).
  • card.backup_changed — Fired when the customer’s designated backup card is set, replaced, or cleared.
  • card.add_failed — Fired when a card-save attempt fails (decline or authentication failure).
  • quote.sent — Fired when a quote is sent to the customer.
  • quote.converted — Fired when a quote is converted into an order confirmation or an invoice.
  • order_confirmation.sent — Fired when an order confirmation is sent to the customer.
  • order_confirmation.converted — Fired when an order confirmation is converted into an invoice.
  • checkout.card_ready — Fired when the buyer's card lands on a checkout session's card window — confirm may proceed. The card-status poll remains authoritative.
  • checkout.card_failed — Fired when a checkout card window closes without a card (the provider window expired mid-capture) — open a fresh window to retry.
  • checkout.session_expired — Fired when a checkout session expires unconsumed — the abandoned-checkout signal.
  • project.created — Fired when a project is created (payload carries the owned dimension id for correlation with the dimensions API).
  • project.updated — Fired when a project's fields are updated (payload lists the changed field names). Also fires on un-archive.
  • project.archived — Fired when a project is archived (its dimension is deactivated; postings history is preserved).
  • stock.balance_changed — Fired for every stock movement that changes sellable stock, carrying the position's on-hand after it — the signal a sales channel republishes availability on.
  • shipment.dispatched — Fired when a shipment leaves the warehouse and its cost of goods sold posts.
  • shipment.cancelled — Fired when a DISPATCHED shipment is cancelled and its posting unwound. Cancelling a draft moves nothing and fires nothing.
  • flow.tap — Fired when a flow tap this endpoint is named on fires: once per document, carrying the tap id, the optional subject and body the tap was written with, and the object the step declares for that outcome when the tap attaches it (otherwise null). Subscribing makes the endpoint available to taps; it receives only the taps that name it.
  • agent.message — Fired when an agent's Post block that names this endpoint posts: once per message that reaches the block, carrying the agent, the run, the post's title and text, and the message's structured content. Subscribing makes the endpoint available to Post blocks; it receives only the posts of the blocks that name it.
Enum values:
subscription.assigned
subscription.started
subscription.updated
subscription.transitioned
subscription.paused
subscription.resumed
subscription.trial_ended
subscription.cancellation_scheduled
Example: subscription.assigned

TestWebhookEndpointResult

success
​boolean · required

Whether the endpoint responded with a 2xx status.

Example: true
durationMs
​number · required

Round-trip time of the probe in milliseconds.

Example: 142
statusCode
​number | null

HTTP status returned by the endpoint, or null on a transport error.

Example: 200
error
​string | null

Transport/error message when the probe failed, otherwise null.

Example: null

PublicCreateInvoiceLine

priceId
​string

Product price ID. Required on a billable line — the line bills this product. Omit only on a text / separator line (set lineType instead).

Example: 0197A943-2325-7829-B835-B6C71A293065
lineType
​string · enum

Semantic type of the line. text (a description line) and separator (a blank line) bill nothing and need no price. discount and interval_discount are not accepted: a request has no field for the value a discount takes off.

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
description
​string

Custom description for this line item

Example: Premium widget - Blue color
quantity
​number

Quantity. Required on a billable line; omit on a text / separator line.

Example: 2
unitPrice
​string

One-time unit-price override (decimal string). Defaults to the price's current amount in the document currency when omitted. totalPrice and VAT are always computed server-side and must not be sent: totalPrice is quantity * unitPrice for a flat-rate price or an override, and what the price's tiers charge for the quantity on a volume, graduated or package price.

Example: 1083.32
recognitionPeriodDays
​number

Override the revenue recognition period for this line (in days)

Example: 365
tagIds
​string[]

Dimension value IDs for this line (see GET /dimensions). When the account the line posts to requires a dimension (requiredDimensionIds on the account), the line must carry a value from it, here or in the invoice's own tagIds (which apply to every line), or the invoice cannot be sent: booking is refused with JOURNAL_TAG_REQUIRED_DIMENSION_MISSING.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
discountIds
​string[] · maxItems: 20

Line-scope discount records to apply to this line. Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. An update restates every line, so a line carries the ids sent with it: a line sent without discountIds has no line discounts. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]

PublicCreateInvoice

customerId
​string · required

Customer ID this invoice is for. Required — every invoice must reference a customer (this mirrors the gated app, which also requires a customer).

Example: 0197A943-2325-7829-B835-B6C71A293065
date
​string · required

Invoice date (ISO date, YYYY-MM-DD)

Example: 2024-01-15
​PublicCreateInvoiceLine[] · required

Invoice lines

customerDepartmentId
​string

Customer department ID (for EAN-based e-invoicing and address override)

Example: 0197A943-2325-7829-B835-B6C71A293065
customerContactId
​string

Customer contact ID (invoice recipient)

Example: 0197A943-2325-7829-B835-B6C71A293065
dueDate
​string

Due date for payment (ISO date). Derived from payment terms when omitted.

Example: 2024-02-15
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217). Defaults to the company default currency.

Example: DKK
paymentTerms
​number

Payment terms in days

Example: 30
reference
​string

Reference / PO number ("PO-nr.")

Example: PO-12345
ourReference
​string

Our reference ("Vores ref.")

Example: Jane Doe
description
​string

Internal description for your own reference. Never printed on the PDF or shown to the customer: put text for the customer in subject and notes.

Example: Monthly service invoice
subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

Example: Thank you for your business!
tagIds
​string[]

Tag/Dimension value IDs to attach to the journal entry when this invoice is booked. A dimension value here applies to every line, and counts toward a dimension the line's account requires. Use the per-line tagIds for a dimension that differs between lines.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. The code's own limit is counted when the invoice is booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A code naming a discount already named is applied once. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicAppliedLineDiscount

discountId
​string · required

The discount record the line referenced.

position
​number · required

The order the line applied its discounts in, from 0: the order they were sent.

name
​string · required

The discount's name when the line was priced.

type
​string · enum · required
Enum values:
percentage
fixed
per_unit
percentagePct
​string | null · required

The percent a percentage discount took. Null for other types.

Example: 10
originalDiscountAmount
​string | null · required

The discount's amount in the document's currency: per eligible line for fixed, per unit for per unit. Null for a percentage.

originalReductionAmount
​string · required

What the discount took off the line, in the document's currency. Never negative.

Example: 200.00
code
​string

The code the discount was claimed through, as the code is written. Present only when a code claimed it.

Example: SUMMER10

PublicInvoiceLine

id
​string · required

Line item ID

Example: 0197A943-2325-7829-B835-B6C71A293065
quantity
​number · required

Quantity

Example: 2
unitPrice
​string · required

Unit price (decimal string)

Example: 1083.32
totalPrice
​string · required

Total price (decimal string)

Example: 2166.65
subscriptionId
​string | null · required

The subscription this line was billed for. On an invoice that carries add-ons, an add-on’s lines name the add-on, not the parent the invoice is addressed to; on a billing group’s shared invoice, each line names the member it was billed for. Null on a line that belongs to no subscription, such as a line on a manually created invoice.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionId
​string | null · required

The subscription this line’s subscription is an add-on of — the parent the add-on is billed with. Null on every line that is not an add-on’s.

Example: 0197A943-2325-7829-B835-B6C71A293065
tagIds
​string[] · required

Dimension value IDs this line carries. Empty when it carries none.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
​PublicAppliedLineDiscount[] · required

The discount records this line referenced, in the order they applied, with what each took off. Empty when it referenced none.

priceId
​string | null

Price ID this line references

description
​string | null

Custom description for this line item

lineType
​string | null · enum

Semantic line type

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
vatAmount
​string | null

VAT amount (decimal string)

vatRate
​string | null

VAT rate percentage (decimal string)

PublicAppliedDocumentDiscountVatPart

vatRatePct
​string · required

The VAT rate as a percent.

Example: 25.00
taxCategory
​string | null · required

The tax category of the lines at this rate.

originalReductionAmount
​string · required

What the discount took off the lines at this rate, in the document's currency.

originalVatReductionAmount
​string | null · required

The VAT that reduction took off.

PublicAppliedDocumentDiscount

discountId
​string · required

The discount record the document referenced.

position
​number · required

The order the document applied its document discounts in, from 0.

name
​string · required

The discount's name when the document was priced.

type
​string · enum · required
Enum values:
percentage
fixed
per_unit
percentagePct
​string | null · required

The percent a percentage discount took.

originalDiscountAmount
​string | null · required

A fixed discount's amount in the document's currency, taken once per document.

originalReductionAmount
​string · required

What the discount took off the document, in the document's currency. Never negative.

​PublicAppliedDocumentDiscountVatPart[] · required

The reduction split by the VAT rate of the lines it fell on. The parts add up to the reduction.

code
​string

The code the discount was claimed through, as the code is written. Present only when a code claimed it.

Example: SUMMER10

PublicInvoice

id
​string · required

Invoice ID

Example: 0197A943-2325-7829-B835-B6C71A293065
status
​string · enum · required

Invoice status

Enum values:
draft
scheduled
sending
sent
paid
partially_paid
cancelled
uncollectible
Example: sent
date
​string · required

Invoice date (ISO date)

Example: 2024-01-15
isConsolidated
​boolean · required

True when this invoice consolidates several subscriptions onto one document: a billing group’s shared invoice, or a parent customer’s invoice covering its child customers’ subscriptions. With both customerSubscriptionId and billingGroupId null it is the parent-paid kind.

Example: false
currency
​string · required

Currency code (ISO 4217)

Example: DKK
subtotal
​string · required

Subtotal before VAT (decimal string)

Example: 2166.65
vat
​string · required

VAT amount (decimal string)

Example: 541.66
amount
​string · required

Total amount including VAT (decimal string)

Example: 2708.31
​PublicInvoiceLine[] · required

Invoice lines

​PublicAppliedDocumentDiscount[] · required

The document-scope discount records the document referenced, in the order they applied, each applied once after every line discount. Empty when it referenced none.

totalDiscounted
​string | null · required

What the document's discounts took off in all, in the document's currency: each line's amount before discounts less its amount after them, plus the document discounts. A line discount typed by hand in LedgerBee counts too. Null when the document references no discount record.

Example: 250.00
createdAt
​string · required

Creation timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
updatedAt
​string · required

Last update timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
number
​string | null

Invoice number. Null while the invoice is still a draft (allocated at booking).

dueDate
​string | null

Due date (ISO date)

customerId
​string | null

Customer ID

customerSubscriptionId
​string | null

The subscription this invoice bills, when it bills exactly one. Its lines may also include the subscriptions billed as part of that subscription’s section, which carry no section of their own. Null on a billing group’s shared invoice (see billingGroupId), on a parent-paid consolidated invoice (see isConsolidated) and on a manually created invoice.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingGroupId
​string | null

The billing group this invoice is issued to, when several of one customer’s subscriptions bill onto it. Set instead of customerSubscriptionId, never alongside it. Filter the list by billingGroupId to find a group’s documents.

Example: 0197A943-2325-7829-B835-B6C71A293065
reference
​string | null

Reference / PO number

ourReference
​string | null

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string | null

Message printed on the PDF under subject. The customer sees it on the document.

PublicInvoiceListItem

id
​string · required

Invoice ID

Example: 0197A943-2325-7829-B835-B6C71A293065
status
​string · enum · required

Invoice status

Enum values:
draft
scheduled
sending
sent
paid
partially_paid
cancelled
uncollectible
Example: sent
date
​string · required

Invoice date (ISO date)

Example: 2024-01-15
isConsolidated
​boolean · required

True when this invoice consolidates several subscriptions onto one document: a billing group’s shared invoice, or a parent customer’s invoice covering its child customers’ subscriptions. With both customerSubscriptionId and billingGroupId null it is the parent-paid kind.

Example: false
currency
​string · required

Currency code (ISO 4217)

Example: DKK
subtotal
​string · required

Subtotal before VAT (decimal string)

Example: 2166.65
vat
​string · required

VAT amount (decimal string)

Example: 541.66
amount
​string · required

Total amount including VAT (decimal string)

Example: 2708.31
createdAt
​string · required

Creation timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
updatedAt
​string · required

Last update timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
number
​string | null

Invoice number. Null while the invoice is still a draft (allocated at booking).

dueDate
​string | null

Due date (ISO date)

customerId
​string | null

Customer ID

customerSubscriptionId
​string | null

The subscription this invoice bills, when it bills exactly one. Its lines may also include the subscriptions billed as part of that subscription’s section, which carry no section of their own. Null on a billing group’s shared invoice (see billingGroupId), on a parent-paid consolidated invoice (see isConsolidated) and on a manually created invoice.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingGroupId
​string | null

The billing group this invoice is issued to, when several of one customer’s subscriptions bill onto it. Set instead of customerSubscriptionId, never alongside it. Filter the list by billingGroupId to find a group’s documents.

Example: 0197A943-2325-7829-B835-B6C71A293065
reference
​string | null

Reference / PO number

ourReference
​string | null

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string | null

Message printed on the PDF under subject. The customer sees it on the document.

PublicListInvoicesResponse

​PublicInvoiceListItem[] · required

Invoices on this page (line items omitted; GET one invoice for lines)

total
​number · required

Total invoices matching the query

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

PublicUpdateInvoice

customerId
​string

Customer the invoice is for. Changing it requires lines in the same request, because each line's VAT is worked out from the customer's VAT zone. A change removes the department and contact unless the request states new ones, and removes any extra email recipients.

Example: 0197A943-2325-7829-B835-B6C71A293065
customerDepartmentId
​string | null

Customer department ID (for EAN-based e-invoicing and address override). Send null to remove the department.

Example: 0197A943-2325-7829-B835-B6C71A293065
customerContactId
​string | null

Customer contact ID (invoice recipient). Send null to remove the contact.

Example: 0197A943-2325-7829-B835-B6C71A293065
date
​string

Invoice date (ISO date, YYYY-MM-DD). The due date follows it when the invoice has payment terms and the request states no dueDate.

Example: 2024-01-15
dueDate
​string

Due date for payment (ISO date). Must not be before the invoice date.

Example: 2024-02-15
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217). Changing it requires lines in the same request, so the amounts are priced in the new currency.

Example: DKK
paymentTerms
​number

Payment terms in days. The due date follows it when the request states no dueDate.

Example: 30
reference
​string | null

Reference / PO number ("PO-nr."). Send null to clear it.

Example: PO-12345
ourReference
​string | null

Our reference ("Vores ref."). Send null to clear it.

Example: Jane Doe
description
​string | null

Internal description for your own reference. Never printed on the PDF or shown to the customer: put text for the customer in subject and notes. Send null to clear it.

Example: Monthly service invoice
subject
​string | null · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document. Leave it out to keep the stored subject; send null to clear it.

Example: Website maintenance, March
notes
​string | null

Message printed on the PDF under subject. The customer sees it on the document. Send null to clear them.

Example: Thank you for your business!
tagIds
​array | null · maxItems: 100

Tag/Dimension value IDs to attach to the journal entry when this invoice is booked. Replaces the stored set; send null or an empty array to remove every value. At most 100 ids.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
​PublicCreateInvoiceLine[] · maxItems: 1000

Invoice lines, at most 1000. Replaces every stored line, so send the full intended set. Leave it out to keep the lines as they are. Refused on an invoice billed for a subscription, a self-billed invoice, an invoice a shipment refers to, and when a stored or sent line defers its revenue (recognitionPeriodDays).

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. On an update, leaving it out keeps the discounts the document has; an empty array removes them. A change to them is sent with lines, which they are priced from: without the lines it is refused with DISCOUNT_REPRICE_NEEDS_LINES, and so is a change of the customer, the date or the currency of an invoice that carries discounts. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. The code's own limit is counted when the invoice is booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A code naming a discount already named is applied once. On an update, a discount the document carries through a code keeps that code when the update names the discount again without it. Codes are sent with lines, which they are priced from; without the lines they are refused with DISCOUNT_REPRICE_NEEDS_LINES. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicSendInvoice

deliveryType
​string · enum · required

Delivery channel

Enum values:
Email
Sproom
Manual
Leverandorservice
Example: Email
overrideEmail
​string

Override recipient email for this send only

overrideEanNumber
​string

Override EAN number for this send only

updateCustomerRecord
​boolean

Persist the override email / EAN onto the customer record

Default: false
documentTemplateId
​string

Override document template for PDF generation

PublicSendInvoiceResponse

success
​boolean · required

Whether the send was accepted

Example: true
deliveryType
​string · enum · required

The delivery channel the document was sent through

Enum values:
Email
Sproom
Manual
Leverandorservice
Factoring
Example: Email
sproomDocumentId
​string | null

Sproom document ID when sent via e-invoicing

PublicDeliveryStatusSummary

sendCount
​number · required

Number of send attempts recorded

Example: 2
lastDeliveryType
​string | null · enum

Channel of the most recent send

Enum values:
Email
Sproom
Manual
Leverandorservice
Factoring
lastRecipientEmail
​string | null

Recipient email of the most recent send

lastRecipientEan
​string | null

Recipient EAN of the most recent send

lastSentAt
​string | null

Timestamp of the most recent send (ISO)

PublicDeliveryLogEntry

id
​string · required

Delivery log entry ID

status
​string · enum · required

Outcome of the delivery attempt

Enum values:
success
failed
deliveryType
​string · enum · required

Delivery channel

Enum values:
Email
Sproom
Manual
Leverandorservice
Factoring
sentAt
​string · required

Timestamp of the attempt (ISO)

Example: 2024-01-15T10:30:00.000Z
recipientEmail
​string | null

Recipient email (email sends)

recipientEan
​string | null

Recipient EAN (e-invoice sends)

errorCode
​string | null

Error code when the attempt failed

PublicDeliveryStatusResponse

​object · required

Aggregate send summary

​PublicDeliveryLogEntry[] · required

Per-attempt delivery log entries

PublicCreateCreditNoteLine

priceId
​string

Product price ID. Required on a billable line — the line credits this product. Omit only for text / separator / discount lines (set lineType instead).

Example: 0197A943-2325-7829-B835-B6C71A293065
lineType
​string · enum

Semantic type of the line (refund, cancellation credit, text, separator, etc.)

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
description
​string

Custom description for this line item

Example: Premium widget - Blue color - Return
quantity
​number

Quantity to credit. Required on a billable line; omit for text / separator / discount lines.

Example: 2
unitPrice
​string

One-time unit-price override as a POSITIVE decimal string (the magnitude). Defaults to the price's current amount when omitted. The credit (negative) sign, totalPrice, and VAT are applied server-side and must not be sent.

Example: 1083.32
tagIds
​string[]

Dimension value IDs for this line (see GET /dimensions). When the account the line posts to requires a dimension (requiredDimensionIds on the account), the line must carry a value from it, here or in the credit note's own tagIds (which apply to every line), or the credit note cannot be sent: booking is refused with JOURNAL_TAG_REQUIRED_DIMENSION_MISSING. A line that credits an invoice line is not judged.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
discountIds
​string[] · maxItems: 20

Line-scope discount records to apply to this line. Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. A credit note that names invoiceNumber takes none: it gives back the discounts that invoice used, and is refused with DISCOUNT_CREDIT_NOTE_FOLLOWS_INVOICE if it sends any. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
sourceInvoiceLineId
​string

ID of the line on the credited invoice that this line credits (lines[].id on GET /invoices/{id}). Requires invoiceNumber, and must name a line of that invoice; otherwise the request is refused with CREDIT_NOTE_SOURCE_LINE_NOT_ON_INVOICE. A linked line gives back the line discounts the invoice line was billed with, and its share of the invoice's document discounts. The amount is not checked against what remains creditable on the invoice line, exactly as for a line without a link.

Example: 0197A943-2325-7829-B835-B6C71A293065

PublicCreateCreditNote

customerId
​string · required

Customer ID this credit note is for

Example: 0197A943-2325-7829-B835-B6C71A293065
date
​string · required

Credit note date (ISO date, YYYY-MM-DD)

Example: 2024-01-15
​PublicCreateCreditNoteLine[] · required

Credit note lines

customerDepartmentId
​string

Customer department ID (for EAN-based e-invoicing and address override)

Example: 0197A943-2325-7829-B835-B6C71A293065
customerContactId
​string

Customer contact ID (credit note recipient)

Example: 0197A943-2325-7829-B835-B6C71A293065
invoiceNumber
​string

Original invoice number this credit note credits. When set, the referenced invoice is marked credited.

Example: 1
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217). Defaults to the company default currency.

Example: DKK
reference
​string

Reference / PO number ("PO-nr.")

Example: PO-12345
ourReference
​string

Our reference ("Vores ref.")

Example: Jane Doe
description
​string

Internal description for your own reference. Never printed on the PDF or shown to the customer: put text for the customer in subject and notes.

Example: Credit for returned items
subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

Example: Credit issued due to product defect
tagIds
​string[]

Tag/Dimension value IDs to attach to the journal entry when this credit note is booked. Use the per-line tagIds for a dimension that differs between lines.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. A credit note that names invoiceNumber takes none: it gives back the discounts that invoice used, and is refused with DISCOUNT_CREDIT_NOTE_FOLLOWS_INVOICE if it sends any. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]

PublicCreditNoteLine

id
​string · required

Line item ID

Example: 0197A943-2325-7829-B835-B6C71A293065
quantity
​number · required

Quantity

Example: 2
unitPrice
​string · required

Unit price (decimal string)

Example: 1083.32
totalPrice
​string · required

Total price (decimal string)

Example: 2166.65
sourceInvoiceLineId
​string | null · required

ID of the line on the credited invoice that this line credits, as sent in lines[].sourceInvoiceLineId. Null on a line that names no invoice line.

Example: 0197A943-2325-7829-B835-B6C71A293065
subscriptionId
​string | null · required

The subscription this line credits. On a credit note that carries add-ons, an add-on’s lines name the add-on, not the parent the credit note is addressed to; on a billing group’s credit note, each line names the member it credits. Null on a line that belongs to no subscription, such as a line on a manually created credit note.

Example: 0197A943-2325-7829-B835-B6C71A293065
addonOfSubscriptionId
​string | null · required

The subscription this line’s subscription is an add-on of — the parent the add-on is billed with. Null on every line that is not an add-on’s.

Example: 0197A943-2325-7829-B835-B6C71A293065
tagIds
​string[] · required

Dimension value IDs this line carries. Empty when it carries none.

Example: ["550e8400-e29b-41d4-a716-446655440003"]
​PublicAppliedLineDiscount[] · required

The discount records this line referenced, in the order they applied, with what each took off. Empty when it referenced none.

priceId
​string | null

Price ID this line references

description
​string | null

Custom description for this line item

lineType
​string | null · enum

Semantic line type

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
vatAmount
​string | null

VAT amount (decimal string)

vatRate
​string | null

VAT rate percentage (decimal string)

PublicCreditNote

id
​string · required

Credit note ID

Example: 0197A943-2325-7829-B835-B6C71A293065
number
​string | null · required

Credit note number. Null until the credit note is sent; every sent credit note has one.

Example: CN-00001
status
​string · enum · required

Credit note status

Enum values:
draft
scheduled
sending
sent
Example: sent
date
​string · required

Credit note date (ISO date)

Example: 2024-01-15
currency
​string · required

Currency code (ISO 4217)

Example: DKK
subtotal
​string · required

Subtotal before VAT (decimal string)

Example: 2166.65
vat
​string · required

VAT amount (decimal string)

Example: 541.66
amount
​string · required

Total amount including VAT (decimal string)

Example: 2708.31
​PublicCreditNoteLine[] · required

Credit note lines

​PublicAppliedDocumentDiscount[] · required

The document-scope discount records the document referenced, in the order they applied, each applied once after every line discount. Empty when it referenced none.

totalDiscounted
​string | null · required

What the document's discounts took off in all, in the document's currency: each line's amount before discounts less its amount after them, plus the document discounts. A line discount typed by hand in LedgerBee counts too. Null when the document references no discount record.

Example: 250.00
createdAt
​string · required

Creation timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
updatedAt
​string · required

Last update timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
invoiceNumber
​string | null

Original invoice number this credit note credits

customerId
​string | null

Customer ID

customerSubscriptionId
​string | null

The subscription this credit note credits, when it credits exactly one. Null on a billing group’s credit note (see billingGroupId) and on a manually created one.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingGroupId
​string | null

The billing group this credit note is issued to, when it credits a group’s shared invoice. Set instead of customerSubscriptionId, never alongside it.

Example: 0197A943-2325-7829-B835-B6C71A293065
reference
​string | null

Reference / PO number

ourReference
​string | null

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string | null

Message printed on the PDF under subject. The customer sees it on the document.

PublicCreditNoteListItem

id
​string · required

Credit note ID

Example: 0197A943-2325-7829-B835-B6C71A293065
number
​string | null · required

Credit note number. Null until the credit note is sent; every sent credit note has one.

Example: CN-00001
status
​string · enum · required

Credit note status

Enum values:
draft
scheduled
sending
sent
Example: sent
date
​string · required

Credit note date (ISO date)

Example: 2024-01-15
currency
​string · required

Currency code (ISO 4217)

Example: DKK
subtotal
​string · required

Subtotal before VAT (decimal string)

Example: 2166.65
vat
​string · required

VAT amount (decimal string)

Example: 541.66
amount
​string · required

Total amount including VAT (decimal string)

Example: 2708.31
createdAt
​string · required

Creation timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
updatedAt
​string · required

Last update timestamp (ISO)

Example: 2024-01-15T10:30:00.000Z
invoiceNumber
​string | null

Original invoice number this credit note credits

customerId
​string | null

Customer ID

customerSubscriptionId
​string | null

The subscription this credit note credits, when it credits exactly one. Null on a billing group’s credit note (see billingGroupId) and on a manually created one.

Example: 0197A943-2325-7829-B835-B6C71A293065
billingGroupId
​string | null

The billing group this credit note is issued to, when it credits a group’s shared invoice. Set instead of customerSubscriptionId, never alongside it.

Example: 0197A943-2325-7829-B835-B6C71A293065
reference
​string | null

Reference / PO number

ourReference
​string | null

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string | null

Message printed on the PDF under subject. The customer sees it on the document.

PublicListCreditNotesResponse

​PublicCreditNoteListItem[] · required

Credit notes on this page (line items omitted; GET one for lines)

total
​number · required

Total credit notes matching the query

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

PublicSendCreditNote

deliveryType
​string · enum · required

Delivery channel

Enum values:
Email
Sproom
Manual
Leverandorservice
Example: Email
overrideEmail
​string

Override recipient email for this send only

overrideEanNumber
​string

Override EAN number for this send only

updateCustomerRecord
​boolean

Persist the override email / EAN onto the customer record

Default: false
documentTemplateId
​string

Override document template for PDF generation

PublicQuoteListItem

id
​string · required

Quote identifier

type
​string · enum · required

Always "quote"

Enum values:
quote
orderConfirmation
status
​object · required

Stored lifecycle status (draft/sent/accepted/rejected)

displayStatus
​object · required

Status to display. Equals status except derived states: "converted" or "expired".

date
​string · required

Quote date (ISO, YYYY-MM-DD)

Example: 2026-06-11
amount
​string · required

Total amount including VAT

subtotal
​string · required

Subtotal excluding VAT

vat
​string · required

Total VAT

currency
​string · required

Currency code

Example: DKK
createdAt
​string · required

Created timestamp (ISO)

updatedAt
​string · required

Updated timestamp (ISO)

documentNumber
​string

Allocated quote number (null until sent)

validUntil
​string

Valid-until date (ISO, YYYY-MM-DD)

Example: 2026-07-11
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

customerId
​string

Customer id

sourceDocumentId
​string

Source document id (set when this quote originated from another document)

convertedToDocumentId
​string

Id of the order confirmation this quote was converted into

convertedToInvoiceId
​string

Id of the invoice this quote was converted into

sentAt
​string

Timestamp the quote was sent (ISO)

PublicListQuotesResponse

​PublicQuoteListItem[] · required

List of quotes (line items omitted; GET one quote for lines)

total
​number · required

Total number of quotes matching the query

Example: 42
limit
​number · required

Maximum number of items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages available.

Example: 2

PublicQuoteLine

id
​string · required

Line identifier

quantity
​number · required

Quantity

Example: 2
unitPrice
​string · required

Unit price

Example: 1000.00
totalPrice
​string · required

Total price for the line

Example: 2000.00
​PublicAppliedLineDiscount[] · required

The discount records this line referenced, in the order they applied, with what each took off. Empty when it referenced none.

description
​string

Line description shown on the quote

lineType
​string

Semantic line type

vatRate
​string

VAT rate (percentage)

Example: 25
vatAmount
​string

VAT amount for the line

PublicDocumentDiscountWarning

code
​string · enum · required

DISCOUNT_ENDS_BEFORE_QUOTE_EXPIRY: a referenced discount stops applying before the quote expires. The quoted price, discount included, holds until the quote expires: converting the quote checks the discount at the quote date.

Enum values:
DISCOUNT_ENDS_BEFORE_QUOTE_EXPIRY
discountId
​string · required

The discount the warning is about.

name
​string · required

The discount's name.

endsAt
​string · required

The last day the discount applies to this quote, YYYY-MM-DD.

Example: 2026-12-31
validUntil
​string · required

The quote's expiry date, YYYY-MM-DD.

Example: 2027-01-15

PublicQuote

id
​string · required

Quote identifier

type
​string · enum · required

Always "quote"

Enum values:
quote
orderConfirmation
status
​object · required

Stored lifecycle status (draft/sent/accepted/rejected)

displayStatus
​object · required

Status to display. Equals status except derived states: "converted" or "expired".

date
​string · required

Quote date (ISO, YYYY-MM-DD)

Example: 2026-06-11
amount
​string · required

Total amount including VAT

subtotal
​string · required

Subtotal excluding VAT

vat
​string · required

Total VAT

currency
​string · required

Currency code

Example: DKK
createdAt
​string · required

Created timestamp (ISO)

updatedAt
​string · required

Updated timestamp (ISO)

​PublicQuoteLine[] · required
​PublicAppliedDocumentDiscount[] · required

The document-scope discount records the document referenced, in the order they applied, each applied once after every line discount. Empty when it referenced none.

totalDiscounted
​string | null · required

What the document's discounts took off in all, in the document's currency: each line's amount before discounts less its amount after them, plus the document discounts. A line discount typed by hand in LedgerBee counts too. Null when the document references no discount record.

Example: 250.00
documentNumber
​string

Allocated quote number (null until sent)

validUntil
​string

Valid-until date (ISO, YYYY-MM-DD)

Example: 2026-07-11
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

customerId
​string

Customer id

sourceDocumentId
​string

Source document id (set when this quote originated from another document)

convertedToDocumentId
​string

Id of the order confirmation this quote was converted into

convertedToInvoiceId
​string

Id of the invoice this quote was converted into

sentAt
​string

Timestamp the quote was sent (ISO)

​PublicDocumentDiscountWarning[]

Warnings about the save. Present on the create and update responses only, empty when there is nothing to warn about. A warning never blocks the save.

PublicCreateQuoteLine

priceId
​string

Product price id. Required on a billable line — the line bills this product. Omit only for text / separator / discount lines (set lineType instead).

description
​string

Custom description for the line

lineType
​string · enum

Semantic line type. Use text / separator / discount / interval_discount for non-billable lines; any other value marks the line billable (priceId + quantity required).

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
quantity
​number

Quantity. Required on a billable line; omit for text / separator / discount lines.

Example: 2
unitPrice
​string

One-time unit-price override. Defaults to the price's current amount in the document currency. totalPrice and VAT are computed server-side and must not be sent.

Example: 1000.00
discountIds
​string[] · maxItems: 20

Line-scope discount records to apply to this line. Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. An update restates every line, so a line carries the ids sent with it: a line sent without discountIds has no line discounts. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]

PublicCreateQuote

customerId
​string · required

Customer this quote is for

date
​string · required

Quote date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateQuoteLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id ("Deres ref.")

validUntil
​string

Valid-until date (ISO, YYYY-MM-DD)

Example: 2026-07-11
currency
​string

Currency code

Example: DKK
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicSendQuote

deliveryType
​string · enum

Delivery method. Defaults to Manual. Sproom/e-invoice does not apply to quotes.

Enum values:
Email
Manual
recipientEmail
​string

Override recipient email for Email delivery

PublicConvertQuotePayload

customerId
​string · required

Customer for the converted document

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateQuoteLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id

currency
​string

Currency code

reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. The converted document's own. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. The converted document's own, resolved as on any save; a discount the quote claimed through a code keeps that code when the payload names it. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicConvertQuote

target
​string · enum · required

Target to convert into. Use "orderConfirmation" to confirm the quote, or "invoice" to convert it directly into an invoice.

Enum values:
orderConfirmation
invoice
​object

Edited target document (review-before-finalize). Omit to copy the source verbatim.

discountPricing
​string · enum

How the discount records the source references are priced when a record was edited, switched off or moved out of its window after the source was priced. asQuoted keeps the source's saved figures. current prices the records as they are now, at the source's date, and refuses a record that no longer applies (DISCOUNT_NOT_APPLICABLE). Omitted means current; the response then lists a DISCOUNT_CHANGED_SINCE_QUOTE warning for each discount whose figures differ.

Enum values:
asQuoted
current
Example: asQuoted

LineDiscountType

string · enum
Enum values:
percentage
fixed
per_unit

DiscountNotApplicableReason

string · enum
Enum values:
unknown
inactive
codeRequired
notAssigned
notInGroup
outsideWindow
maxRedemptionsReached
maxPerCustomerReached

Present only when the discount no longer applies because a code that claimed it would be refused now (switched off, expired, or for another customer). Saving the document is refused until the code is removed.

PublicDiscountChangedSinceQuoteWarning

discountId
​string · required
name
​string · required

The discount's name on the source document.

scope
​string · enum · required
Enum values:
line
document
quotedType
​string · enum · required
Enum values:
percentage
fixed
per_unit
quotedValue
​string · required

The percent or amount the source was priced with.

Example: 10
quotedAmount
​string · required

What the discount took off the source.

Example: 100.00
currentType
​string · enum · required
Enum values:
percentage
fixed
per_unit
currentValue
​string | null · required

The percent or amount the record holds now.

currentAmount
​string | null · required

What the record would take off the same lines now; null when it no longer applies.

currentApplicable
​boolean · required

Whether the record still applies at the source date. Converting at the current records refuses one that does not.

code
​string · enum · required
Enum values:
DISCOUNT_CHANGED_SINCE_QUOTE
codeRefusedReason
​string · enum

Present only when the discount no longer applies because a code that claimed it would be refused now (switched off, expired, or for another customer). Saving the document is refused until the code is removed.

Enum values:
unknown
inactive
codeRequired
notAssigned
notInGroup
outsideWindow
maxRedemptionsReached
maxPerCustomerReached
discountCode
​string

The discount code the source claimed the discount through, as the code is written. Absent when the source named the discount by id.

PublicConvertQuoteResult

targetType
​string · required

Type of document produced by the conversion ("invoice" or "orderConfirmation")

Example: orderConfirmation
targetId
​string · required

Identifier of the produced document

​PublicDiscountChangedSinceQuoteWarning[] · required

One per discount whose figures differ from the source document's, when the request named no discountPricing and the conversion priced at the current records. Empty otherwise. A warning never blocks the conversion.

PublicUpdateQuote

customerId
​string · required

Customer this quote is for

date
​string · required

Quote date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateQuoteLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id ("Deres ref.")

validUntil
​string

Valid-until date (ISO, YYYY-MM-DD)

Example: 2026-07-11
currency
​string

Currency code

Example: DKK
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document. Leave it out to keep the stored subject; send null to clear it.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. On an update, leaving it out keeps the discounts the document has; an empty array removes them. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. On an update, a discount the document carries through a code keeps that code when the update names the discount again without it. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicOrderConfirmationListItem

id
​string · required

Document identifier

status
​object · required

Stored lifecycle status (draft/sent)

displayStatus
​object · required

Status to display. Equals status except the derived "converted" state.

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
amount
​string · required

Total amount including VAT

subtotal
​string · required

Subtotal excluding VAT

vat
​string · required

Total VAT

currency
​string · required

Currency code

Example: DKK
createdAt
​string · required

Created timestamp (ISO)

updatedAt
​string · required

Updated timestamp (ISO)

documentNumber
​string

Allocated document number (null until sent)

reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

customerId
​string

Customer id

sourceDocumentId
​string

Source document id (the quote this order confirmation was converted from)

convertedToInvoiceId
​string

Id of the invoice this order confirmation was converted into

sentAt
​string

Timestamp the document was sent (ISO)

PublicListOrderConfirmationsResponse

​PublicOrderConfirmationListItem[] · required

List of order confirmations (line items omitted; GET one for lines)

total
​number · required

Total number of documents matching the query

Example: 42
limit
​number · required

Maximum number of items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages available.

Example: 2

PublicOrderConfirmationLine

id
​string · required

Line identifier

quantity
​number · required

Quantity

Example: 2
unitPrice
​string · required

Unit price

Example: 1000.00
totalPrice
​string · required

Total price for the line

Example: 2000.00
​PublicAppliedLineDiscount[] · required

The discount records this line referenced, in the order they applied, with what each took off. Empty when it referenced none.

description
​string

Line description shown on the document

lineType
​string

Semantic line type

vatRate
​string

VAT rate (percentage)

Example: 25
vatAmount
​string

VAT amount for the line

PublicOrderConfirmation

id
​string · required

Document identifier

status
​object · required

Stored lifecycle status (draft/sent)

displayStatus
​object · required

Status to display. Equals status except the derived "converted" state.

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
amount
​string · required

Total amount including VAT

subtotal
​string · required

Subtotal excluding VAT

vat
​string · required

Total VAT

currency
​string · required

Currency code

Example: DKK
createdAt
​string · required

Created timestamp (ISO)

updatedAt
​string · required

Updated timestamp (ISO)

​PublicOrderConfirmationLine[] · required
​PublicAppliedDocumentDiscount[] · required

The document-scope discount records the document referenced, in the order they applied, each applied once after every line discount. Empty when it referenced none.

totalDiscounted
​string | null · required

What the document's discounts took off in all, in the document's currency: each line's amount before discounts less its amount after them, plus the document discounts. A line discount typed by hand in LedgerBee counts too. Null when the document references no discount record.

Example: 250.00
documentNumber
​string

Allocated document number (null until sent)

reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

customerId
​string

Customer id

sourceDocumentId
​string

Source document id (the quote this order confirmation was converted from)

convertedToInvoiceId
​string

Id of the invoice this order confirmation was converted into

sentAt
​string

Timestamp the document was sent (ISO)

​PublicDocumentDiscountWarning[]

Warnings about the save. Present on the create and update responses only, empty when there is nothing to warn about. A warning never blocks the save.

PublicCreateOrderConfirmationLine

priceId
​string

Product price id. Required on a billable line — the line bills this product. Omit only for text / separator / discount lines (set lineType instead).

description
​string

Custom description for the line

lineType
​string · enum

Semantic line type. Use text / separator / discount / interval_discount for non-billable lines; any other value marks the line billable (priceId + quantity required).

Enum values:
subscription
usage
proration_initial
proration_post_trial
proration_credit
proration_charge
proration_adjustment
proration_phase_transition
quantity
​number

Quantity. Required on a billable line; omit for text / separator / discount lines.

Example: 2
unitPrice
​string

One-time unit-price override. Defaults to the price's current amount in the document currency. totalPrice and VAT are computed server-side and must not be sent.

Example: 1000.00
discountIds
​string[] · maxItems: 20

Line-scope discount records to apply to this line. Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. An update restates every line, so a line carries the ids sent with it: a line sent without discountIds has no line discounts. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]

PublicCreateOrderConfirmation

customerId
​string · required

Customer this order confirmation is for

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateOrderConfirmationLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id ("Deres ref.")

currency
​string

Currency code

Example: DKK
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicSendOrderConfirmation

deliveryType
​string · enum

Delivery method. Defaults to Manual. Sproom/e-invoice does not apply to order confirmations.

Enum values:
Email
Manual
recipientEmail
​string

Override recipient email for Email delivery

PublicConvertOrderConfirmationPayload

customerId
​string · required

Customer for the converted document

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateOrderConfirmationLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id

currency
​string

Currency code

reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. The converted invoice's own. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. The converted invoice's own, resolved as on any save; a discount the order confirmation claimed through a code keeps that code when the payload names it. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicConvertOrderConfirmation

target
​string · enum · required

Target to convert into. An order confirmation only ever converts into an "invoice".

Enum values:
invoice
​object

Edited target document (review-before-finalize). Omit to copy the source verbatim.

discountPricing
​string · enum

How the discount records the source references are priced when a record was edited, switched off or moved out of its window after the source was priced. asQuoted keeps the source's saved figures. current prices the records as they are now, at the source's date, and refuses a record that no longer applies (DISCOUNT_NOT_APPLICABLE). Omitted means current; the response then lists a DISCOUNT_CHANGED_SINCE_QUOTE warning for each discount whose figures differ.

Enum values:
asQuoted
current
Example: asQuoted

PublicConvertOrderConfirmationResult

targetType
​string · required

Type of document produced by the conversion (always "invoice")

Example: invoice
targetId
​string · required

Identifier of the produced document

​PublicDiscountChangedSinceQuoteWarning[] · required

One per discount whose figures differ from the source document's, when the request named no discountPricing and the conversion priced at the current records. Empty otherwise. A warning never blocks the conversion.

PublicUpdateOrderConfirmation

customerId
​string · required

Customer this order confirmation is for

date
​string · required

Document date (ISO, YYYY-MM-DD)

Example: 2026-06-11
​PublicCreateOrderConfirmationLine[] · required
customerDepartmentId
​string

Customer department id

customerContactId
​string

Customer contact id ("Deres ref.")

currency
​string

Currency code

Example: DKK
reference
​string

PO number ("PO-nr.")

ourReference
​string

Our reference ("Vores ref.")

subject
​string | null · maxLength: 255

Heading printed in bold on the PDF, directly above notes. The customer sees it on the document. Leave it out to keep the stored subject; send null to clear it.

Example: Website maintenance, March
notes
​string

Message printed on the PDF under subject. The customer sees it on the document.

status
​string

New stored status (validated against the document type: draft/sent for order confirmations).

discountIds
​string[] · maxItems: 20

Document-scope discount records to apply once to the whole document, after every line discount, reducing the lines whose product each applies to (every line when it names no product). Each id is a discount record (see GET /discounts). The order sent is the order they apply in. Each is checked for the line's product, the document's customer and the document date; a document converted from a quote is checked at the quote's date. A fixed or per-unit discount takes its amount in the document's currency: a discount with no amount in that currency is refused, never converted at an exchange rate. One applies when it applies to the customer and to at least one line's product. On an update, leaving it out keeps the discounts the document has; an empty array removes them. Refused with: DISCOUNT_NOT_APPLICABLE (no such discount in your company, inactive, not assigned to this product and customer, or outside its dates on the document date; details.reason says which), DISCOUNT_WRONG_SCOPE, DISCOUNT_REFERENCED_TWICE, DISCOUNT_NOT_COMBINABLE, DISCOUNT_NO_AMOUNT_IN_CURRENCY, DISCOUNT_LINE_WITHOUT_PRODUCT, DISCOUNT_EXCEEDS_LINE and DISCOUNT_EXCEEDS_DOCUMENT.

Example: ["0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c"]
discountCodes
​string[] · maxItems: 20

Discount codes the customer gave, the same list sent to POST /discounts/check, matched without regard to case or surrounding spaces and applied after discountIds in the order sent. A code claims its discount, which then applies as if named by id, including one that applies only through a code: a line-scope discount lands on every line whose product it applies to, a document-scope one on the document. Saving uses none of the code's own limit: the invoice the document converts to counts it when booked, refused there with DISCOUNT_CODE_REDEMPTION_LIMIT_REACHED. A conversion carries each code with its discount, judged at the date of the document its conversion chain starts at: the quote, or an order confirmation made without one; one converted at the quoted figures keeps its codes as they were. A code naming a discount already named is applied once. On an update, a discount the document carries through a code keeps that code when the update names the discount again without it. Refused with: DISCOUNT_CODE_INVALID (empty, spaces or too long) and DISCOUNT_NOT_APPLICABLE with details.reason codeUnknown, codeInactive, codeExpired or codeCustomerMismatch and details.code, beside every refusal discountIds lists.

Example: ["SUMMER10"]

PublicDownloadLink

url
​string · required

Fetch this URL directly to download the file. It needs no API key — the URL itself is the credential.

expiresAt
​string · date-time · required

When the link stops working

ProductGroupResponse

id
​string · required

The unique identifier of the product group

Example: 550e8400-e29b-41d4-a716-446655440000
number
​string · required

Unique product-group number within the company

Example: PG001
name
​string · required

Name of the product group

Example: Office Supplies
domesticAccountId
​string · required

Ledger account ID for domestic sales

Example: 550e8400-e29b-41d4-a716-446655440000
createdAt
​string · date-time · required

When the product group was created

Example: 2024-01-15T10:30:00Z
updatedAt
​string · date-time · required

When the product group was last updated

Example: 2024-01-15T10:30:00Z
description
​string | null

Optional description

Example: Products for office use
domesticAccountNumber
​number | null

Domestic account number

Example: 1010
domesticAccountName
​string | null

Domestic account name

Example: Sales — domestic
euAccountId
​string | null

Ledger account ID for EU sales (Rubric B)

euAccountNumber
​number | null

EU account number

euAccountName
​string | null

EU account name

abroadAccountId
​string | null

Ledger account ID for sales abroad (Rubric C)

abroadAccountNumber
​number | null

Abroad account number

abroadAccountName
​string | null

Abroad account name

domesticWithoutVatAccountId
​string | null

Ledger account ID for domestic sales without VAT

domesticWithoutVatAccountNumber
​number | null

Domestic-without-VAT account number

domesticWithoutVatAccountName
​string | null

Domestic-without-VAT account name

productCount
​number

Number of products in this group (list responses only)

Example: 12

ListProductGroupsResponse

​ProductGroupResponse[] · required

Page of product groups

total
​number · required

Total number of matching product groups

Example: 42
page
​number · required

Current page number

Example: 1
limit
​number · required

Items per page

Example: 25
totalPages
​number · required

Total number of pages

Example: 2

CreateProductGroupRequest

number
​string · required

Unique product-group number within the company

Example: PG001
name
​string · required

Name of the product group

Example: Office Supplies
domesticAccountId
​string · required

Ledger account ID for domestic sales. Must reference an existing account that carries a VAT code valid for sales.

Example: 550e8400-e29b-41d4-a716-446655440000
euAccountId
​string · required

Ledger account ID for EU sales (Rubric B). Must carry a sales-valid VAT code.

abroadAccountId
​string · required

Ledger account ID for sales abroad (Rubric C). Must carry a sales-valid VAT code.

domesticWithoutVatAccountId
​string · required

Ledger account ID for domestic sales without VAT.

description
​string

Optional description

Example: Products for office use

UpdateProductGroupRequest

number
​string

Unique product-group number within the company

Example: PG001
name
​string

Name of the product group

Example: Office Supplies
description
​string

Optional description

Example: Products for office use
domesticAccountId
​string

Ledger account ID for domestic sales

euAccountId
​string

Ledger account ID for EU sales (Rubric B)

abroadAccountId
​string

Ledger account ID for sales abroad (Rubric C)

domesticWithoutVatAccountId
​string

Ledger account ID for domestic sales without VAT

DiscountAmount

currency
​string · pattern: ^[A-Za-z]{3}$ · required

ISO 4217 alpha-3 currency code.

Example: DKK
amount
​string · required

What the discount takes off in this currency, in major units, as a positive decimal string. Each currency carries its own amount: a document in a currency the discount has no amount for is refused, never converted at an exchange rate.

Example: 50.00

DiscountAssignment

id
​string · required

The assignment ID.

Example: 0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c
discountId
​string · required

The discount this assignment belongs to.

productId
​string | null · required

The product the discount applies to. Null, with no product group: every product.

productGroupId
​string | null · required

The product group the discount applies to: every product whose group it is, at the time a document is checked. Null: no group target. Never set together with productId.

customerId
​string | null · required

The customer the discount applies to. Null, with no customer group: every customer.

customerGroupId
​string | null · required

The customer group the discount applies to: every customer whose group it is, at the time a document is checked. Null: no group target. Never set together with customerId.

startsAt
​string | null · required

First calendar day the discount applies, inclusive (YYYY-MM-DD). Null: from any day.

Example: 2026-11-27
endsAt
​string | null · required

Last calendar day the discount applies, inclusive (YYYY-MM-DD). Null: it never ends.

Example: 2026-11-30

DiscountResponse

id
​string · required

The discount ID.

Example: 0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c
name
​string · required

Printed as the reason on the e-invoice allowance.

Example: Black Friday
type
​string · enum · required

percentage takes a percent off; fixed takes an amount off, per eligible line for a line discount or once per document for a document discount; per_unit takes an amount off each unit on a line and takes line scope only. The type cannot change after the discount is created.

Enum values:
percentage
fixed
per_unit
scope
​string · enum · required

line applies to each eligible line on its own. document applies once per document, after every line discount, when the customer matches and at least one line has an eligible product. A per_unit discount with document scope is refused with DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE.

Enum values:
line
document
percentagePct
​string | null · required

Percentage discounts only: the percent taken off, above 0 and at most 100. Null for other types.

Example: 10.0000
priority
​number · required

The order the server applies discounts in when it picks them itself; lowest first.

Example: 0
combinable
​boolean · required

False: a line may not reference this discount together with another one.

active
​boolean · required

An inactive discount applies nowhere.

requiresCode
​boolean · required

True: the discount applies only through one of its codes. A document or an applicability check that names it by its id alone is refused with the reason codeRequired, and GET /v1/discounts/applicable leaves it out.

maxRedemptions
​number | null · required

Total uses allowed. Null: no limit.

maxPerCustomer
​number | null · required

Uses allowed per customer. Null: no limit.

durationInPeriods
​number | null · required

How many billing periods the discount lasts on a subscription that references it. Null: for as long as the reference stands.

​DiscountAmount[] · required

Fixed and per-unit discounts: one positive amount per currency, sorted by currency. Empty for a percentage discount. A discount is applied only to a document line or document that references its id; creating or assigning it changes no document on its own.

​DiscountAssignment[] · required

Where the discount applies: each assignment names a product, a customer and a window of days, any of them null for "all". A discount with no assignment applies nowhere.

ListDiscountsResponse

​DiscountResponse[] · required

Page of discounts, ordered by priority (lowest first), then name.

total
​number · required

Total number of matching discounts

Example: 3
page
​number · required

Current page number

Example: 1
limit
​number · required

Items per page

Example: 25
totalPages
​number · required

Total number of pages

Example: 1

DiscountCodeLookupCode

id
​string · required

The code ID.

discountId
​string · required

The discount the code claims.

code
​string · required

The code as it was entered, without surrounding spaces.

Example: Summer25
normalizedCode
​string · required

The code trimmed and upper-cased: the text a lookup matches on.

Example: SUMMER25
maxRedemptions
​number | null · required

Uses allowed through this code. Null: no limit of its own.

expiresAt
​string | null · required

Last calendar day the code may be used, inclusive (YYYY-MM-DD). Null: it never expires.

Example: 2026-12-31
active
​boolean · required

False: the code is switched off and its text may be reused by a new code.

uses
​number · required

Uses counted through this code: booked invoices whose use no full credit note has given back.

Example: 0
createdAt
​string · required

When the code was created (ISO 8601).

DiscountCodeLookupDiscount

id
​string · required

The discount ID.

name
​string · required

Printed as the reason on the e-invoice allowance.

Example: Summer sale
type
​string · enum · required

percentage takes a percent off; fixed takes an amount off, per eligible line for a line discount or once per document for a document discount; per_unit takes an amount off each unit on a line and takes line scope only. The type cannot change after the discount is created.

Enum values:
percentage
fixed
per_unit
scope
​string · enum · required

line applies to each eligible line on its own. document applies once per document, after every line discount, when the customer matches and at least one line has an eligible product. A per_unit discount with document scope is refused with DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE.

Enum values:
line
document
percentagePct
​string | null · required

Percentage discounts only: the percent taken off.

combinable
​boolean · required

False: a line may not carry this discount together with another one.

​DiscountAmount[] · required

Fixed and per-unit discounts: one amount per currency.

DiscountCodeLookupResponse

code
​object | null · required

Null when your company has no such code.

discount
​object | null · required

The discount the code claims. Null when your company has no such code.

applicable
​boolean · required

Whether the code applies for this customer, product and day.

reason
​string · enum · required

Null when it applies. Otherwise the first check that failed: codeUnknown (no such code in your company), then the discount's own inactive, notAssigned, notInGroup (an assignment would match, but the product or the customer is not in the group it targets), outsideWindow, maxRedemptionsReached, maxPerCustomerReached, then the code's codeInactive, codeExpired (past its last day), codeCustomerMismatch (the code is for another customer, or for a customer and none was given) and codeMaxRedemptionsReached.

Enum values:
unknown
inactive
codeRequired
notAssigned
notInGroup
outsideWindow
maxRedemptionsReached
maxPerCustomerReached
remaining
​number | null · required

Uses left under the discount's maxRedemptions. Null: no total limit.

remainingForCustomer
​number | null · required

Uses left for this customer under the discount's maxPerCustomer. Null: no such limit, or no customer given.

remainingForCode
​number | null · required

Uses left under the code's own maxRedemptions. Null: no limit of its own.

DiscountCheckLineRequest

productId
​string · required

The product the line sells.

quantity
​number · required

Units on the line. Negative for a returned item.

Example: 1
unitPrice
​string · required

The unit price before discounts, in the cart's currency, as a decimal string.

Example: 1000.00
vatRatePct
​number

The line's VAT rate as a percent. Send it on every line to get each document discount's split by VAT rate.

Example: 25

DiscountCheckRequest

currency
​string · pattern: ^[A-Za-z]{3}$ · required

The cart's currency, ISO 4217 alpha-3. A fixed or per-unit discount needs an amount in it.

Example: DKK
date
​string · required

The calendar day the cart is priced on (YYYY-MM-DD).

Example: 2026-11-27
​DiscountCheckLineRequest[] · required

1 to 200 lines.

customerId
​string

The customer buying. Omitted: a guest, to whom only assignments for every customer apply, a code made for one customer does not apply, and no per-customer use is counted.

codes
​string[]

Codes the shopper typed, at most 20, matched without regard to case or surrounding spaces. They apply after discountIds, in the order sent.

Example: ["SUMMER25"]
discountIds
​string[]

Discounts applied by id, at most 50, in the order sent and before the codes.

DiscountCheckLineDiscount

discountId
​string · required

The discount ID.

code
​string | null · required

The code it was claimed through. Null: named by id.

originalReductionAmount
​string · required

What it takes off the line, in the cart's currency. Never negative.

Example: 100.00

DiscountCheckLine

lineIndex
​number · required

The index of the line in the request, from 0.

​DiscountCheckLineDiscount[] · required

The line discounts, in the order they apply.

originalNet
​string · required

The line after its line discounts and before any document discount, in the cart's currency. Negative on a returned item.

Example: 900.00

DiscountCheckVatPart

vatRatePct
​string · required
originalReductionAmount
​string · required

What the discount takes off the lines at this rate.

originalVatReductionAmount
​string · required

The VAT that reduction takes off.

taxCategory
​string · enum
Enum values:
S
Z
AE
E
G
O
K
L

DiscountCheckDocumentDiscount

discountId
​string · required

The discount ID.

code
​string | null · required

The code it was claimed through. Null: named by id.

originalReductionAmount
​string · required

What it takes off the lines it covers, in the cart's currency.

Example: 130.00
vatSplitAvailable
​boolean · required

False when a line the discount falls on was sent without vatRatePct. vatSplit is then null.

​array | null · required

The reduction per VAT rate, adding up to it. Null when vatSplitAvailable is false.

DiscountCheckRefusal

code
​string | null · required

The code, upper-cased as matched. Null for a discount sent in discountIds.

discountId
​string | null · required

Null for a code your company does not have.

reason
​string · required

Why it was left out: an applicability reason such as codeUnknown or maxRedemptionsReached, or the error code a document would be refused with, such as DISCOUNT_NO_AMOUNT_IN_CURRENCY.

Example: codeUnknown
lineIndex
​number | null · required

The line it was refused on. Null: the cart as a whole.

DiscountCheckLimit

discountId
​string · required

The discount ID.

code
​string | null · required

The code it was claimed through. Null: named by id.

remaining
​number | null · required

Uses left under maxRedemptions. Null: no total limit.

remainingForCustomer
​number | null · required

Uses left for the customer under maxPerCustomer. Null: no such limit, or a guest.

remainingForCode
​number | null · required

Uses left under the code's own maxRedemptions. Null: named by id, or the code has no limit.

DiscountCheckResponse

​DiscountCheckLine[] · required

Every line of the request, in order.

​DiscountCheckDocumentDiscount[] · required
​DiscountCheckRefusal[] · required
​DiscountCheckLimit[] · required

One row per discount the cart named.

DiscountApplicabilityResponse

applicable
​boolean · required

Whether the discount applies to this customer and product on this day.

reason
​string · enum · required

Null when it applies. Otherwise the first check that failed: unknown (no such discount in your company), inactive, codeRequired (the discount applies only through a code), notAssigned (no assignment names this product and customer, or all), notInGroup (an assignment would match, but the product or the customer is not in the group it targets), outsideWindow (an assignment matches, but not on this day), maxRedemptionsReached (no use left under maxRedemptions), maxPerCustomerReached (no use left for this customer under maxPerCustomer).

Enum values:
unknown
inactive
codeRequired
notAssigned
notInGroup
outsideWindow
maxRedemptionsReached
maxPerCustomerReached
remaining
​number | null · required

Uses left under maxRedemptions, counted from booked invoices whose uses no full credit note has given back. Null when the discount has no total limit, or no such discount exists in your company.

Example: 3
remainingForCustomer
​number | null · required

Uses left for this customer under maxPerCustomer. Null when the discount has no per-customer limit, or no such discount exists in your company.

Example: 1

CreateDiscountRequest

name
​string · required

Printed as the reason on the e-invoice allowance.

Example: Loyalty 10%
type
​string · enum · required

percentage takes a percent off; fixed takes an amount off, per eligible line for a line discount or once per document for a document discount; per_unit takes an amount off each unit on a line and takes line scope only. The type cannot change after the discount is created.

Enum values:
percentage
fixed
per_unit
scope
​string · enum · required

line applies to each eligible line on its own. document applies once per document, after every line discount, when the customer matches and at least one line has an eligible product. A per_unit discount with document scope is refused with DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE.

Enum values:
line
document
percentagePct
​string

Required for a percentage discount, refused for other types: the percent off, above 0 and at most 100, with at most 4 decimals. Outside that range: DISCOUNT_INVALID_PERCENTAGE.

Example: 10
priority
​number

The order the server applies discounts in when it picks them itself; lowest first. Defaults to 0.

Example: 0
combinable
​boolean

False: a line may not reference this discount together with another one. Defaults to true.

active
​boolean

An inactive discount applies nowhere. Defaults to true.

requiresCode
​boolean

True: the discount applies only through one of its codes. A document or an applicability check that names it by its id alone is refused with the reason codeRequired, and GET /v1/discounts/applicable leaves it out. Defaults to false.

maxRedemptions
​number | null

Total uses allowed. Null or omitted: no limit.

maxPerCustomer
​number | null

Uses allowed per customer. Null or omitted: no limit.

durationInPeriods
​number | null · min: 1

How many billing periods the discount lasts on a subscription that references it. Null or omitted: for as long as the reference stands.

​DiscountAmount[]

Fixed and per-unit discounts only: one positive amount per currency, each currency at most once. Amounts are never converted between currencies. Refused on a percentage discount.

UpdateDiscountRequest

name
​string

Printed as the reason on the e-invoice allowance.

type
​string · enum

Accepted only when it equals the current type. The type cannot change after creation: a different value is refused with DISCOUNT_TYPE_IMMUTABLE.

Enum values:
percentage
fixed
per_unit
scope
​string · enum

line applies to each eligible line on its own. document applies once per document, after every line discount, when the customer matches and at least one line has an eligible product. A per_unit discount with document scope is refused with DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE.

Enum values:
line
document
percentagePct
​string

Percentage discounts only: above 0 and at most 100, with at most 4 decimals. Outside that range: DISCOUNT_INVALID_PERCENTAGE.

Example: 15
priority
​number

The order the server applies discounts in when it picks them itself.

combinable
​boolean

False: a line may not reference this discount together with another one.

active
​boolean

An inactive discount applies nowhere.

requiresCode
​boolean

True: the discount applies only through one of its codes. A document or an applicability check that names it by its id alone is refused with the reason codeRequired, and GET /v1/discounts/applicable leaves it out.

maxRedemptions
​number | null

Null removes the limit.

maxPerCustomer
​number | null

Null removes the limit.

durationInPeriods
​number | null · min: 1

Null: lasts for as long as a subscription references it.

applyToSubscriptions
​boolean

True accepts moving the subscriptions that reference the discount onto the edited terms: each takes them from its next billing period, as a new version. Omitted or false: an edit that changes what the discount takes off (percent, amount, scope, combinable) while subscriptions reference it is refused with DISCOUNT_IN_USE_ON_SUBSCRIPTIONS and nothing is saved.

DiscountOpenDocument

id
​string · required

The quote, order confirmation or invoice ID; for a subscription, the ID of its version in effect (the id GET /v1/subscriptions/customer-subscriptions/{id} takes).

kind
​string · enum · required

What kind of document it is.

Enum values:
quote
orderConfirmation
invoice
subscription
number
​string | null · required

The document number. Null until the document is sent, and for a subscription.

reference
​string | null · required

The document's reference, if it has one; a subscription's name.

status
​string · required

The stored status: draft, sent or accepted for a quote or order confirmation, draft for an invoice, the subscription's own status for a subscription.

validUntil
​string | null · required

A quote's expiry date (YYYY-MM-DD); null for other documents.

DiscountInUseOnOpenDocumentsWarning

code
​string · enum · required
Enum values:
DISCOUNT_IN_USE_ON_OPEN_DOCUMENTS
total
​number · required

How many open documents reference the discount.

​DiscountOpenDocument[] · required

The open documents, newest first, at most 50, of the kinds your key may read: quotes with quotes-read, order confirmations with order-confirmations-read, invoices with invoices-read. total counts them all.

DiscountSubscriptionTermsChange

customerSubscriptionId
​string · required

The subscription version the change was applied from; when scheduled, the new version.

chainHeadId
​string · required

The id of the subscription's first version, the same on every version.

name
​string | null · required

Null unless your key has subscriptions-read.

customerName
​string | null · required

Null unless your key has subscriptions-read.

effectiveDate
​string | null · required

The first day billed on the new terms (YYYY-MM-DD): the start of the next billing period.

outcome
​string · enum · required

scheduled: a new version from effectiveDate bills the new terms. failed: the subscription keeps billing the old terms; errorCode says why.

Enum values:
scheduled
failed
errorCode
​string | null · required

UpdateDiscountResponse

id
​string · required

The discount ID.

Example: 0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c
name
​string · required

Printed as the reason on the e-invoice allowance.

Example: Black Friday
type
​string · enum · required

percentage takes a percent off; fixed takes an amount off, per eligible line for a line discount or once per document for a document discount; per_unit takes an amount off each unit on a line and takes line scope only. The type cannot change after the discount is created.

Enum values:
percentage
fixed
per_unit
scope
​string · enum · required

line applies to each eligible line on its own. document applies once per document, after every line discount, when the customer matches and at least one line has an eligible product. A per_unit discount with document scope is refused with DISCOUNT_PER_UNIT_NEEDS_LINE_SCOPE.

Enum values:
line
document
percentagePct
​string | null · required

Percentage discounts only: the percent taken off, above 0 and at most 100. Null for other types.

Example: 10.0000
priority
​number · required

The order the server applies discounts in when it picks them itself; lowest first.

Example: 0
combinable
​boolean · required

False: a line may not reference this discount together with another one.

active
​boolean · required

An inactive discount applies nowhere.

requiresCode
​boolean · required

True: the discount applies only through one of its codes. A document or an applicability check that names it by its id alone is refused with the reason codeRequired, and GET /v1/discounts/applicable leaves it out.

maxRedemptions
​number | null · required

Total uses allowed. Null: no limit.

maxPerCustomer
​number | null · required

Uses allowed per customer. Null: no limit.

durationInPeriods
​number | null · required

How many billing periods the discount lasts on a subscription that references it. Null: for as long as the reference stands.

​DiscountAmount[] · required

Fixed and per-unit discounts: one positive amount per currency, sorted by currency. Empty for a percentage discount. A discount is applied only to a document line or document that references its id; creating or assigning it changes no document on its own.

​DiscountAssignment[] · required

Where the discount applies: each assignment names a product, a customer and a window of days, any of them null for "all". A discount with no assignment applies nowhere.

​DiscountInUseOnOpenDocumentsWarning[] · required

Warnings about the edit, empty when there is nothing to warn about. DISCOUNT_IN_USE_ON_OPEN_DOCUMENTS lists the open quotes (not converted, rejected or expired), order confirmations (not converted) and invoice drafts that reference the discount. The edit is saved either way. A sent quote or order confirmation keeps its discount figures until it is converted; an invoice draft takes the new value the next time it is saved. Given when the edit changed what the discount takes off or where it applies (percent, amounts, scope, active, combinable, requiresCode); a rename or a change to priority or limits gives none.

​DiscountSubscriptionTermsChange[] · required

With applyToSubscriptions: true, the subscriptions whose terms the edit changed: each takes the new terms from its next billing period. Empty otherwise.

SetDiscountAmountRequest

amount
​string · required

The amount in the path's currency. What the discount takes off in this currency, in major units, as a positive decimal string. Each currency carries its own amount: a document in a currency the discount has no amount for is refused, never converted at an exchange rate.

Example: 8.00
applyToSubscriptions
​boolean

True accepts moving the subscriptions that reference the discount onto the edited terms: each takes them from its next billing period, as a new version. Omitted or false: an edit that changes what the discount takes off (percent, amount, scope, combinable) while subscriptions reference it is refused with DISCOUNT_IN_USE_ON_SUBSCRIPTIONS and nothing is saved.

CreateDiscountAssignmentRequest

productId
​string | null

The product the discount applies to. Null or omitted, with no product group: every product.

productGroupId
​string | null

The product group the discount applies to: every product in it. Set at most one of productId and productGroupId; both is refused with DISCOUNT_ASSIGNMENT_TARGET_CONFLICT.

customerId
​string | null

The customer the discount applies to. Null or omitted, with no customer group: every customer.

customerGroupId
​string | null

The customer group the discount applies to: every customer in it. Set at most one of customerId and customerGroupId; both is refused with DISCOUNT_ASSIGNMENT_TARGET_CONFLICT.

startsAt
​string | null

First calendar day it applies, inclusive (YYYY-MM-DD). Null or omitted: from any day.

Example: 2026-11-27
endsAt
​string | null

Last calendar day it applies, inclusive (YYYY-MM-DD). Null or omitted: it never ends.

Example: 2026-11-30

UpdateDiscountAssignmentResponse

id
​string · required

The assignment ID.

Example: 0199b6d2-3c1a-7a40-9f00-1d2e3f4a5b6c
discountId
​string · required

The discount this assignment belongs to.

productId
​string | null · required

The product the discount applies to. Null, with no product group: every product.

productGroupId
​string | null · required

The product group the discount applies to: every product whose group it is, at the time a document is checked. Null: no group target. Never set together with productId.

customerId
​string | null · required

The customer the discount applies to. Null, with no customer group: every customer.

customerGroupId
​string | null · required

The customer group the discount applies to: every customer whose group it is, at the time a document is checked. Null: no group target. Never set together with customerId.

startsAt
​string | null · required

First calendar day the discount applies, inclusive (YYYY-MM-DD). Null: from any day.

Example: 2026-11-27
endsAt
​string | null · required

Last calendar day the discount applies, inclusive (YYYY-MM-DD). Null: it never ends.

Example: 2026-11-30
​DiscountInUseOnOpenDocumentsWarning[] · required

Warnings about the edit, empty when there is nothing to warn about. DISCOUNT_IN_USE_ON_OPEN_DOCUMENTS lists the open quotes (not converted, rejected or expired), order confirmations (not converted) and invoice drafts that reference the discount. The edit is saved either way. A sent quote or order confirmation keeps its discount figures until it is converted; an invoice draft takes the new value the next time it is saved. Given when an assignment is added, or an edit moves its product, product group, customer, customer group or dates.

UpdateDiscountAssignmentRequest

productId
​string | null

The product the discount applies to. Null or omitted, with no product group: every product.

productGroupId
​string | null

The product group the discount applies to: every product in it. Set at most one of productId and productGroupId; both is refused with DISCOUNT_ASSIGNMENT_TARGET_CONFLICT.

customerId
​string | null

The customer the discount applies to. Null or omitted, with no customer group: every customer.

customerGroupId
​string | null

The customer group the discount applies to: every customer in it. Set at most one of customerId and customerGroupId; both is refused with DISCOUNT_ASSIGNMENT_TARGET_CONFLICT.

startsAt
​string | null

First calendar day it applies, inclusive (YYYY-MM-DD). Null or omitted: from any day.

Example: 2026-11-27
endsAt
​string | null

Last calendar day it applies, inclusive (YYYY-MM-DD). Null or omitted: it never ends.

Example: 2026-11-30

RemoveDiscountAssignmentResponse

​DiscountInUseOnOpenDocumentsWarning[] · required

Warnings about the edit, empty when there is nothing to warn about. DISCOUNT_IN_USE_ON_OPEN_DOCUMENTS lists the open quotes (not converted, rejected or expired), order confirmations (not converted) and invoice drafts that reference the discount. The edit is saved either way. A sent quote or order confirmation keeps its discount figures until it is converted; an invoice draft takes the new value the next time it is saved. Given whenever open documents reference the discount, since removing an assignment narrows where it applies.

DiscountCode

id
​string · required

The code ID.

discountId
​string · required

The discount the code claims.

code
​string · required

The code as it was entered, without surrounding spaces.

Example: Summer25
normalizedCode
​string · required

The code trimmed and upper-cased: the text a lookup matches on.

Example: SUMMER25
customerId
​string | null · required

The one customer who may use the code. Null: any customer the discount applies to.

maxRedemptions
​number | null · required

Uses allowed through this code. Null: no limit of its own.

expiresAt
​string | null · required

Last calendar day the code may be used, inclusive (YYYY-MM-DD). Null: it never expires.

Example: 2026-12-31
active
​boolean · required

False: the code is switched off and its text may be reused by a new code.

uses
​number · required

Uses counted through this code: booked invoices whose use no full credit note has given back.

Example: 0
createdAt
​string · required

When the code was created (ISO 8601).

ListDiscountCodesResponse

​DiscountCode[] · required

Page of the discount's codes, active and switched off, oldest first.

total
​number · required

Total number of codes the discount has

Example: 3
page
​number · required

Current page number

Example: 1
limit
​number · required

Items per page

Example: 25
totalPages
​number · required

Total number of pages

Example: 1

CreateDiscountCodeRequest

code
​string · required

The code a customer types: 1 to 64 characters with no space inside, matched without regard to case or surrounding spaces. Otherwise DISCOUNT_CODE_INVALID; an active code of your company with the same text: DISCOUNT_CODE_TAKEN.

Example: SUMMER25
customerId
​string | null

The one customer who may use the code. It must be a customer the discount's assignments cover, or DISCOUNT_CODE_CUSTOMER_NOT_ASSIGNED. Null or omitted: any customer.

maxRedemptions
​number | null

Uses allowed through this code. Null or omitted: no limit.

expiresAt
​string | null

Last calendar day the code may be used, inclusive (YYYY-MM-DD). Null or omitted: never expires.

Example: 2026-12-31
active
​boolean

Defaults to true.

UpdateDiscountCodeRequest

active
​boolean

False switches the code off. True switches it back on, refused with DISCOUNT_CODE_TAKEN if another active code now holds its text.

customerId
​string | null

Null: any customer the discount applies to.

maxRedemptions
​number | null

Null removes the limit.

expiresAt
​string | null

Null: never expires.

Example: 2026-12-31

EntitlementResponse

id
​string · required

Entitlement ID

name
​string · required

Entitlement name

Example: Advanced reporting
managedExternally
​boolean · required

True when the entitlement is maintained by an external system rather than created by an operator in the app. Only rows with externalSource "api" can be modified through this API.

Example: false
externalSource
​string | null · enum · required

Which system maintains the entitlement: "api" (created via this API), "platform" (managed by LedgerBee, read-only here), or null for operator-created rows.

Enum values:
api
platform
Example: api
createdAt
​string · date-time · required

When the entitlement was created

updatedAt
​string · date-time · required

When the entitlement was last updated

key
​string | null

Stable integration key

Example: advanced_reporting

ListEntitlementsResponse

​EntitlementResponse[] · required
total
​number · required
page
​number · required
limit
​number · required
totalPages
​number · required

CreateEntitlementRequest

name
​string · required

Entitlement name

Example: Advanced reporting
key
​string | null

Stable integration key

Example: advanced_reporting

UpdateEntitlementRequest

name
​string

Entitlement name

key
​string | null

Stable integration key

ProductPriceTierResponse

id
​string · required

Tier ID

Example: 550e8400-e29b-41d4-a716-446655440000
fromQuantity
​number · required

Starting quantity (inclusive)

Example: 1
unitAmount
​string · required

Price per unit for this tier

Example: 99.99
toQuantity
​number | null

Ending quantity (inclusive). Null = no upper limit.

Example: 10
flatFee
​string | null

Optional flat fee for this tier

Example: 10.00

ProductPriceResponse

id
​string · required

The unique identifier of the price (use as a line priceId)

Example: 550e8400-e29b-41d4-a716-446655440000
productId
​string · required

The product this price belongs to

billingPeriodType
​string · enum · required

Billing period type

Enum values:
recurring
usage
one_time
surcharge
pricingModel
​string · enum · required

Pricing model

Enum values:
flat_rate
package
volume
graduated
currency
​string · required

Currency of the displayed unitAmount (ISO 4217)

Example: DKK
baseCurrency
​string · required

Base currency (source of truth for conversions)

Example: DKK
status
​string · enum · required

Price status

Enum values:
draft
active
inactive
archived
isDefault
​boolean · required

Whether this is the default price for the product

Example: false
isLocked
​boolean · required

Whether the price is locked (in use by a subscription/invoice)

Example: false
allowFreePrice
​boolean · required

The owning product's allowFreePrice: whether a 0 on this price is a deliberate free price rather than no price set.

Example: false
vatRatesByZone
​object · required

VAT rates by zone (derived from the product group), e.g. { domestic: "25", eu: "0", abroad: "0", domestic_without_vat: "0" }

nickname
​string | null

Optional nickname (e.g. "Monthly")

unitAmount
​string | null

Unit amount for flat-rate pricing in currency

Example: 99.99
billingInterval
​string | null · enum

Billing interval (null for one-time)

Enum values:
day
week
month
year
billingIntervalCount
​number | null

Billing interval count

Example: 1
availableCurrencies
​string[]

Currencies with a price-history entry

meterId
​string | null

Meter ID for usage-based pricing

​ProductPriceTierResponse[]

Pricing tiers (package/volume/graduated)

ProductListItem

id
​string · required

The unique identifier of the product

Example: 550e8400-e29b-41d4-a716-446655440000
productNumber
​string · required

Unique product number within the company

Example: P001
name
​string · required

Name of the product

Example: Web Hosting
unit
​string · required

Unit of measurement

Example: pcs
productGroupId
​string · required

Product group this product belongs to

productType
​string · enum · required

Product type (goods or services) for EU VAT

Enum values:
goods
services
isActive
​boolean · required

Whether the product is active

Example: true
isArchived
​boolean · required

Whether the product is archived

Example: false
isLocked
​boolean · required

Whether the product is locked (in use, cannot be deleted)

Example: false
allowFreePrice
​boolean · required

Whether a price of 0 on this product is a deliberate free price. Off, a price of 0 cannot be saved and a stored 0 reads as no price set.

Example: false
createdAt
​string · date-time · required

When the product was created

Example: 2024-01-15T10:30:00Z
updatedAt
​string · date-time · required

When the product was last updated

Example: 2024-01-15T10:30:00Z
description
​string | null

Optional description

​ProductPriceResponse[]

Prices configured for this product

​object

Key-value metadata attached to the product

Example: {"sku":"WH-100","catalogSection":"hosting"}

ListProductsResponse

​ProductListItem[] · required

Page of products, each with its prices (GET one product for its entitlements)

total
​number · required

Total number of matching products

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total number of pages.

Example: 2

ProductResponse

id
​string · required

The unique identifier of the product

Example: 550e8400-e29b-41d4-a716-446655440000
productNumber
​string · required

Unique product number within the company

Example: P001
name
​string · required

Name of the product

Example: Web Hosting
unit
​string · required

Unit of measurement

Example: pcs
productGroupId
​string · required

Product group this product belongs to

productType
​string · enum · required

Product type (goods or services) for EU VAT

Enum values:
goods
services
isActive
​boolean · required

Whether the product is active

Example: true
isArchived
​boolean · required

Whether the product is archived

Example: false
isLocked
​boolean · required

Whether the product is locked (in use, cannot be deleted)

Example: false
allowFreePrice
​boolean · required

Whether a price of 0 on this product is a deliberate free price. Off, a price of 0 cannot be saved and a stored 0 reads as no price set.

Example: false
createdAt
​string · date-time · required

When the product was created

Example: 2024-01-15T10:30:00Z
updatedAt
​string · date-time · required

When the product was last updated

Example: 2024-01-15T10:30:00Z
description
​string | null

Optional description

​ProductPriceResponse[]

Prices configured for this product

​EntitlementRef[]

Entitlements granted by this product

​object

Key-value metadata attached to the product

Example: {"sku":"WH-100","catalogSection":"hosting"}

CreateProductPriceTierRequest

fromQuantity
​number · required

Starting quantity (inclusive)

Example: 1
unitAmount
​string · required

Price per unit for this tier

Example: 99.99
toQuantity
​number

Ending quantity (inclusive). Omit for the open-ended top tier.

Example: 10
flatFee
​string

Optional flat fee for this tier

Example: 10.00

CreateProductInitialPriceRequest

billingPeriodType
​string · enum · required

Billing period type. RECURRING and USAGE both require a Subscription license.

Enum values:
recurring
usage
one_time
surcharge
pricingModel
​string · enum · required

Pricing model

Enum values:
flat_rate
package
volume
graduated
nickname
​string

Optional nickname (e.g. "Monthly")

Example: Monthly
unitAmount
​string

Unit amount. Required for FLAT_RATE pricing; for tiered models (PACKAGE/VOLUME/GRADUATED) the amounts live in tiers.

Example: 99.99
billingInterval
​string · enum

Billing interval (required unless one-time)

Enum values:
day
week
month
year
billingIntervalCount
​number

Billing interval count

Example: 1
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217)

Example: DKK
meterId
​string

Meter ID (required for USAGE pricing)

​CreateProductPriceTierRequest[]

Pricing tiers. Required for tiered models: PACKAGE (exactly 1), VOLUME / GRADUATED (one or more, last tier open-ended). Omit for FLAT_RATE.

CreateProductRequest

productNumber
​string · required

Unique product number within the company

Example: P001
name
​string · maxLength: 300 · required

Name of the product

Example: Web Hosting
unit
​string · maxLength: 255 · required

Unit of measurement

Example: pcs
productGroupId
​string · required

Product group this product belongs to (must exist)

Example: 550e8400-e29b-41d4-a716-446655440000
description
​string · maxLength: 1000

Optional description

isActive
​boolean

Whether the product is active

Default: true
productType
​string · enum

Product type (goods or services)

Enum values:
goods
services
Default: services
allowFreePrice
​boolean

Whether a price of 0 on this product is a deliberate free price. Off, a price of 0 cannot be saved.

Default: false
​object

Optional initial price. If provided it is created, activated and set as default in one transaction.

entitlementIds
​array | null · maxItems: 100

Externally managed entitlement IDs to bind (max 100)

​object

Key-value metadata to attach to the product. At most 50 entries; keys up to 128 characters, string values up to 500 characters.

Example: {"sku":"WH-100"}

UpdateProductRequest

productNumber
​string

Unique product number within the company

Example: P001
name
​string · maxLength: 300

Name of the product

Example: Web Hosting
description
​string · maxLength: 1000

Optional description

unit
​string · maxLength: 255

Unit of measurement

Example: pcs
productGroupId
​string

Product group this product belongs to

isActive
​boolean

Whether the product is active

productType
​string · enum

Product type (goods or services)

Enum values:
goods
services
allowFreePrice
​boolean

Whether a price of 0 on this product is a deliberate free price. Omit to leave unchanged. Turning it off leaves stored prices as they are.

entitlementIds
​array | null · maxItems: 100

Externally managed entitlement IDs to bind (max 100)

​object

Key-value metadata. When provided, REPLACES the product metadata wholesale — send the complete desired map; an empty object clears all entries. Omit the field to leave metadata unchanged. At most 50 entries; keys up to 128 characters, string values up to 500 characters.

Example: {"sku":"WH-100"}

OnHandRowDTO

productId
​string · required
productName
​string | null · required
warehouseId
​string | null · required
locationId
​string | null · required
qualityStatus
​string · required

Quality status of the stock this row counts.

quantity
​string · required

On-hand at the stock ledger's own scale.

Example: 12.000000

ListOnHandResponseDTO

​OnHandRowDTO[] · required
total
​number · required
limit
​number · required
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1

StockMovementRowDTO

id
​string · required
movementNo
​string · required

The movement number, allocated when it was recorded.

productId
​string | null · required
fromWarehouseId
​string | null · required

Null when the stock came from outside every warehouse.

toWarehouseId
​string | null · required

Null when the stock left for outside every warehouse.

quantity
​string · required

Units moved, at the stock ledger's own scale.

Example: 2.000000
occurredAt
​string · required

When the stock actually moved (ISO 8601).

accountingDate
​string · required

The date the movement is accounted on (YYYY-MM-DD).

movementReason
​string · enum · required

Why the stock moved.

Enum values:
PURCHASE_RECEIPT
PURCHASE_RETURN
SALES_ISSUE
SALES_RETURN
OPENING_BALANCE
COUNT_GAIN
COUNT_LOSS
SCRAP
sourceDocumentType
​string | null · required

The kind of document that caused it, e.g. SHIPMENT.

sourceDocumentId
​string | null · required

That document, so you can join the movement back to it.

ListStockMovementsResponseDTO

​StockMovementRowDTO[] · required
total
​number · required
limit
​number · required
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1

CreateShipmentLineDTO

productId
​string · required

The product to ship.

quantity
​string · required

Units ordered.

Example: 2
unitPrice
​string · required

Price per unit, in the order's currency.

Example: 50.00

CreateShipmentDTO

warehouseId
​string · required

The warehouse the goods leave from.

customerEmail
​string · required

The buyer's email. Matched against your customers; created when new.

currency
​string · required

ISO 4217 alpha-3 currency code.

Example: DKK
​CreateShipmentLineDTO[] · required
customerName
​string

The buyer's name, used when the customer has to be created.

customerCountryCode
​string

ISO 3166-1 alpha-2 country the goods go to. Used when the customer has to be created: outside the EU the buyer is placed abroad and billed without VAT; inside the EU, or when omitted, in your company's domestic VAT zone.

Example: US
externalOrderId
​string

Your own order reference. Quoted back on any refusal this request answers with.

orderDate
​string

Order date (YYYY-MM-DD). Defaults to today.

taxTotal
​string

Your own tax total for the order. Compared against the draft's VAT; a difference larger than rounding is refused rather than posted.

ShipmentLineDTO

id
​string · required
productId
​string | null · required
quantity
​string · required

ShipmentDTO

id
​string · required
shipmentNo
​string | null · required

Allocated at dispatch; null while the shipment is a draft.

status
​string · enum · required
Enum values:
DRAFT
DISPATCHED
CANCELLED
warehouseId
​string · required
customerId
​string | null · required
invoiceId
​string | null · required

The draft invoice this shipment ships against.

dispatchedAt
​string | null · required
​ShipmentLineDTO[] · required
createdAt
​string · required

ListShipmentsResponseDTO

​ShipmentDTO[] · required
total
​number · required
limit
​number · required
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page number.

Example: 1

DispatchShipmentDTO

accountingDate
​string

Accounting date for the cost posting (YYYY-MM-DD). Defaults to today.

trackingNumber
​string · maxLength: 100

The carrier's tracking number for the parcel. Recorded on the shipment, and reported back to the shop when this shipment came from a sales-channel order.

PublicOpenEntry

kind
​string · enum · required

What this row points at. Echo it back verbatim as a settlement selection — an ANCHOR and a PREPAYMENT are stored alike and are not interchangeable.

Enum values:
ANCHOR
PAYMENT
PREPAYMENT
id
​string · required

ID of the entry — the invoice anchor for ANCHOR and PREPAYMENT rows, the payment entry for PAYMENT.

Example: 0197A943-2325-7829-B835-B6C71A293065
type
​string · enum · required

What the entry is.

Enum values:
INVOICE
REMINDER
CREDIT_NOTE
PAYMENT
PREPAYMENT
reference
​string · required

Invoice number, payment reference, or anchor number.

Example: INV-1043
date
​string · required

Posting date of the original entry (YYYY-MM-DD).

Example: 2026-08-14
currency
​string · required

Currency of the original entry (3-letter ISO).

Example: EUR
originalAmount
​number · required

Signed face amount in the entry’s own currency. Positive on an invoice, negative on a credit note.

Example: 1250
remainingAmount
​number · required

Signed amount still open, in the entry’s own currency. This is the ceiling for amountToApply.

Example: 400
baseRemainingAmount
​number · required

The same remaining amount converted to the company’s base currency at the entry’s booked rate.

Example: 2980
version
​string · required

Concurrency token. Pass it back on a settlement selection and the request is refused if the entry changed in the meantime.

Example: 2026-08-14T09:31:07.000Z
settledWithRemainder
​boolean · required

True on an invoice or credit note that is recorded as paid while part of it, less than its whole amount, is still left on it. remainingAmount and baseRemainingAmount are then only that amount, and the per-currency totals include it. Such an entry settles only together with entries that cancel it exactly in the base currency, so the settlement posts nothing; any other selection that includes it is refused with SETTLEMENT_SETTLED_DOCUMENT_REQUIRES_BALANCED_MATCH.

Example: false
prepaymentKind
​string · enum

What the held credit is, on PREPAYMENT rows only. ADVANCE is money toward future invoices; HELD_DEPOSIT is a security deposit held and owed back; REFUNDABLE is money that bought nothing — a double payment or an overpayment the counterparty wants returned. All three settle against an invoice the same way; the kind says what the balance is for.

Enum values:
ADVANCE
HELD_DEPOSIT
REFUNDABLE
bookedExchangeRate
​number | null

The rate that converted this entry to base currency when it was booked. Null when the entry is already in base currency.

Example: 7.45
dueDate
​string | null

When the document falls due (YYYY-MM-DD). Null on payments and on documents carrying no due date.

Example: 2026-09-13
daysOverdue
​number | null

Whole days past due as of the request’s cut-off; 0 means not yet due. Null on payments and prepayments, neither of which is a claim.

Example: 17
journalEntryId
​string | null

The journal entry behind this row, when one exists. Null on an imported entry with no backing entry.

Example: 0197A943-2325-7829-B835-B6C71A293066

PublicOpenEntriesCurrencyTotal

currency
​string · required

3-letter ISO currency code.

Example: EUR
remainingTotal
​number · required

Signed sum of the listed rows’ remaining amounts in this currency.

Example: 400

PublicOpenEntriesTotals

​PublicOpenEntriesCurrencyTotal[] · required

One total per currency the listed entries are denominated in.

baseCurrencyOutstanding
​number · required

The counterparty’s authoritative outstanding balance in the company’s base currency. It includes the opening balance, which the rows deliberately do not carry — so summing baseRemainingAmount across the rows does NOT reproduce it. Read this figure; never derive one.

Example: 2980

PublicOpenEntriesResponse

baseCurrency
​string · required

The company’s base currency (3-letter ISO).

Example: DKK
asOf
​string · required

The date this response answers as of. Always present — it is the requested cut-off, or today when none was given, so it does not tell you which was asked for.

Example: 2026-09-30
​PublicOpenEntry[] · required

The counterparty’s open entries.

​PublicOpenEntriesTotals · required

PublicSettlementListItem

id
​string · required

ID of the settlement.

Example: 0197A943-2325-7829-B835-B6C71A293070
postingDate
​string · required

Accounting date the settlement posted on (YYYY-MM-DD).

Example: 2026-09-01
createdAt
​string · required

When the settlement was recorded.

Example: 2026-09-01T11:04:22.000Z
counterpartyType
​string · enum · required
Enum values:
CUSTOMER
SUPPLIER
counterpartyId
​string · required

The customer or supplier the entries belong to.

reversed
​boolean · required

Whether the settlement has been reversed. A reversed settlement contributes nothing — its entries are open again.

Example: false
baseAmountSettled
​number · required

Total value settled, in the company’s base currency.

Example: 2980
reversedAt
​string | null

When it was reversed. Null while it stands.

reversalReason
​string | null

Why it was reversed. Null while it stands.

residualJournalEntryId
​string | null

The journal entry carrying the difference, when the entries did not net to zero. Null when they balanced exactly.

PublicSettlementsResponse

baseCurrency
​string · required

The company’s base currency (3-letter ISO).

Example: DKK
​PublicSettlementListItem[] · required

PublicSettlementEntry

kind
​string · enum · required
Enum values:
ANCHOR
PAYMENT
PREPAYMENT
type
​string · enum · required
Enum values:
INVOICE
REMINDER
CREDIT_NOTE
PAYMENT
PREPAYMENT
id
​string · required

The entry that was settled — the same id the open-entries listing reports.

reference
​string · required

Invoice number, payment reference, or anchor number.

Example: INV-1043
date
​string · required

Posting date of the entry (YYYY-MM-DD).

Example: 2026-08-14
currency
​string · required

Currency of the entry (3-letter ISO).

Example: EUR
originalAmount
​number · required

The entry’s full signed amount in its own currency. A settlement may consume only part of it, so compare against appliedAmount.

Example: 1250
appliedAmount
​number · required

Signed amount this settlement applied, in the entry’s currency.

Example: -400
baseAmountApplied
​number · required

The same applied amount in the company’s base currency.

Example: -2980
journalEntryId
​string | null

The journal entry behind it, when one exists.

PublicSettlementDifferenceLeg

accountId
​string · required

The ledger account posted to.

accountNumber
​number · required

Account number as it appears in the chart of accounts.

Example: 6210
accountName
​string · required

Account name.

Example: Exchange rate differences
type
​string · enum · required

Which side the amount posted on.

Enum values:
DEBIT
CREDIT
baseAmount
​number · required

Magnitude in base currency — always positive; the side is on type.

Example: 12.5

PublicSettlementDifference

journalEntryId
​string · required

The journal entry carrying the difference.

description
​string · required

What the posting says it is — this is where an exchange difference is distinguished from a write-off.

Example: Exchange rate difference on settlement
​PublicSettlementDifferenceLeg[] · required

PublicSettlement

id
​string · required

ID of the settlement.

Example: 0197A943-2325-7829-B835-B6C71A293070
postingDate
​string · required

Accounting date the settlement posted on (YYYY-MM-DD).

Example: 2026-09-01
createdAt
​string · required

When the settlement was recorded.

Example: 2026-09-01T11:04:22.000Z
counterpartyType
​string · enum · required
Enum values:
CUSTOMER
SUPPLIER
counterpartyId
​string · required

The customer or supplier the entries belong to.

reversed
​boolean · required

Whether the settlement has been reversed. A reversed settlement contributes nothing — its entries are open again.

Example: false
baseCurrency
​string · required

The company’s base currency (3-letter ISO).

Example: DKK
​PublicSettlementEntry[] · required

The entries this settlement linked, and how much of each it applied.

reversedAt
​string | null

When it was reversed. Null while it stands.

reversalReason
​string | null

Why it was reversed. Null while it stands.

difference
​object | null

The difference posting, when the entries did not net to zero. Null when they balanced exactly.

PublicSettlementEntrySelection

kind
​string · enum · required

The kind the open-entries listing reported for this entry. Echo it back unchanged.

Enum values:
ANCHOR
PAYMENT
PREPAYMENT
id
​string · required

The id the open-entries listing reported for this entry.

Example: 0197A943-2325-7829-B835-B6C71A293070
amountToApply
​number · min: 0 · required

How much of the entry to apply, in the entry’s own currency.

Always positive — send the absolute value. The open-entries listing reports a credit note or a payment with a NEGATIVE remainingAmount, and passing that figure back is refused. Which direction an entry moves the balance follows from what it is, so the sign is never yours to state: take Math.abs(remainingAmount), and at most that.

The response signs it for you — an entry consumed reads negative, one that consumes reads positive.

Example: 400
version
​string

The version the open-entries listing reported. Supplying it refuses the settlement if the entry was EDITED or REVERSED in between; omitting it settles against whatever the entry is now.

It does not move when another settlement applies to the same entry, so an unchanged version is not a promise that the entry still has as much open as it did. Applying more than remains is refused on its own, against the amount at the moment of the write rather than the one you read.

Example: 2026-08-14T09:12:44.000Z

PublicSettleRequest

postingDate
​string · required

Accounting date to post the settlement on (YYYY-MM-DD).

Example: 2026-09-01
​PublicSettlementEntrySelection[] · required

The entries to settle against each other — at least two, since a settlement links something owed to something that pays it. All must belong to the named counterparty.

customerId
​string

Read the customer’s entries. Mutually exclusive with supplierId; exactly one is required.

Example: 0197A943-2325-7829-B835-B6C71A293065
supplierId
​string

Read the supplier’s entries. Mutually exclusive with customerId; exactly one is required.

Example: 0197A943-2325-7829-B835-B6C71A293066
idempotencyKey
​string

Your own key for this settlement. Sending the same key with the same body returns the original settlement instead of posting a second one, so a retry after a timeout is safe.

Example: settle-2026-09-01-invoice-1043

PublicSettlementPreviewEntry

id
​string · required

The entry, as named in the request.

kind
​string · enum · required
Enum values:
ANCHOR
PAYMENT
PREPAYMENT
appliedAmount
​number · required

Signed amount that would be applied, in the entry’s own currency.

Example: -400
baseAmountApplied
​number · required

The same amount in the company’s base currency.

Example: -2980
exchangeRate
​number · required

Rate used to convert it.

Example: 7.45
rateSource
​string · enum · required
Enum values:
OVERRIDE
SPOT
BOOKED
statusAfter
​string | null · enum

What this entry’s status becomes. Null for a payment, which carries no status of its own.

Enum values:
PAID
PARTIALLY_PAID
OPEN
fullyConsumedAfter
​boolean | null

Whether a payment is used up entirely. Null for anything that carries a status instead.

PublicSettlementDifferencePreview

kind
​string · enum · required
Enum values:
BALANCED
FX
WRITEOFF
baseAmount
​number · required

The difference in the company’s base currency, signed: it is the net of baseAmountApplied across the entries — what the applied amounts leave uncancelled. Zero when the entries balance.

Example: -12.5
label
​string · required

What the difference is, in words — for example "Realized FX gain".

Example: Realized FX gain
account
​object | null

The account the difference would post to. Null when there is nothing to post.

PublicSettlementPostingLine

accountId
​string · required

The ledger account posted to.

accountLabel
​string · required

Account number and name.

Example: 5600 Debtors
currency
​string · required

Currency of the line (3-letter ISO).

Example: EUR
originalAmount
​number · required

Signed amount in that currency.

Example: -400
exchangeRate
​number · required

Rate used to convert it.

Example: 7.45
baseAmount
​number · required

The same amount in the company’s base currency.

Example: -2980
kind
​string · enum · required
Enum values:
APPLIED
DIFFERENCE
VAT
RECEIVABLE_TRANSFER

PublicSettlementRateGapCurrency

currency
​string · required
minRate
​number · required

Lowest rate any selected entry in this currency was booked at.

Example: 7.41
maxRate
​number · required

Highest rate any selected entry in this currency was booked at.

Example: 7.49
spread
​number · required

How far apart the two are, as a fraction of the higher one.

Example: 0.0107

PublicSettlementPreview

baseCurrency
​string · required

The company’s base currency (3-letter ISO).

Example: DKK
postingDate
​string · required

Accounting date the settlement would post on.

Example: 2026-09-01
​PublicSettlementPreviewEntry[] · required

What each named entry would have applied to it, and what it becomes.

​PublicSettlementDifferencePreview · required
​PublicSettlementPostingLine[] · required

The lines that would post. Empty when the entries balance and nothing needs a posting.

blockers
​string[] · required

Error codes that would refuse the settlement. A non-empty list means the commit fails with the first of them.

Example: []
warnings
​string[] · required

Codes for things worth checking. The settlement would still post.

Example: ["SETTLEMENT_FX_RATE_GAP_UNUSUALLY_LARGE"]
​array | null

Which currencies’ entries disagree about the rate, widest first. Present only alongside the rate-gap warning, and null otherwise — it names the rates to check the booked ones against.

PublicSettlementCreated

id
​string · required

The settlement. Read it back at GET /v1/settlements/{id}.

Example: 0197A943-2325-7829-B835-B6C71A293070
differenceJournalEntryId
​string | null

The journal entry carrying the difference, when the entries did not net to zero. Null when they balanced exactly.

vatReclassJournalEntryId
​string | null

The journal entry that moved a prepayment’s VAT onto the invoice it was applied to. Null unless the settlement did that.

PublicReverseSettlementReopenedEntry

kind
​string · enum · required
Enum values:
ANCHOR
PAYMENT
PREPAYMENT
type
​string · enum · required
Enum values:
INVOICE
REMINDER
CREDIT_NOTE
PAYMENT
PREPAYMENT
id
​string · required

The entry’s id, as the open-entries listing reports it.

reference
​string · required

Invoice number, payment reference or entry number.

currency
​string · required

ISO 4217 currency of the entry.

Example: DKK
appliedAmount
​number · required

Signed amount the settlement applied to this entry, in its own currency. Undoing the settlement puts it back on the entry.

Example: -400

PublicReverseSettlementPreview

settlementId
​string · required

The settlement this preview is about.

alreadyReversed
​boolean · required

True when the settlement was already undone. Reversing it again changes nothing and answers with the earlier outcome.

reversalDate
​string · required

The date the mirror entries post on: today. Its accounting period has to be open.

Example: 2026-10-16
​PublicReverseSettlementReopenedEntry[] · required

The entries the settlement linked. Each is open again for what the settlement applied to it.

journalEntriesMirrored
​string[] · required

Journal entries the settlement posted (its difference, VAT reclass and receivable transfer) that the reversal mirrors with a linked reversal entry. Empty when the settlement posted nothing.

PublicReverseSettlementRequest

reason
​string · maxLength: 2000

Why the settlement is being undone. Stored on the settlement and shown in the activity feed of every entry it linked.

Example: The payment belonged to another customer

PublicReverseSettlementResponse

id
​string · required

The settlement that was undone.

differenceReversalJournalEntryId
​string | null

The reversal of the settlement’s difference entry, or null when it posted none.

vatReclassReversalJournalEntryId
​string | null

The reversal of the settlement’s VAT reclass entry, or null when it posted none.

receivableTransferReversalJournalEntryId
​string | null

The reversal of the settlement’s receivable transfer, or null when it posted none.

PublicCreditNoteLinkPreviewRequest

creditNoteId
​string · uuid · required

The credit note: the id the open-entries listing reports for a row of type CREDIT_NOTE. A customer and a supplier credit note are both accepted; the side is read off the note.

invoiceId
​string · uuid

The invoice to check the credit note against: the id the open-entries listing reports for a row of type INVOICE. Named, the preview is refused whenever linking the two would be (another counterparty or currency, a settled invoice, today’s accounting period closed, a rate gap not accepted), and nothing is changed. Omit it to list the candidates only.

requireApplied
​boolean

When true, refuse whatever unlinking the credit note would refuse: 409 CREDIT_NOTE_LINK_NOT_LINKED when it is applied to no invoice, a settlement holding it that also settled a payment, and today’s accounting period being closed.

confirmRateGap
​boolean

With invoiceId, accept a gap between the two booked exchange rates, as the link call does. Without it, a pair booked at rates far apart is refused here as the link would refuse it.

PublicCreditNoteAppliedInvoice

invoiceId
​string · uuid · required

The invoice the credit note is applied to.

invoiceNumber
​string | null · required

Its invoice number, or null when it carries none.

PublicCreditNoteLinkState

creditNoteId
​string · uuid · required
side
​string · enum · required
Enum values:
CUSTOMER
SUPPLIER
currency
​string · required

ISO 4217 currency of the credit note.

Example: DKK
​PublicCreditNoteAppliedInvoice[] · required

Every invoice the credit note is applied to, whether by a link or by a settlement pairing the two. Empty when it is applied to none.

unusedCreditAmount
​number · required

Credit not yet spoken for, as a positive magnitude in the note’s currency: what a further link to an invoice it is ALREADY on can absorb.

releasableCreditAmount
​number · required

The unused credit plus what releasing its current applications would hand back, as a positive magnitude: what an invoice it is NOT yet on can absorb, since linking it there releases the others first.

PublicCreditNoteLinkCandidate

invoiceId
​string · uuid · required
invoiceNumber
​string | null · required
date
​string · required

Invoice date (YYYY-MM-DD).

dueDate
​string | null · required

Due date (YYYY-MM-DD), or null.

currency
​string · required
originalAmount
​number · required

The invoice’s face amount, as a positive magnitude.

remainingAmount
​number · required

What is still owed on it, net of credits and payments, as a positive magnitude.

PublicCreditNoteLinkPreview

​PublicCreditNoteLinkState · required
​PublicCreditNoteLinkCandidate[] · required

Open invoices of the same counterparty in the same currency the note can be linked to, closest amount first.

invoiceIsCandidate
​boolean | null

Whether invoiceId is among the candidates. Null when no invoice was named. A named invoice the credit note cannot be linked to refuses the preview itself, with the reason the link call would give.

PublicCreditNoteLinkRequest

creditNoteId
​string · uuid · required

The credit note: the id the open-entries listing reports for a row of type CREDIT_NOTE.

invoiceId
​string · uuid · required

The invoice (or supplier bill) it credits: the id the open-entries listing reports for a row of type INVOICE. Same counterparty and currency as the credit note.

confirmRateGap
​boolean

Accept that the two documents were booked at exchange rates further apart than the confirmation threshold. Without it such a pair is refused with CREDIT_NOTE_LINK_RATE_GAP_CONFIRMATION_REQUIRED, whose details carry both rates.

PublicCreditNoteUnlinkRequest

creditNoteId
​string · uuid · required

The credit note to detach from every invoice it is applied to.

PublicBankReconciliationRequest

bankTransactionIds
​string[] · required

The bank lines to reconcile, all unreconciled. Several lines may face one target (a payment that arrived in parts), or one line several targets — not several of each.

journalEntryIds
​string[]

Booked journal entries the lines settle: a payment entry already posted to the bank account, or the invoice entry a payment is to be created for. Each must be live (not reversed) and unreconciled.

openEntryIds
​string[]

Open invoices, credit notes or payments the lines settle, by the id the open-entries listing reports. An invoice or credit note is matched through its newest booked, unreconciled entry, the one the reconciliation screen would pick; a payment row is its own entry.

draftJournalEntryId
​string · uuid

A draft journal entry the lines settle, instead of booked or open entries: an editable, unreconciled, non-invoice draft that already carries the line on the bank’s account or is balanced onto it. It is matched alone, so it cannot be combined with journalEntryIds, openEntryIds or journalCategoryId (400 BANK_RECONCILE_DRAFT_TARGET_CONFLICT). An invoice draft is refused with BANK_INBOX_INVOICE_NOT_SUPPORTED: match its payment draft instead. bookPayments books the draft in the same call.

description
​string · maxLength: 500

A note stored on the reconciliation.

journalCategoryId
​string · uuid

Journal category for a payment the reconciliation creates. Omit it to let the category be chosen the way the reconciliation screen chooses it.

bookPayments
​boolean

Book the payments the reconciliation creates in the same call. Omitted or false, they are created as drafts to book separately.

PublicBankReconciliationPreviewBankLine

id
​string · required
bankAccountId
​string · required

The bank account the line belongs to.

signedAmount
​number · required

Signed: negative is money out.

currency
​string · required
date
​string · required

YYYY-MM-DD.

autoIncluded
​boolean · required

True for the other side of an own-account transfer, which the reconciliation covers too.

PublicBankReconciliationPreviewLine

accountNumber
​string · required
accountName
​string · required
type
​string · enum · required
Enum values:
debit
credit
ledgerCurrencyAmount
​number · required

Magnitude in the account’s own currency.

ledgerCurrency
​string · required

The account’s currency.

baseCurrencyAmount
​number · required

Magnitude in the company’s base currency.

PublicBankReconciliationPreviewPayment

journalType
​string · required

The payment entry’s journal type.

Example: CUSTOMER_PAYMENT
date
​string · required

Posting date (YYYY-MM-DD).

currency
​string · required

Currency of the entry.

isOverpayment
​boolean · required

The line pays more than the invoice is owed.

​PublicBankReconciliationPreviewLine[] · required
invoiceJournalEntryId
​string | null

The invoice entry this payment settles.

invoiceReference
​string | null
appliedInvoiceAmount
​number | null

Amount applied to the invoice, in the invoice’s currency.

invoiceStatusAfter
​string | null · enum

The invoice’s status once the payment is booked.

Enum values:
OPEN
PARTIALLY_PAID
PAID

PublicBankReconciliationPreviewWarning

code
​string · required
severity
​string · enum · required
Enum values:
info
warning
​object · required

PublicBankReconciliationPreview

journalEntryIds
​string[] · required

The journal entries the lines would be reconciled against, with open entries resolved.

​PublicBankReconciliationPreviewBankLine[] · required
​PublicBankReconciliationPreviewPayment[] · required

The payment entries the reconciliation would create, line by line. Empty when every target is already a payment.

offsetJournalEntryIds
​string[] · required

Invoice entries that cancel each other inside the selection and settle without a bank payment.

​PublicBankReconciliationPreviewWarning[] · required

PublicBankReconciliationCreatedPayment

journalEntryId
​string · required

The payment entry: a booked entry when bookPayments was true, a draft to book otherwise.

paymentType
​string · required
amount
​number · required

Amount in the bank line’s currency.

currency
​string · required
invoiceJournalEntryId
​string · required

The invoice entry it pays.

invoiceStatus
​string · enum · required
Enum values:
OPEN
PARTIALLY_PAID
PAID

PublicBankReconciliation

id
​string · required

The reconciliation. Undo it with POST /v1/bank-reconciliations/{id}/unreconcile.

bankTransactionIds
​string[] · required
journalEntryIds
​string[] · required
​PublicBankReconciliationCreatedPayment[] · required
offsetJournalEntryIds
​string[] · required
​PublicBankReconciliationPreviewWarning[] · required

PublicBankReconciliationBatchItem

bankTransactionIds
​string[] · required

The bank lines this match reconciles, as on the single reconcile call.

journalEntryIds
​string[]

Booked journal entries the lines settle.

openEntryIds
​string[]

Open entries the lines settle, by the open-entries id.

draftJournalEntryId
​string · uuid

A non-invoice draft the lines settle, matched alone, as on the single reconcile call.

description
​string · maxLength: 500

A note stored on this reconciliation.

PublicBankReconciliationBatchRequest

​PublicBankReconciliationBatchItem[] · required

The matches, at most 50. Each is reconciled on its own, in order; a later match naming a bank line an earlier one names is refused with BANK_RECONCILE_BATCH_LINE_REPEATED, and one naming a draft an earlier one names with BANK_RECONCILE_BATCH_DRAFT_REPEATED.

bookPayments
​boolean

Book the payments every match creates, and a matched draft, in the same call. Omitted or false, they stay drafts.

journalCategoryId
​string · uuid

Journal category for the payments the matches create. Not applied to a match that names a draft, which keeps its own.

PublicBankReconciliationBatchResultRow

index
​number · required

The position of the match in items, from 0.

success
​boolean · required

The match was reconciled (or, in the preview, would be).

reconciliationId
​string | null

The reconciliation the match created; undo it with POST /v1/bank-reconciliations/{id}/unreconcile. Null on a refused row and in the preview.

errorCode
​string | null

Why the match was refused: the code the single reconcile call answers with. Null on success.

​object

The refusal’s details, as the single reconcile call reports them.

PublicBankReconciliationBatchPreview

reconcilableCount
​number · required

Matches the batch would reconcile.

failedCount
​number · required

Matches the batch would refuse.

​PublicBankReconciliationBatchResultRow[] · required

One row per match, in order.

PublicBankReconciliationBatch

reconciledCount
​number · required
failedCount
​number · required
​PublicBankReconciliationBatchResultRow[] · required

One row per match, in order.

PublicUnreconcilePreviewRequest

reversalDate
​string · enum

When the reversal of each booked payment posts: on the payment’s own date (ORIGINAL, the default) or today (TODAY).

Enum values:
today
original
reason
​string · maxLength: 500

Ignored here; accepted so the undo body can be previewed as it is.

confirmPaymentReversal
​boolean

Send false to be answered 400 BANK_UNRECONCILE_REQUIRES_CONFIRMATION if the undo would reverse booked payments, as the undo itself would without confirmation. Omitted, the preview reports them in paymentsToReverse instead.

alsoReverseJournalEntryIds
​string[]

Answered 400 BANK_UNRECONCILE_ENTRY_NOT_REVERSIBLE when one of them is not an entry the undo would leave posted (entriesStillPostedAfterUndo), as the undo itself would refuse it.

PublicUnreconcileStillPostedEntry

journalEntryId
​string · required
journalType
​string · required
date
​string · required

YYYY-MM-DD.

entryNumber
​string | null

PublicUnreconcilePreview

reconciliationId
​string · required
bankTransactionCount
​number · required

Bank lines released, across the whole cluster when it was settled as one.

journalEntryCount
​number · required
draftsToDelete
​string[] · required

Payment drafts the reconciliation created, deleted by the undo.

paymentsToReverse
​string[] · required

Booked payments the reconciliation created, reversed by the undo once confirmed.

requiresConfirmation
​boolean · required

The undo needs confirmPaymentReversal: true.

​PublicUnreconcileStillPostedEntry[] · required

Posted entries the undo only unlinks; they stay posted unless named in alsoReverseJournalEntryIds.

PublicUnreconcileRequest

reason
​string · maxLength: 500 · required

Why the reconciliation is undone. Stored for the audit trail.

confirmPaymentReversal
​boolean

Confirms that the payments the reconciliation booked are reversed. Required when it booked any; the preview’s paymentsToReverse lists them.

reversalDate
​string · enum
Enum values:
today
original
alsoReverseJournalEntryIds
​string[]

Entries the undo would otherwise leave posted (the preview’s entriesStillPostedAfterUndo) to reverse as well. Any other id refuses the undo.

PublicUnreconcileResponse

reconciliationId
​string · required
deletedDraftCount
​number · required
reversedPaymentCount
​number · required
alsoReversedEntryCount
​number · required

PublicBankTransactionCounterparty

name
​string | null · required

The name the bank sent with the line. Not a link to a customer or supplier.

iban
​string | null · required
bic
​string | null · required
accountNumber
​string | null · required

The account number, when the bank sent one instead of an IBAN.

PublicBankTransactionFik

typeCode
​string | null · required

The payment slip type, such as 71 or 75.

creditorId
​string | null · required

The creditor number on the payment slip.

documentId
​string | null · required

The payment code on the slip, which names the invoice paid.

PublicBankTransactionReconciliation

reconciliationId
​string · required

The reconciliation. Undo it with POST /v1/bank-reconciliations/{reconciliationId}/unreconcile.

journalEntryIds
​string[] · required

The booked journal entries the line is reconciled to.

draftJournalEntryIds
​string[] · required

Draft journal entries the reconciliation links that are not booked yet.

openEntryId
​string | null · required

The invoice or bill the line settled directly, as the id the open-entries listing reports. Null when it names none.

PublicBankTransaction

id
​string · required
bankAccountId
​string · required

The bank account the line is on.

bookingDate
​string · required

The date the bank booked the line (YYYY-MM-DD).

Example: 2026-01-15
valueDate
​string · required

The date the money moved, as the bank reports it (YYYY-MM-DD).

Example: 2026-01-15
bankAccountAmount
​number · required

The amount in the bank account's currency (bankAccountCurrency). Negative for money out, positive for money in.

Example: -1250
bankAccountCurrency
​string · required

The bank account's currency, which bankAccountAmount is in.

Example: DKK
originalAmount
​number | null · required

The amount in the currency the payment was made in, when the bank reports one, such as a card purchase abroad. In originalCurrency, with the sign of bankAccountAmount; on a line whose bankAccountAmount is 0 it is the figure as the bank sent it, which may carry either sign. Null when the bank reports none.

Example: -167.5
originalCurrency
​string | null · required
originalExchangeRate
​number | null · required

The rate the bank converted at, as it reports it. Null when it reports none.

direction
​string | null · enum · required

Which way the money went. Null on a zero-amount line.

Enum values:
INCOMING
OUTGOING
description
​string · required

The line text.

bankText
​string | null · required

The bank's own text for the line, when it sends one apart from description.

reference
​string | null · required
paymentMessage
​string | null · required

The message the payer sent with the payment.

​PublicBankTransactionCounterparty · required
fik
​object | null · required

The payment slip (FIK) the line was paid with. Null when the line carries none.

status
​string · enum · required
Enum values:
open
reconciled
dismissed
reconciliation
​object | null · required

What the line is reconciled to. Null unless status is reconciled.

dismissedAt
​string | null · required

When the line was taken off reconciliation (ISO 8601). Null unless status is dismissed, and null on a dismissed line whose dismissal time was not recorded.

createdAt
​string · required

When the line was recorded in LedgerBee (ISO 8601).

PublicListBankTransactionsResponse

​PublicBankTransaction[] · required
total
​number · required

Lines matching the query, across all pages.

Example: 42
limit
​number · required

Items per page

Example: 25
nextCursor
​string | null · required

Cursor 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.

Example: eyJ2IjoxLCJmIjoiOWMxZjQyYWIzMTA4ZDc2ZSIsImsiOlsiMjAyNi0wMS0yMCJdfQ
hasMore
​boolean · required

Whether more rows follow this page.

Example: true
page
​number · deprecated

Deprecated: page with nextCursor instead. Current page (1-indexed).

Example: 1
totalPages
​number · deprecated

Deprecated: page with nextCursor instead. Total pages.

Example: 2

PublicBankTransactionSelectionRequest

bankTransactionIds
​string[] · required

The bank lines to dismiss from reconciliation, or to restore to it, at most 50.

PublicBankTransactionDismissPreviewRow

bankTransactionId
​string · required
eligible
​boolean · required

The line would be changed.

errorCode
​string | null

Why the line would not be changed: BANK_DISMISS_TRANSACTION_NOT_FOUND, BANK_DISMISS_TRANSACTION_RECONCILED (unreconcile it first), BANK_DISMISS_TRANSACTION_ALREADY_DISMISSED, or BANK_UNDISMISS_TRANSACTION_NOT_DISMISSED. Null when eligible.

PublicBankTransactionDismissPreview

eligibleCount
​number · required

Lines the call would change.

ineligibleCount
​number · required

Lines the call would leave as they are.

​PublicBankTransactionDismissPreviewRow[] · required

One row per line, in request order.

PublicBankTransactionDismissRow

bankTransactionId
​string · required
changed
​boolean · required

The line was changed.

errorCode
​string | null

Why the line was left as it was; the same codes the preview reports. Null when changed.

PublicBankTransactionDismissResponse

changedCount
​number · required
unchangedCount
​number · required
​PublicBankTransactionDismissRow[] · required

One row per line, in request order.

CreateProductPriceRequest

productId
​string · required

The product this price belongs to

Example: 550e8400-e29b-41d4-a716-446655440000
billingPeriodType
​string · enum · required

Billing period type. RECURRING and USAGE both require a Subscription license.

Enum values:
recurring
usage
one_time
surcharge
pricingModel
​string · enum · required

Pricing model

Enum values:
flat_rate
package
volume
graduated
nickname
​string

Optional nickname (e.g. "Monthly")

Example: Monthly
status
​string · enum

Initial status. Defaults to active, so the price is usable immediately. Pass draft to stage it and publish it later via the activate endpoint.

Enum values:
active
draft
Default: active
unitAmount
​string

Unit amount. Required for FLAT_RATE pricing; for tiered models (PACKAGE/VOLUME/GRADUATED) the amounts live in tiers.

Example: 99.99
billingInterval
​string · enum

Billing interval (required unless one-time)

Enum values:
day
week
month
year
billingIntervalCount
​number

Billing interval count

Example: 1
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217). Defaults to the company default.

Example: DKK
meterId
​string

Meter ID (required for USAGE pricing)

​CreateProductPriceTierRequest[]

Pricing tiers. Required for tiered models: PACKAGE (exactly 1), VOLUME / GRADUATED (one or more, last tier open-ended). Omit for FLAT_RATE.

UpdateProductPriceRequest

nickname
​string

Optional nickname

Example: Monthly
unitAmount
​string

Unit amount for flat-rate pricing. A FLAT_RATE price other than a surcharge must end up with an amount: an update that leaves it without one, or that turns a price FLAT_RATE without sending one, is refused with PRODUCT_SELLING_PRICE_REQUIRED_FOR_FLAT_RATE. A surcharge carries a percentage and no amount. A VOLUME or GRADUATED price left with no tiers is refused with PRODUCT_PRICING_TIERS_REQUIRED. Disabling or archiving is not refused for a missing amount or missing tiers.

Example: 99.99
billingPeriodType
​string · enum

Billing period type

Enum values:
recurring
usage
one_time
surcharge
pricingModel
​string · enum

Pricing model

Enum values:
flat_rate
package
volume
graduated
billingInterval
​string | null · enum

Billing interval (null for one-time)

Enum values:
day
week
month
year
billingIntervalCount
​number

Billing interval count

Example: 1
currency
​string · minLength: 3 · maxLength: 3

Currency code (ISO 4217)

Example: DKK
status
​string · enum

Price status

Enum values:
draft
active
inactive
archived
meterId
​string

Meter ID for usage-based pricing

​CreateProductPriceTierRequest[]

Pricing tiers

DocumentTemplateListItem

id
​string · required

The unique identifier of the template

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Template name

Example: Premium Invoice
documentType
​string · enum · required

Document type this template applies to

Enum values:
invoice-template
credit-note-template
quote-template
order-confirmation-template
isDefault
​boolean · required

Whether this is the default template for its document type

Example: false
createdAt
​string · date-time · required

When the template was created

Example: 2024-01-15T10:30:00Z
updatedAt
​string · date-time · required

When the template was last updated

Example: 2024-01-15T10:30:00Z

ListDocumentTemplatesResponse

​DocumentTemplateListItem[] · required

Page of document templates

total
​number · required

Total number of matching templates

Example: 7
page
​number · required

Current page number

Example: 1
limit
​number · required

Items per page

Example: 25
totalPages
​number · required

Total number of pages

Example: 1

BudgetSummary

id
​string · uuid · required

The unique identifier of the budget

name
​string · required

Budget name

Example: Budget 2026
status
​string · enum · required

Budget status. Informational — the status does not restrict reads.

Enum values:
DRAFT
ACTIVE
ARCHIVED
accountingYearId
​string · uuid · required

Accounting year the budget covers

accountingYearStartDate
​string · required

Accounting year start date (ISO date, YYYY-MM-DD)

Example: 2026-01-01
accountingYearEndDate
​string · required

Accounting year end date (ISO date, YYYY-MM-DD)

Example: 2026-12-31
currency
​string · required

ISO 4217 currency every amount on this budget is denominated in — the company's base (functional) currency.

Example: DKK
createdAt
​string · required

When the budget was created (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
updatedAt
​string · required

When the budget was last updated (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
dimensionCategoryId
​string | null · uuid

Dimension category scoping this budget: lines then carry per-dimension-value buckets. null for flat budgets.

ListBudgetsResponse

​BudgetSummary[] · required

Page of budgets

total
​number · required

Total number of matching budgets

Example: 3
page
​number · required

Current page number

Example: 1
limit
​number · required

Items per page

Example: 25
totalPages
​number · required

Total number of pages

Example: 1

BudgetRunwayResponse

currency
​string · required

ISO 4217 currency every amount is denominated in — the company's base (functional) currency.

Example: DKK
cashOnHand
​string · required

Sum of bank-account-linked ledger balances as of asOf (decimal string)

Example: 2051260.11
trailing3MonthBurn
​string · required

Trailing average net outflow over the last 3 closed months (decimal string). Negative when the company is cash-positive.

Example: 296121.14
monthsRemaining
​number | null · required

Cash divided by burn; null = infinite runway (burn ≤ 0)

Example: 6.9
status
​string · enum · required

OK (≥ 6 months), WATCH (3-6), LOW (< 3), or UNKNOWN (no cash source, or no closed periods to compute burn from — see hasCashSource).

Enum values:
OK
WATCH
LOW
UNKNOWN
hasCashSource
​boolean · required

Whether at least one bank account is linked to a ledger account. When false, cashOnHand is a meaningless 0.

asOf
​string · required

ISO date the cash and burn were computed as of

Example: 2026-08-25
feedReportedCashTotal
​string | null · required

Sum of provider-reported balances over active bank accounts in the functional currency (decimal string). null when any active account is held in another currency.

Example: 2051260.11
unlinkedBankAccountCount
​number · required

Active bank accounts with no linked ledger account — invisible to cashOnHand.

Example: 0

BudgetLine

id
​string · uuid · required

The unique identifier of the budget line

ledgerId
​string · uuid · required

Ledger account this line budgets

ledgerName
​string · required

Ledger account name

Example: Salg af varer/ydelser m/moms
accountNumber
​number · required

Ledger account number

Example: 1010
accountingPeriodId
​string · uuid · required

Accounting period this cell belongs to (see periods)

amount
​string · required

Budgeted amount in the budget's currency (decimal string). For CLOSED periods this is the book actual (the cell then carries source: ACTUALS), matching the rolling-forecast grid the app shows.

Example: 160000.00
dimensionValueId
​string | null · uuid

Dimension value bucket. null = the Unallocated bucket; absent for flat budgets.

formula
​string | null

Formula text (e.g. =baseline*1.05), or null for a plain literal cell.

inputMethod
​string · enum

How the cell was entered. Absent on legacy rows (treat as MANUAL).

Enum values:
MANUAL
FORMULA
SUBSCRIPTION_LINK
source
​string | null · enum

Provenance of the value: ACTUALS = closed-period book actual; SUBSCRIPTION = filled from the subscription forecast. null/absent = user-entered.

Enum values:
ACTUALS
SUBSCRIPTION
error
​string | null

Per-cell formula evaluation error code, when the cell could not resolve. null/absent = resolved.

baseline
​string | null

Prior accounting year's realised amount for the same account and calendar month (decimal string). null unless requested with ?includeBaseline=true.

Example: 150000.00

BudgetPeriod

id
​string · uuid · required

Accounting period id

label
​string · required

Period label

Example: Jan 2026
startDate
​string · required

Period start date (ISO date, YYYY-MM-DD)

Example: 2026-01-01
endDate
​string · required

Period end date (ISO date, YYYY-MM-DD)

Example: 2026-01-31
periodIndex
​number · required

Period index within the accounting year (1-12)

Example: 1
status
​string · enum · required

OPEN or CLOSED. Lines in CLOSED periods show the book actuals (rolling forecast), not the planned amount.

Enum values:
OPEN
CLOSED

BudgetDriverCell

id
​string · uuid · required

The unique identifier of the driver cell

accountingPeriodId
​string · uuid · required

Accounting period this cell belongs to (see periods)

value
​number · required

Resolved value. Drivers are quantities (headcount, ARPU, …), not money, so this is a number.

Example: 12
formula
​string | null

Formula text, or null for a plain literal cell.

error
​string | null

Per-cell formula evaluation error code, when the cell could not resolve. null/absent = resolved.

BudgetScenarioOnlyDriverMonth

scenarioOverrideId
​string · uuid · required

The scenario change that gives this month its value

accountingPeriodId
​string · uuid · required

Accounting period (see periods)

value
​number · required

The scenario's value for this month

Example: 2

BudgetDriverRow

id
​string · uuid · required

The unique identifier of the driver row

name
​string · required

Display name

Example: Headcount
handle
​string · required

Stable token used to reference this row in formulas

Example: headcount
displayOrder
​number · required

Display order among the driver rows

Example: 1
​BudgetDriverCell[] · required

Per-period cells

unit
​string | null

Unit label (e.g. "FTE", "%").

​BudgetScenarioOnlyDriverMonth[]

Present on a scenario grid only: the months this scenario gives a value where the budget has no driver cell. Each is a scenario change, not a driver cell, so it is not in cells.

BudgetRowOverride

ledgerId
​string · uuid · required

Ledger account the override applies to

isHidden
​boolean · required

Whether the row is hidden from the editor (still counted in totals).

label
​string | null

Budget-local display name overriding the account name. null = default name.

BudgetRowNumber

lineNumber
​number · required

Stable reference number used by #N formula references

Example: 2
ledgerId
​string | null · uuid

Ledger account this number belongs to. Exactly one of ledgerId / driverRowId is set.

driverRowId
​string | null · uuid

Driver row this number belongs to. Exactly one of ledgerId / driverRowId is set.

BudgetDetail

id
​string · uuid · required

The unique identifier of the budget

name
​string · required

Budget name

Example: Budget 2026
status
​string · enum · required

Budget status. Informational — the status does not restrict reads.

Enum values:
DRAFT
ACTIVE
ARCHIVED
accountingYearId
​string · uuid · required

Accounting year the budget covers

accountingYearStartDate
​string · required

Accounting year start date (ISO date, YYYY-MM-DD)

Example: 2026-01-01
accountingYearEndDate
​string · required

Accounting year end date (ISO date, YYYY-MM-DD)

Example: 2026-12-31
currency
​string · required

ISO 4217 currency every amount on this budget is denominated in — the company's base (functional) currency.

Example: DKK
createdAt
​string · required

When the budget was created (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
updatedAt
​string · required

When the budget was last updated (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
​BudgetLine[] · required

Budget cells (one per account × period, and per dimension bucket when dimensioned)

​BudgetPeriod[] · required

The accounting year's periods, ordered by periodIndex

​BudgetDriverRow[] · required

Driver rows with resolved cells (non-money quantities)

​BudgetRowOverride[] · required

Budget-local display overrides. Only accounts carrying an override are listed.

​BudgetRowNumber[] · required

Stable #N row numbers used by formula references. Rows never numbered in the editor may be absent.

dimensionCategoryId
​string | null · uuid

Dimension category scoping this budget: lines then carry per-dimension-value buckets. null for flat budgets.

BudgetExcelChange

ledgerId
​string · uuid · required

The account (ledger) id

accountNumber
​number · required

The account number

Example: 2210
accountName
​string · required

The account name

Example: Rent
dimensionValueId
​string | null · uuid · required

The dimension value the figure is on. null for a budget without a dimension, or the dimension's unallocated row.

dimensionValueName
​string | null · required
accountingPeriodId
​string · uuid · required

The accounting period

periodStartDate
​string · required

First day of the accounting period, YYYY-MM-DD

Example: 2026-01-01
periodLabel
​string · required

The period's column header in the workbook

Example: Jan 2026
periodClosed
​boolean · required

The accounting period is closed. Budget figures stay editable there.

previousAmount
​string · required

The figure before, in the budget's currency (currency), decimal string

Example: 1000.00
newAmount
​string · required

The figure after, in the budget's currency (currency), decimal string

Example: 1250.00
origin
​string · enum · required

FILE: typed into the workbook. RECALCULATED: a formula figure that moves because a figure it reads changed.

Enum values:
FILE
RECALCULATED
previousFormula
​string | null · required

The formula the cell carries now. A FILE change replaces it with the typed figure; a RECALCULATED change keeps it.

previousSource
​string | null · enum · required

The live source the cell follows now. A FILE change detaches it.

Enum values:
ACTUALS
SUBSCRIPTION
changedSinceExport
​boolean · required

FILE only: the figure changed after the workbook was exported, and the workbook overwrites that change.

rowNumber
​number | null · required

FILE only: the workbook row, as Excel numbers it.

BudgetExcelRefusedRow

rowNumber
​number · required

The workbook row, as Excel numbers it

column
​string | null · required

The column header the problem is in, when it is one cell

code
​string · required

Why the row is refused: BUDGET_EXCEL_UNKNOWN_ACCOUNT, BUDGET_EXCEL_ACCOUNT_NOT_BUDGETABLE, BUDGET_EXCEL_UNKNOWN_DIMENSION_VALUE, BUDGET_EXCEL_DUPLICATE_ROW or BUDGET_EXCEL_INVALID_AMOUNT.

​object · required

BudgetExcelPublication

id
​string · uuid · required

The upload, as the budget's upload history lists it

fileName
​string · required

The name the uploaded file carried

publishedAt
​string · required

When it was published (ISO 8601)

Example: 2026-10-16T09:30:00.000Z
publishedVia
​string · enum · required

How the workbook reached the budget

Enum values:
APP
API_KEY
OAUTH_CLIENT
MCP
fileChangeCount
​number · required

Figures typed into the workbook that went live

recalculatedChangeCount
​number · required

Formula figures that recalculated as a result

byteSize
​number · required

The workbook size in bytes

BudgetExcelUploadResponse

dryRun
​boolean · required

The workbook was only checked; nothing was written.

budgetId
​string · uuid · required
budgetName
​string · required
accountingYearStartDate
​string · required

First day of the budget's accounting year, YYYY-MM-DD

accountingYearEndDate
​string · required

Last day of the budget's accounting year, YYYY-MM-DD

currency
​string · required

ISO 4217 currency every amount is in — the company's base currency, which the workbook states too.

Example: DKK
fileName
​string · required

The name the uploaded file carried

exportedAt
​string | null · required

When the workbook was exported (ISO 8601)

rowsRead
​number · required

Account rows read from the workbook

​BudgetExcelChange[] · required

Every figure that changes, or changed: the figures typed into the workbook and the formula figures that recalculate because of them. A dry run and the publish of the same file answer the same changes.

​BudgetExcelRefusedRow[] · required

Rows the workbook is refused for. Any refused row blocks publishing.

ignoredColumns
​string[] · required

Column headers that match no accounting period of the budget. Their cells change nothing.

ignoredRowNumbers
​number[] · required

Rows that carry figures but no account number. They change nothing.

canPublish
​boolean · required

No row is refused and at least one figure changes, so publishing succeeds.

previewToken
​string · required

Identifies this file against the budget as it stood when read. Pass it to the publish of the same file to have the publish refused if the budget changes in between.

publication
​object | null · required

The published upload, kept in the budget's upload history with its file. null on a dry run.

BudgetScenario

id
​string · uuid · required

The unique identifier of the scenario

name
​string · required

Scenario name

Example: Aggressive hiring
isBaseline
​boolean · required

True for the "Base" overlay — the budget grid with no scenario assumptions applied. The Base scenario is created when the tenant first uses scenarios in the app, so a budget may not have one yet.

createdAt
​string · required

When the scenario was created (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
updatedAt
​string · required

When the scenario was last updated (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
description
​string | null

Scenario description

ListBudgetScenariosResponse

​BudgetScenario[] · required

The budget's scenarios

BudgetScenarioGridResponse

currency
​string · required

ISO 4217 currency every amount is denominated in — the company's base (functional) currency.

Example: DKK
​BudgetLine[] · required

All resolved budget cells under the scenario overlay

​BudgetDriverRow[] · required

All driver rows with resolved cells under the overlay

hasCycle
​boolean · required

True when the overlay could not resolve because of a formula cycle — offending cells carry error: BUDGET_FORMULA_CYCLE and amounts must not be trusted.

forecastHorizonMonth
​string | null

Last calendar month (YYYY-MM) with a subscription-forecast projection. Cells past it that reference the subscription forecast resolve to 0. null when no subscription token is used.

Example: 2026-12

BudgetComparisonSummary

totalBudget
​string · required

Total budgeted amount (decimal string)

Example: 3251000.00
totalActual
​string · required

Total actual amount (decimal string)

Example: 3100000.00
totalVariance
​string · required

Total variance, budget − actual (decimal string)

Example: 151000.00
totalVariancePercent
​number | null · required

Total variance as a percentage of budget; null when the budget is 0

isOverBudget
​boolean · required

True when total actual exceeds total budget

BudgetComparisonEntry

ledgerId
​string · uuid · required

Ledger account

ledgerName
​string · required

Ledger account name

Example: Salg af varer/ydelser m/moms
accountNumber
​number · required

Ledger account number

Example: 1010
periodId
​string · uuid · required

Accounting period (see periods)

budgetAmount
​string · required

Budgeted amount (decimal string)

Example: 160000.00
actualAmount
​string · required

Actual amount from the ledger (decimal string)

Example: 154321.12
variance
​string · required

Variance, budget − actual (decimal string)

Example: 5678.88
variancePercent
​number | null · required

Variance as a percentage of budget; null when the budget is 0

isOverBudget
​boolean · required

True when the variance is unfavourable: actual above budget on expense accounts, actual below budget on revenue accounts.

isRevenueAccount
​boolean · required

True for revenue (credit-normal) accounts; false for expense (debit-normal) accounts

dimensionValueId
​string | null · uuid

Dimension value bucket. null = the Unallocated bucket; absent for flat budgets.

BudgetComparisonResponse

budgetName
​string · required

Budget name

Example: Budget 2026
currency
​string · required

ISO 4217 currency every amount is denominated in — the company's base (functional) currency.

Example: DKK
​object · required

Summary totals for the comparison

​BudgetComparisonEntry[] · required

Comparison entries by account and period

​BudgetPeriod[] · required

The periods covered by the comparison

BudgetVarianceRow

ledgerId
​string · uuid · required

Ledger account

accountName
​string · required

Ledger account name

Example: Salg af varer/ydelser m/moms
accountType
​string · enum · required

Normal side of the account: DEBIT (expense-like) or CREDIT (revenue-like)

Enum values:
DEBIT
CREDIT
periodId
​string · uuid · required

Accounting period

frozenBaseline
​string · required

Amount in the frozen baseline (decimal string)

Example: 160000.00
actual
​string · required

Actual amount from the ledger (decimal string)

Example: 170000.00
variance
​string · required

Variance, actual − frozen baseline (decimal string)

Example: 10000.00
variancePercent
​number | null · required

Variance as a percentage of the absolute baseline; null when the baseline is 0

sentiment
​string · enum · required

Unfavourable when spending exceeds the frozen plan (expense accounts) or revenue misses it (revenue accounts).

Enum values:
favourable
unfavourable

BudgetVarianceResponse

currency
​string · required

ISO 4217 currency every amount is denominated in — the company's base (functional) currency.

Example: DKK
​BudgetVarianceRow[] · required

Closed-period variance rows vs the frozen baseline. Empty when the budget has no frozen baseline yet.

BudgetFrozenBaselineSummary

id
​string · uuid · required

The unique identifier of the frozen baseline

label
​string · required

Label given when the baseline was frozen

Example: Board-approved plan
frozenAt
​string · required

When the baseline was frozen (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
cellCount
​number · required

Number of snapshot cells

Example: 288
scenarioId
​string | null · uuid

Scenario whose overlay was snapshotted. null = the base grid.

frozenBy
​string | null

Identity that froze the baseline

ListBudgetFrozenBaselinesResponse

​BudgetFrozenBaselineSummary[] · required

The budget's frozen baselines, most recent first

BudgetFrozenBaselineCell

id
​string · uuid · required

The unique identifier of the snapshot cell

ledgerId
​string · uuid · required

Ledger account

accountingPeriodId
​string · uuid · required

Accounting period

amount
​string · required

Frozen resolved amount (decimal string)

Example: 160000.00
dimensionValueId
​string | null · uuid

Dimension value bucket. null = the Unallocated bucket; absent for flat budgets.

source
​string | null · enum

Provenance of the cell at freeze time

Enum values:
ACTUALS
SUBSCRIPTION

BudgetFrozenBaselineDetail

id
​string · uuid · required

The unique identifier of the frozen baseline

label
​string · required

Label given when the baseline was frozen

Example: Board-approved plan
frozenAt
​string · required

When the baseline was frozen (ISO 8601)

Example: 2026-01-15T10:30:00.000Z
currency
​string · required

ISO 4217 currency every amount is denominated in — the company's base (functional) currency.

Example: DKK
​BudgetFrozenBaselineCell[] · required

Snapshot cells

scenarioId
​string | null · uuid

Scenario whose overlay was snapshotted. null = the base grid.

frozenBy
​string | null

Identity that froze the baseline

BudgetRebaselineProposal

id
​string · uuid · required

The unique identifier of the proposal

accountingPeriodId
​string · uuid · required

The closed accounting period the proposal was raised for

status
​string · enum · required

PROPOSED (open), CONFIRMED (accepted — the budget was recomputed forward), or REJECTED.

Enum values:
PROPOSED
CONFIRMED
REJECTED
proposedAt
​string · required

When the proposal was raised (ISO 8601)

Example: 2026-02-01T02:00:00.000Z
confirmedAt
​string | null

When the proposal was confirmed. null while open or rejected.

ListBudgetRebaselineProposalsResponse

​BudgetRebaselineProposal[] · required

The budget's re-baseline proposals

MarkVatPeriodFiledRequest

startDate
​string · required

First day of the VAT period (YYYY-MM-DD).

Example: 2026-04-01
endDate
​string · required

Last day of the VAT period (YYYY-MM-DD).

Example: 2026-06-30
reportedDate
​string · required

The day the return was reported to SKAT outside LedgerBee (YYYY-MM-DD): on or after the period end, and not in the future.

Example: 2026-08-28

VatPeriodFiledResponse

startDate
​string · required

First day of the filed period.

Example: 2026-04-01
endDate
​string · required

Last day of the filed period.

Example: 2026-06-30
reportedDate
​string | null · required

The day the return was reported.

Example: 2026-08-28
source
​string · enum · required

MANUAL for a filing recorded here; APP for one sent to SKAT through LedgerBee.

Enum values:
APP
MANUAL
hasSettleableBalances
​boolean · required

Whether settling the period would post anything. False for a period with no VAT postings.

VatPeriodFilingPreviewResponse

startDate
​string · required

First day of the period that would be recorded as filed.

Example: 2026-04-01
endDate
​string · required

Last day of the period.

Example: 2026-06-30
reportedDate
​string · required

The day the return would be recorded as reported.

Example: 2026-08-28

VatPeriodRequest

startDate
​string · required

First day of the VAT period (YYYY-MM-DD).

Example: 2026-04-01
endDate
​string · required

Last day of the VAT period (YYYY-MM-DD).

Example: 2026-06-30

SettleVatPeriodResponse

journalEntryId
​string · required

The posted settlement journal entry.

Example: 550e8400-e29b-41d4-a716-446655440000

VatSettlementPreviewLine

accountId
​string · required

Ledger account the line posts to.

accountNumber
​string | null · required

Its account number.

Example: 7680
accountName
​string | null · required

Its name.

Example: Udgående moms
type
​string · enum · required

Which side the line posts on.

Enum values:
debit
credit
amount
​number · required

Positive amount, in the company's base currency.

Example: 50000
role
​string · enum · required

vat_account zeroes one VAT account, settlement carries the net to the VAT settlement account, rounding the øre the rounded lines leave over.

Enum values:
vat_account
settlement
rounding

VatSettlementPreviewResponse

startDate
​string · required

First day of the period.

Example: 2026-04-01
endDate
​string · required

Last day of the period.

Example: 2026-06-30
postingDate
​string · required

The settlement posts on the last day of the period.

Example: 2026-06-30
description
​string · required

Description the settlement entry would carry.

Example: Momsafslutning Q2 2026
currency
​string · required

The company's base currency; every amount is in it.

Example: DKK
settlementAmount
​number · required

Net VAT for the period: positive is payable to SKAT, negative is a refund from SKAT.

Example: 30000
​VatSettlementPreviewLine[] · required

The lines the settlement entry would post.

ProjectSubproject

id
​string · required

Unique identifier of the subproject.

Example: 550e8400-e29b-41d4-a716-446655440010
dimensionValueId
​string · required

The journal-tag value ID that represents this subproject in the dimensions system. Use this value when tagging ledger transactions to the subproject.

Example: 550e8400-e29b-41d4-a716-446655440011
name
​string · required

Display name of the subproject.

Example: Phase 1
isDefault
​boolean · required

Whether this is the default (catch-all) subproject for the project.

Example: false
sortOrder
​number · required

Display sort order (ascending).

Example: 1
budgetHours
​number | null

Budget in hours for this subproject. Null when no budget is set.

Example: 120
budgetAmount
​number | null

Budget amount in the project currency for this subproject. Null when no budget is set.

Example: 15000
color
​string | null

Hex colour code for visual identification in the UI. Null when not set.

Example: #4A90E2

Project

id
​string · required

Unique identifier of the project.

Example: 550e8400-e29b-41d4-a716-446655440000
name
​string · required

Display name of the project.

Example: Website Redesign 2025
isArchived
​boolean · required

Whether the project has been archived. Archived projects are read-only.

Example: false
currency
​string · required

ISO 4217 currency code used for budget amounts on this project.

Example: DKK
dimensionId
​string · required

The shared "Projects" dimension category ID (journal-tag category) that backs every project in your company. Subproject values live as dimension values under this category, nested beneath this project's own dimension value (dimensionValueId).

Example: 550e8400-e29b-41d4-a716-446655440002
defaultSubprojectId
​string · required

ID of the default subproject (the catch-all subproject created with the project).

Example: 550e8400-e29b-41d4-a716-446655440010
​ProjectSubproject[] · required

All subprojects for this project, sorted by sortOrder ascending.

createdAt
​string · required

ISO 8601 timestamp when the project was created.

Example: 2025-01-15T10:00:00.000Z
updatedAt
​string · required

ISO 8601 timestamp when the project was last updated.

Example: 2025-06-01T14:30:00.000Z
customerId
​string | null

ID of the customer this project belongs to. Null when not linked to a customer.

Example: 550e8400-e29b-41d4-a716-446655440001
budgetHours
​number | null

Total budget in hours across all subprojects. Null when not set.

Example: 500
budgetAmount
​number | null

Total budget amount in the project currency. Null when not set.

Example: 100000
startDate
​string | null

Project start date (inclusive), ISO 8601 date string. Null when not set.

Example: 2025-01-01
endDate
​string | null

Project end date (inclusive), ISO 8601 date string. Null when not set.

Example: 2025-12-31
externalReference
​string | null

Your system external reference for this project. Useful for idempotent upserts and cross-system reconciliation. Null when not set.

Example: proj-external-123
color
​string | null

Hex colour code for visual identification. Null when not set.

Example: #FF5733
dimensionValueId
​string | null

The project's own dimension value (journal-tag) ID inside the shared Projects category. Subprojects are nested as dimension values beneath this value. Null only for a project in a corrupt state with no journal-tag.

Example: 550e8400-e29b-41d4-a716-446655440003

UpsertProjectRequest

name
​string · minLength: 1 · maxLength: 120 · required

Display name for the project. Must be unique within your company.

Example: Website Redesign 2025
customerId
​string | null

ID of the customer this project belongs to.

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · minLength: 3 · maxLength: 3

ISO 4217 currency code for budget amounts. Defaults to the customer's currency or the company base currency when omitted.

Example: DKK
budgetHours
​number | null

Total budget in hours. Null clears the budget.

Example: 500
budgetAmount
​number | null

Total budget amount in the project currency. Null clears the budget.

Example: 100000
startDate
​string | null

Project start date (inclusive), ISO 8601 date string.

Example: 2025-01-01
endDate
​string | null

Project end date (inclusive), ISO 8601 date string.

Example: 2025-12-31
externalReference
​string | null · minLength: 1 · maxLength: 255

Your system external reference for this project. Must be unique within your company. The upsert finds an existing project by this value and updates it, or creates a new one.

Example: proj-external-123
color
​string | null · maxLength: 16

Hex colour code for visual identification.

Example: #FF5733

CreateProjectRequest

name
​string · minLength: 1 · maxLength: 120 · required

Display name for the project. Must be unique within your company.

Example: Website Redesign 2025
customerId
​string | null

ID of the customer this project belongs to.

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · minLength: 3 · maxLength: 3

ISO 4217 currency code for budget amounts. Defaults to the customer's currency or the company base currency when omitted.

Example: DKK
budgetHours
​number | null

Total budget in hours. Null clears the budget.

Example: 500
budgetAmount
​number | null

Total budget amount in the project currency. Null clears the budget.

Example: 100000
startDate
​string | null

Project start date (inclusive), ISO 8601 date string.

Example: 2025-01-01
endDate
​string | null

Project end date (inclusive), ISO 8601 date string.

Example: 2025-12-31
externalReference
​string | null · minLength: 1 · maxLength: 255

Your system external reference for this project. Must be unique within your company. Can be used for idempotent upserts via PUT /.

Example: proj-external-123
color
​string | null · maxLength: 16

Hex colour code for visual identification.

Example: #FF5733

ProjectProfitTotals

revenue
​number · required

Base-currency revenue in the date range (positive figure, sign-flipped from REVENUE ledgers).

Example: 80000
cost
​number · required

Base-currency cost in the date range (positive figure, EXPENSE ledgers).

Example: 60000
profit
​number · required

revenue - cost.

Example: 20000
isOverBudget
​boolean · required

True when burnPercent > 100 (over budget). False when under budget or no budget.

Example: false
budgetAmount
​number | null

The budget amount this burn is measured against. Null when no budget is set.

Example: 100000
burnPercent
​number | null

cost / budgetAmount * 100, rounded. Null when no budget is set or budgetAmount is 0.

Example: 60

ProjectSubprojectProfit

revenue
​number · required

Base-currency revenue in the date range (positive figure, sign-flipped from REVENUE ledgers).

Example: 80000
cost
​number · required

Base-currency cost in the date range (positive figure, EXPENSE ledgers).

Example: 60000
profit
​number · required

revenue - cost.

Example: 20000
isOverBudget
​boolean · required

True when burnPercent > 100 (over budget). False when under budget or no budget.

Example: false
subprojectId
​string · required

Subproject ID.

Example: 550e8400-e29b-41d4-a716-446655440010
dimensionValueId
​string · required

The dimension value ID (journal-tag ID) for this subproject.

Example: 550e8400-e29b-41d4-a716-446655440011
name
​string · required

Display name of the subproject.

Example: Phase 1
isDefault
​boolean · required

Whether this is the default (catch-all) subproject.

Example: false
budgetAmount
​number | null

The budget amount this burn is measured against. Null when no budget is set.

Example: 100000
burnPercent
​number | null

cost / budgetAmount * 100, rounded. Null when no budget is set or budgetAmount is 0.

Example: 60

ProjectProfit

projectId
​string · required

Project ID.

Example: 550e8400-e29b-41d4-a716-446655440000
from
​string · required

Inclusive range start actually used (after defaulting), YYYY-MM-DD.

Example: 2025-01-01
to
​string · required

Inclusive range end actually used (after defaulting), YYYY-MM-DD.

Example: 2025-12-31
currency
​string · required

Company base currency the amounts are expressed in.

Example: DKK
​object · required

Aggregate totals for the project.

​ProjectSubprojectProfit[] · required

Per-subproject profit breakdown.

UpdateProjectRequest

name
​string · minLength: 1 · maxLength: 120

New display name for the project.

Example: Website Redesign 2026
customerId
​string | null

Customer ID. Null clears the customer link.

Example: 550e8400-e29b-41d4-a716-446655440001
currency
​string · minLength: 3 · maxLength: 3

ISO 4217 currency code.

Example: EUR
budgetHours
​number | null

Budget in hours. Null clears the budget.

Example: 600
budgetAmount
​number | null

Budget amount in the project currency. Null clears the budget.

Example: 120000
startDate
​string | null

Project start date (inclusive), ISO 8601. Null clears the date.

Example: 2025-01-01
endDate
​string | null

Project end date (inclusive), ISO 8601. Null clears the date.

Example: 2025-12-31
externalReference
​string | null · maxLength: 255

External reference. Null clears the value.

Example: proj-external-123
color
​string | null · maxLength: 16

Hex colour code. Null clears the value.

Example: #FF5733
isArchived
​boolean

Archive or un-archive the project.

Example: false

CreateSubprojectRequest

name
​string · minLength: 1 · maxLength: 120 · required

Display name for the subproject.

Example: Phase 1
budgetHours
​number | null

Budget in hours for this subproject. Null clears the budget.

Example: 120
budgetAmount
​number | null

Budget amount in the project currency. Null clears the budget.

Example: 15000
color
​string | null · maxLength: 16

Hex colour code. Null clears the value.

Example: #4A90E2
sortOrder
​number

Sort order (ascending). Defaults to 0.

Example: 1

UpdateSubprojectRequest

name
​string · minLength: 1 · maxLength: 120

New display name for the subproject.

Example: Phase 2
budgetHours
​number | null

Budget in hours. Null clears the budget.

Example: 200
budgetAmount
​number | null

Budget amount in the project currency. Null clears the budget.

Example: 25000
color
​string | null · maxLength: 16

Hex colour code. Null clears the value.

Example: #4A90E2
sortOrder
​number

Sort order (ascending).

Example: 2

UsageReportRequestDto

value
​number · required

The numeric value of this usage event. How it is used depends on the meter's aggregation method: summed (sum) or taken as the latest value (last). For count meters the value is ignored, but a non-negative number is still required.

Example: 100
customerId
​string · required

Customer ID this usage is associated with.

Example: 550e8400-e29b-41d4-a716-446655440000
meterId
​string

Meter identifier. Provide meterId or meterName. Meter must be ACTIVE; usage will be rejected for archived meters.

Example: 550e8400-e29b-41d4-a716-446655440000
meterName
​string

Meter name. Provide meterId or meterName. Meter must be ACTIVE; usage will be rejected for archived meters.

Example: api_calls
timestamp
​string

ISO-8601 timestamp. Defaults to now.

Example: 2024-01-15T10:30:00Z
dimension
​string · maxLength: 100

What the quantity is measured PER — a seat, a device, a user. Only a meter using the max_per_dimension aggregation reads it; every other aggregation ignores it.

This is a GROUPING key, not a label: the meter bills the peak each dimension reached, added together, so the value must identify a thing that persists across reports. Put descriptive detail in metadata instead, which is never aggregated on.

A value that is unique per report defeats the aggregation, and a meter is refused new dimensions once it carries too many distinct values.

Example: seat-4f21
metadata
​object

Additional metadata for the usage event (values must be string, number, or boolean)

Example: {"region":"us-east-1","feature":"api-calls"}
On this page
  • CompanyFiscalYear
  • CompanyAccounting
  • CompanyResponse
  • RateLimitTierResponse
  • ApiKeyInfoResponse
  • AccountResponse
  • AccountInterval
  • AccountDetailResponse
  • CreateAccountRequest
  • UpdateAccountRequest
  • PublicAuthorityExtractIngestRequest
  • PublicAuthorityExtractIngestResponse
  • PublicAdvisorAuthorityExtractIngestResponse
  • PublicAdvisorClient
  • PublicListAdvisorClientsResponse
  • CustomerGroupResponse
  • CustomerDepartmentResponse
  • CustomerContactResponse
  • CustomerResponse
  • PublicListCustomersResponse
  • CreateCustomerRequest
  • CreateCustomerResponse
  • SubscriptionTransitionItem
  • UpdateCustomerRequest
  • DeleteCustomerResponse
  • DimensionValue
  • Dimension
  • PublicDimensionValueListItem
  • PublicListDimensionValuesResponse
  • PublicDistributionKeyAllocation
  • PublicDistributionKey
  • PublicListDistributionKeysResponse
  • PublicCreateDistributionKeyAllocation
  • PublicCreateDistributionKey
  • CreateDimensionRequest
  • DimensionResponse
  • UpdateDimensionRequest
  • CreateDimensionValueRequest
  • DimensionValueResponse
  • UpdateDimensionValueRequest
  • AttachmentRequest
  • DraftSplitEntryLine
  • CreateDraftJournalEntryRequest
  • CreateDraftJournalEntryBatchRequest
  • DraftJournalEntryLine
  • DraftSplitEntryLineResponse
  • DraftJournalEntryResponse
  • CreateDraftJournalEntryBatchResponse
  • ListDraftJournalEntriesResponse
  • JournalEntryLine
  • JournalEntryWarningDetailsDto
  • JournalEntryWarningDto
  • JournalEntryResponse
  • SplitEntryLine
  • CreateDraftJournalEntryV2Request
  • CreateDraftJournalEntryV2BatchRequest
  • CreateDraftJournalEntryV2BatchResponse
  • UpdateDraftJournalEntryV2Request
  • JournalEntryAttachmentResponse
  • DraftJournalEntryAttachmentsListResponse
  • DraftJournalEntryAttachmentAddedResponse
  • UpdateJournalEntryRequest
  • UpdateJournalEntryResponse
  • ReverseJournalEntryRequest
  • ReverseJournalEntryResponse
  • JournalEntryCorrectionPreviewLine
  • JournalEntryCorrectionPreviewEnteredAs
  • JournalEntryCorrectionPreviewEntry
  • JournalEntryCorrectionPreviewResponse
  • BatchReverseJournalEntriesRequest
  • BatchReverseJournalEntriesResultItem
  • BatchReverseJournalEntriesResponse
  • BatchReverseJournalEntriesPreviewItem
  • BatchReverseJournalEntriesPreviewResponse
  • ReclassifyJournalEntryLine
  • PreviewJournalEntryCorrectionRequest
  • ReverseAndCorrectJournalEntryRequest
  • ReverseAndCorrectJournalEntryResponse
  • PreviewRecreateJournalEntryResponseDto
  • RecreateJournalEntryResponseDto
  • ReclassifyJournalEntryRequest
  • ReclassifyJournalEntryResponse
  • ListJournalEntriesResponse
  • JournalEntryAttachmentsListResponse
  • JournalEntryAttachmentAddedResponse
  • CreateJournalEntryV2Dto
  • CreateJournalEntryV2BatchRequest
  • CreateJournalEntryV2BatchResponse
  • JournalCategoryResponse
  • CreateJournalCategoryRequest
  • UpdateJournalCategoryRequest
  • MeterSubscriptionProductDTO
  • MeterSubscriptionDTO
  • MeterSubscriptionsResponseDTO
  • PaymentMethodResponse
  • CreateCardSaveLinkRequest
  • PaymentLinkResponse
  • PublicSubscriptionPlanPhaseProduct
  • PublicSubscriptionPlanIntervalDiscount
  • PublicSubscriptionPlanPhase
  • PublicSubscriptionPlanResponse
  • PublicListSubscriptionPlansResponse
  • PublicCreateSubscriptionPlanPhaseProduct
  • PublicCreateSubscriptionPlanIntervalDiscount
  • PublicCreateSubscriptionPlanPhase
  • PublicCreateSubscriptionPlanRequest
  • PublicCancelSubscriptionRequest
  • EntitlementRef
  • PublicSubscriptionAddon
  • DiscountType
  • DiscountScope
  • PublicSubscriptionDiscount
  • PublicSubscriptionProduct
  • PublicCancelSubscriptionResponse
  • PublicSubscriptionAddonRef
  • PublicCustomerSubscriptionListItem
  • PublicListCustomerSubscriptionsResponse
  • PublicAssignSubscriptionProductOverride
  • PublicAssignSubscriptionAddon
  • PublicAssignSubscriptionRequest
  • PublicCustomerSubscriptionResponse
  • PublicScheduledChange
  • PublicSubscriptionUsageLine
  • PublicSubscriptionUsage
  • PublicSubscriptionProductChangeLine
  • PublicSubscriptionDiscountEndDate
  • PublicChangeSubscriptionProductsRequest
  • PublicRetryPaymentResponseDTO
  • PublicSubscriptionAddonEligibilityRequest
  • PublicAddonRefusal
  • PublicRemovedCard
  • PublicSubscriptionAddonEligibilityResponse
  • PublicAttachSubscriptionAddonsRequest
  • PublicAttachSubscriptionAddonsResponse
  • PublicCreateSubscriptionAddonRequest
  • PublicUpdateSubscriptionRequest
  • PublicBillingGroupEligibilityRequest
  • PublicBillingGroupRefusal
  • PublicBillingGroupEligibilityResponse
  • PublicFormBillingGroupRequest
  • PublicBillingGroupAddon
  • PublicBillingGroupMemberRef
  • PublicFormBillingGroupResponse
  • PublicBillingGroupMember
  • PublicBillingGroup
  • PublicAddBillingGroupMembersRequest
  • PublicAddBillingGroupMembersResponse
  • PublicRemoveBillingGroupMemberResponse
  • CheckoutReadinessStripeConnect
  • CheckoutReadinessResponse
  • CheckoutQuantitySelection
  • CheckoutAddonSelection
  • CheckoutQuoteRequest
  • CheckoutQuoteResponse
  • CheckoutBuyer
  • CheckoutSessionRequest
  • CheckoutPinnedAddon
  • CheckoutPinned
  • CheckoutSessionResponse
  • CheckoutSessionView
  • CheckoutCardWindowRequest
  • CheckoutCardWindowResponse
  • CheckoutCardDisplay
  • CheckoutCardStatusResponse
  • CheckoutCardReleaseResponse
  • CheckoutConfirmRequest
  • CheckoutConfirmResponse
  • PublicCheckoutVouchPrefill
  • PublicMintCheckoutVouchRequest
  • PublicMintCheckoutVouchResponse
  • DefaultContactDto
  • CreateCustomerRequestDto
  • PublicProvisionCustomerRequest
  • PublicProvisionCustomerResponse
  • PublicResolvePortalPlansRequest
  • PublicPortalPlanItemFeature
  • PublicPortalPricingTier
  • PublicPortalPlanItemProduct
  • PublicPortalPlanItemVat
  • PublicPortalPlanItemAddon
  • PublicPortalPlanItemDiscount
  • PublicPortalPlanItem
  • PublicPortalComparisonCell
  • PublicPortalComparisonRow
  • PublicPortalComparisonSection
  • PublicPortalComparison
  • PublicPortalPlan
  • PublicPortalCatalogEntry
  • PublicResolvePortalPlansDiagnostics
  • PublicResolvePortalPlansResponse
  • PublicPortalPlansListResponse
  • PublicPortalPlanResponse
  • PublicPortalSsoJwks
  • PublicHandoffMembership
  • PublicHandoffMintRequest
  • PublicHandoffMintResponse
  • PublicRevokeSessionsRequest
  • PublicRevokeSessionsResponse
  • VatCodeResponse
  • CreateVatCodeRequest
  • UpdateVatCodeRequest
  • VendorGroupResponse
  • VendorDepartmentResponse
  • VendorContactResponse
  • VendorResponse
  • PublicListVendorsResponse
  • CreateVendorContactRequest
  • CreateVendorRequest
  • CreateVendorResponse
  • SupplierGroupResponse
  • SupplierDepartmentResponse
  • SupplierContactResponse
  • SupplierResponse
  • PublicListSuppliersResponse
  • CreateSupplierContactRequest
  • CreateSupplierRequest
  • CreateSupplierResponse
  • CreateWebhookEndpointRequest
  • WebhookEndpointWithSecret
  • WebhookEndpoint
  • WebhookEndpointList
  • UpdateWebhookEndpointRequest
  • TestWebhookEndpointRequest
  • TestWebhookEndpointResult
  • PublicCreateInvoiceLine
  • PublicCreateInvoice
  • PublicAppliedLineDiscount
  • PublicInvoiceLine
  • PublicAppliedDocumentDiscountVatPart
  • PublicAppliedDocumentDiscount
  • PublicInvoice
  • PublicInvoiceListItem
  • PublicListInvoicesResponse
  • PublicUpdateInvoice
  • PublicSendInvoice
  • PublicSendInvoiceResponse
  • PublicDeliveryStatusSummary
  • PublicDeliveryLogEntry
  • PublicDeliveryStatusResponse
  • PublicCreateCreditNoteLine
  • PublicCreateCreditNote
  • PublicCreditNoteLine
  • PublicCreditNote
  • PublicCreditNoteListItem
  • PublicListCreditNotesResponse
  • PublicSendCreditNote
  • PublicQuoteListItem
  • PublicListQuotesResponse
  • PublicQuoteLine
  • PublicDocumentDiscountWarning
  • PublicQuote
  • PublicCreateQuoteLine
  • PublicCreateQuote
  • PublicSendQuote
  • PublicConvertQuotePayload
  • PublicConvertQuote
  • LineDiscountType
  • DiscountNotApplicableReason
  • PublicDiscountChangedSinceQuoteWarning
  • PublicConvertQuoteResult
  • PublicUpdateQuote
  • PublicOrderConfirmationListItem
  • PublicListOrderConfirmationsResponse
  • PublicOrderConfirmationLine
  • PublicOrderConfirmation
  • PublicCreateOrderConfirmationLine
  • PublicCreateOrderConfirmation
  • PublicSendOrderConfirmation
  • PublicConvertOrderConfirmationPayload
  • PublicConvertOrderConfirmation
  • PublicConvertOrderConfirmationResult
  • PublicUpdateOrderConfirmation
  • PublicDownloadLink
  • ProductGroupResponse
  • ListProductGroupsResponse
  • CreateProductGroupRequest
  • UpdateProductGroupRequest
  • DiscountAmount
  • DiscountAssignment
  • DiscountResponse
  • ListDiscountsResponse
  • DiscountCodeLookupCode
  • DiscountCodeLookupDiscount
  • DiscountCodeLookupResponse
  • DiscountCheckLineRequest
  • DiscountCheckRequest
  • DiscountCheckLineDiscount
  • DiscountCheckLine
  • DiscountCheckVatPart
  • DiscountCheckDocumentDiscount
  • DiscountCheckRefusal
  • DiscountCheckLimit
  • DiscountCheckResponse
  • DiscountApplicabilityResponse
  • CreateDiscountRequest
  • UpdateDiscountRequest
  • DiscountOpenDocument
  • DiscountInUseOnOpenDocumentsWarning
  • DiscountSubscriptionTermsChange
  • UpdateDiscountResponse
  • SetDiscountAmountRequest
  • CreateDiscountAssignmentRequest
  • UpdateDiscountAssignmentResponse
  • UpdateDiscountAssignmentRequest
  • RemoveDiscountAssignmentResponse
  • DiscountCode
  • ListDiscountCodesResponse
  • CreateDiscountCodeRequest
  • UpdateDiscountCodeRequest
  • EntitlementResponse
  • ListEntitlementsResponse
  • CreateEntitlementRequest
  • UpdateEntitlementRequest
  • ProductPriceTierResponse
  • ProductPriceResponse
  • ProductListItem
  • ListProductsResponse
  • ProductResponse
  • CreateProductPriceTierRequest
  • CreateProductInitialPriceRequest
  • CreateProductRequest
  • UpdateProductRequest
  • OnHandRowDTO
  • ListOnHandResponseDTO
  • StockMovementRowDTO
  • ListStockMovementsResponseDTO
  • CreateShipmentLineDTO
  • CreateShipmentDTO
  • ShipmentLineDTO
  • ShipmentDTO
  • ListShipmentsResponseDTO
  • DispatchShipmentDTO
  • PublicOpenEntry
  • PublicOpenEntriesCurrencyTotal
  • PublicOpenEntriesTotals
  • PublicOpenEntriesResponse
  • PublicSettlementListItem
  • PublicSettlementsResponse
  • PublicSettlementEntry
  • PublicSettlementDifferenceLeg
  • PublicSettlementDifference
  • PublicSettlement
  • PublicSettlementEntrySelection
  • PublicSettleRequest
  • PublicSettlementPreviewEntry
  • PublicSettlementDifferencePreview
  • PublicSettlementPostingLine
  • PublicSettlementRateGapCurrency
  • PublicSettlementPreview
  • PublicSettlementCreated
  • PublicReverseSettlementReopenedEntry
  • PublicReverseSettlementPreview
  • PublicReverseSettlementRequest
  • PublicReverseSettlementResponse
  • PublicCreditNoteLinkPreviewRequest
  • PublicCreditNoteAppliedInvoice
  • PublicCreditNoteLinkState
  • PublicCreditNoteLinkCandidate
  • PublicCreditNoteLinkPreview
  • PublicCreditNoteLinkRequest
  • PublicCreditNoteUnlinkRequest
  • PublicBankReconciliationRequest
  • PublicBankReconciliationPreviewBankLine
  • PublicBankReconciliationPreviewLine
  • PublicBankReconciliationPreviewPayment
  • PublicBankReconciliationPreviewWarning
  • PublicBankReconciliationPreview
  • PublicBankReconciliationCreatedPayment
  • PublicBankReconciliation
  • PublicBankReconciliationBatchItem
  • PublicBankReconciliationBatchRequest
  • PublicBankReconciliationBatchResultRow
  • PublicBankReconciliationBatchPreview
  • PublicBankReconciliationBatch
  • PublicUnreconcilePreviewRequest
  • PublicUnreconcileStillPostedEntry
  • PublicUnreconcilePreview
  • PublicUnreconcileRequest
  • PublicUnreconcileResponse
  • PublicBankTransactionCounterparty
  • PublicBankTransactionFik
  • PublicBankTransactionReconciliation
  • PublicBankTransaction
  • PublicListBankTransactionsResponse
  • PublicBankTransactionSelectionRequest
  • PublicBankTransactionDismissPreviewRow
  • PublicBankTransactionDismissPreview
  • PublicBankTransactionDismissRow
  • PublicBankTransactionDismissResponse
  • CreateProductPriceRequest
  • UpdateProductPriceRequest
  • DocumentTemplateListItem
  • ListDocumentTemplatesResponse
  • BudgetSummary
  • ListBudgetsResponse
  • BudgetRunwayResponse
  • BudgetLine
  • BudgetPeriod
  • BudgetDriverCell
  • BudgetScenarioOnlyDriverMonth
  • BudgetDriverRow
  • BudgetRowOverride
  • BudgetRowNumber
  • BudgetDetail
  • BudgetExcelChange
  • BudgetExcelRefusedRow
  • BudgetExcelPublication
  • BudgetExcelUploadResponse
  • BudgetScenario
  • ListBudgetScenariosResponse
  • BudgetScenarioGridResponse
  • BudgetComparisonSummary
  • BudgetComparisonEntry
  • BudgetComparisonResponse
  • BudgetVarianceRow
  • BudgetVarianceResponse
  • BudgetFrozenBaselineSummary
  • ListBudgetFrozenBaselinesResponse
  • BudgetFrozenBaselineCell
  • BudgetFrozenBaselineDetail
  • BudgetRebaselineProposal
  • ListBudgetRebaselineProposalsResponse
  • MarkVatPeriodFiledRequest
  • VatPeriodFiledResponse
  • VatPeriodFilingPreviewResponse
  • VatPeriodRequest
  • SettleVatPeriodResponse
  • VatSettlementPreviewLine
  • VatSettlementPreviewResponse
  • ProjectSubproject
  • Project
  • UpsertProjectRequest
  • CreateProjectRequest
  • ProjectProfitTotals
  • ProjectSubprojectProfit
  • ProjectProfit
  • UpdateProjectRequest
  • CreateSubprojectRequest
  • UpdateSubprojectRequest
  • UsageReportRequestDto