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

Budgets

Download schema

Read-only access to budgets & forecasting: budget grids per account and period, scenarios, budget-vs-actuals comparison, variance vs frozen baselines, and the cash runway headline. Requires the Budgets license.


List budgets

GET
https://api.ledgerbee.com/api
/v1/budgets
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Retrieves a paginated list of your company's budgets. Each budget plans one accounting year; amounts are kept in the company's base currency (currency).

Pass ?status= to filter by budget status, ?accountingYearId= to filter by accounting year, or ?search= to prefix-match on budget name.

Required Scope

  • budgets-read

List budgets › query Parameters

page
​number · min: 1

Page number (1-indexed)

Default: 1
limit
​number · min: 1 · max: 100

Maximum number of items per page

Default: 25
search
​string

Prefix search on budget name

Example: Budget 2026
status
​string · enum

Filter by budget status

Enum values:
DRAFT
ACTIVE
ARCHIVED
accountingYearId
​string · uuid

Filter by accounting year

sortBy
​string · enum

Field to sort by

Enum values:
name
createdAt
updatedAt
Default: createdAt
sortOrder
​string · enum

Sort direction

Enum values:
ASC
DESC
Default: DESC

List budgets › Responses

Paginated list of budgets for the company

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
GET/v1/budgets
curl https://api.ledgerbee.com/api/v1/budgets \ --header 'x-api-key: <api-key>'
Example Responses
{ "data": [ { "id": "00000000-0000-0000-0000-000000000000", "name": "Budget 2026", "status": "DRAFT", "accountingYearId": "00000000-0000-0000-0000-000000000000", "accountingYearStartDate": "2026-01-01", "accountingYearEndDate": "2026-12-31", "dimensionCategoryId": "00000000-0000-0000-0000-000000000000", "currency": "DKK", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-15T10:30:00.000Z" } ], "total": 3, "page": 1, "limit": 25, "totalPages": 1 }
json
application/json

Get a budget

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Retrieves a budget with its full grid: budget cells (lines), the accounting year's periods, driver rows, and per-budget display metadata.

Cells in CLOSED periods carry the book actuals rather than the planned amount (source: ACTUALS) — the same rolling-forecast view the app shows. The planned amounts for closed periods are preserved internally but are not part of this response.

Required Scope

  • budgets-read

Get a budget › path Parameters

budgetId
​string · required

The budget id

Get a budget › query Parameters

includeBaseline
​boolean

When true, every line also carries baseline — the prior accounting year's realised amount for the same account and calendar month (decimal string; 0.00 when no prior-year figure exists).

Default: false

Get a budget › Responses

Budget detail with lines and periods

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.

GET/v1/budgets/{budgetId}
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId \ --header 'x-api-key: <api-key>'
Example Responses
{ "id": "00000000-0000-0000-0000-000000000000", "name": "Budget 2026", "status": "DRAFT", "accountingYearId": "00000000-0000-0000-0000-000000000000", "accountingYearStartDate": "2026-01-01", "accountingYearEndDate": "2026-12-31", "dimensionCategoryId": "00000000-0000-0000-0000-000000000000", "currency": "DKK", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-15T10:30:00.000Z", "lines": [ { "id": "00000000-0000-0000-0000-000000000000", "ledgerId": "00000000-0000-0000-0000-000000000000", "ledgerName": "Salg af varer/ydelser m/moms", "accountNumber": 1010, "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "amount": "160000.00", "dimensionValueId": "00000000-0000-0000-0000-000000000000", "formula": "formula", "inputMethod": "MANUAL", "source": "ACTUALS", "error": "error", "baseline": "150000.00" } ], "periods": [ { "id": "00000000-0000-0000-0000-000000000000", "label": "Jan 2026", "startDate": "2026-01-01", "endDate": "2026-01-31", "periodIndex": 1, "status": "OPEN" } ], "driverRows": [ { "id": "00000000-0000-0000-0000-000000000000", "name": "Headcount", "handle": "headcount", "displayOrder": 1, "unit": "unit", "cells": [ { "id": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "value": 12, "formula": "formula", "error": "error" } ], "scenarioOnlyMonths": [ { "scenarioOverrideId": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "value": 2 } ] } ], "rowOverrides": [ { "ledgerId": "00000000-0000-0000-0000-000000000000", "label": "label", "isHidden": true } ], "rowNumbers": [ { "ledgerId": "00000000-0000-0000-0000-000000000000", "driverRowId": "00000000-0000-0000-0000-000000000000", "lineNumber": 2 } ] }
json
application/json

Get the budget vs actuals comparison

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/comparison
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Budget vs booked actuals per account and period, with a summary. Variance is budget − actual; isOverBudget marks the unfavourable direction per account type (overspend on expense accounts, shortfall on revenue accounts).

Required Scope

  • budgets-read

Get the budget vs actuals comparison › path Parameters

budgetId
​string · required

The budget id

Get the budget vs actuals comparison › query Parameters

viewMode
​string · enum

View mode: FISCAL_YEAR compares the budget's accounting year; ROLLING_12_MONTHS compares 12 months from startMonth (or the current month).

Enum values:
FISCAL_YEAR
ROLLING_12_MONTHS
Default: FISCAL_YEAR
startMonth
​string

Start month for the rolling view (YYYY-MM)

Example: 2026-01

Get the budget vs actuals comparison › Responses

Budget vs actuals comparison

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

GET/v1/budgets/{budgetId}/comparison
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/comparison \ --header 'x-api-key: <api-key>'
Example Responses
{ "budgetName": "Budget 2026", "currency": "DKK", "summary": { "totalBudget": "3251000.00", "totalActual": "3100000.00", "totalVariance": "151000.00", "totalVariancePercent": 0, "isOverBudget": true }, "entries": [ { "ledgerId": "00000000-0000-0000-0000-000000000000", "ledgerName": "Salg af varer/ydelser m/moms", "accountNumber": 1010, "periodId": "00000000-0000-0000-0000-000000000000", "budgetAmount": "160000.00", "actualAmount": "154321.12", "variance": "5678.88", "variancePercent": 0, "isOverBudget": true, "isRevenueAccount": true, "dimensionValueId": "00000000-0000-0000-0000-000000000000" } ], "periods": [ { "id": "00000000-0000-0000-0000-000000000000", "label": "Jan 2026", "startDate": "2026-01-01", "endDate": "2026-01-31", "periodIndex": 1, "status": "OPEN" } ] }
json
application/json

Export a budget's Excel workbook

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/excel
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

The budget as the Excel workbook the app's Download button gives: one row per account (and dimension value), one column per accounting period, figures in the company's base currency. Edit the figures and send the file back to POST /api/v1/budgets/{budgetId}/excel.

Keep the workbook's hidden sheet: it identifies the budget, its accounting year and the figures the file was exported with, which is how an upload tells a figure you changed from one somebody else changed in the meantime.

Required Scope

  • budgets-read

Export a budget's Excel workbook › path Parameters

budgetId
​string · required

The budget id

Export a budget's Excel workbook › Responses

The budget workbook (.xlsx)

string
GET/v1/budgets/{budgetId}/excel
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/excel \ --header 'x-api-key: <api-key>'
Example Responses
string
text
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Overwrite a budget's figures from an edited workbook

POST
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/excel
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Upload an edited copy of the budget's workbook (from GET /api/v1/budgets/{budgetId}/excel) as the multipart form field file, up to 5 MB. The figures in the file become the budget's figures, exactly as the app's Upload button publishes them: only the figures typed into the file change, and formula figures that read them recalculate. The upload is kept in the budget's upload history with its file.

Pass ?dryRun=true to check the file first: the response is the same, with every figure that would change and every row that is refused, and nothing is written. Pass the dry run's previewToken to the publish to have it refused with 409 BUDGET_EXCEL_PREVIEW_STALE if the budget changed in between.

A workbook from another budget, accounting year or currency is refused with 400, and so is a publish with refused rows (BUDGET_EXCEL_HAS_REFUSED_ROWS) or with no figure to change (BUDGET_EXCEL_NOTHING_TO_PUBLISH). A dry run answers those rows in refusedRows instead.

A retry sent with the same x-api-idempotency-key is answered with the original response. Use a new key for each request: a dry run and the publish after it are two requests.

Required Scope

  • budgets-write

Overwrite a budget's figures from an edited workbook › path Parameters

budgetId
​string · required

The budget id

Overwrite a budget's figures from an edited workbook › query Parameters

dryRun
​boolean

true checks the workbook and answers every figure it would change, writing nothing. Omitted or false, the workbook is published over the budget's figures.

Default: false
previewToken
​string

The previewToken a dry run of the same file answered. Given, the publish is refused with 409 BUDGET_EXCEL_PREVIEW_STALE if the budget changed after that dry run.

Overwrite a budget's figures from an edited workbook › Headers

x-api-idempotency-key
​string · maxLength: 255

Optional idempotency key for safely retrying mutating requests.

Overwrite a budget's figures from an edited workbook › Request Body

file
​string · required

The edited budget workbook (.xlsx), up to 5 MB.

Overwrite a budget's figures from an edited workbook › Responses

The changes the workbook makes, and the published upload unless it was a dry run

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.

POST/v1/budgets/{budgetId}/excel
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/excel \ --request POST \ --header 'Content-Type: multipart/form-data' \ --header 'x-api-key: <api-key>' \ --form 'file=file'
Example Request Body
{ "file": "file" }
text
Example Responses
{ "dryRun": true, "budgetId": "00000000-0000-0000-0000-000000000000", "budgetName": "Budget 2026", "accountingYearStartDate": "accountingYearStartDate", "accountingYearEndDate": "accountingYearEndDate", "currency": "DKK", "fileName": "fileName", "exportedAt": "exportedAt", "rowsRead": 0, "changes": [ { "ledgerId": "00000000-0000-0000-0000-000000000000", "accountNumber": 2210, "accountName": "Rent", "dimensionValueId": "00000000-0000-0000-0000-000000000000", "dimensionValueName": "dimensionValueName", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "periodStartDate": "2026-01-01", "periodLabel": "Jan 2026", "periodClosed": true, "previousAmount": "1000.00", "newAmount": "1250.00", "origin": "FILE", "previousFormula": "previousFormula", "previousSource": "ACTUALS", "changedSinceExport": true, "rowNumber": 0 } ], "refusedRows": [ { "rowNumber": 0, "column": "column", "code": "code", "details": {} } ], "ignoredColumns": [ "string" ], "ignoredRowNumbers": [ 0 ], "canPublish": true, "previewToken": "previewToken", "publication": { "id": "00000000-0000-0000-0000-000000000000", "fileName": "fileName", "publishedAt": "2026-10-16T09:30:00.000Z", "publishedVia": "APP", "fileChangeCount": 0, "recalculatedChangeCount": 0, "byteSize": 0 } }
json
application/json

List a budget's frozen baselines

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/frozen-baselines
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Immutable snapshots of the resolved grid, frozen at a point in time. The variance report compares actuals against one of these.

Required Scope

  • budgets-read

List a budget's frozen baselines › path Parameters

budgetId
​string · required

The budget id

List a budget's frozen baselines › Responses

The budget's frozen baselines

ListBudgetFrozenBaselinesResponse
​BudgetFrozenBaselineSummary[] · required

The budget's frozen baselines, most recent first

GET/v1/budgets/{budgetId}/frozen-baselines
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/frozen-baselines \ --header 'x-api-key: <api-key>'
Example Responses
{ "data": [ { "id": "00000000-0000-0000-0000-000000000000", "label": "Board-approved plan", "scenarioId": "00000000-0000-0000-0000-000000000000", "frozenAt": "2026-01-15T10:30:00.000Z", "frozenBy": "frozenBy", "cellCount": 288 } ] }
json
application/json

Get a frozen baseline with its snapshot cells

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/frozen-baselines/{baselineId}
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Retrieves one frozen baseline including every snapshot cell.

Required Scope

  • budgets-read

Get a frozen baseline with its snapshot cells › path Parameters

budgetId
​string · required

The budget id

baselineId
​string · required

The frozen baseline id

Get a frozen baseline with its snapshot cells › Responses

Frozen baseline detail

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

GET/v1/budgets/{budgetId}/frozen-baselines/{baselineId}
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/frozen-baselines/:baselineId \ --header 'x-api-key: <api-key>'
Example Responses
{ "id": "00000000-0000-0000-0000-000000000000", "label": "Board-approved plan", "scenarioId": "00000000-0000-0000-0000-000000000000", "frozenAt": "2026-01-15T10:30:00.000Z", "frozenBy": "frozenBy", "currency": "DKK", "cells": [ { "id": "00000000-0000-0000-0000-000000000000", "ledgerId": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "dimensionValueId": "00000000-0000-0000-0000-000000000000", "amount": "160000.00", "source": "ACTUALS" } ] }
json
application/json

List a budget's re-baseline proposals

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/rebaseline-proposals
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

When an accounting period closes, the system can propose re-baselining the budget's remaining months off the closed actuals. Proposals are confirmed or rejected in the app; this lists them with their status.

Required Scope

  • budgets-read

List a budget's re-baseline proposals › path Parameters

budgetId
​string · required

The budget id

List a budget's re-baseline proposals › Responses

The budget's re-baseline proposals

ListBudgetRebaselineProposalsResponse
​BudgetRebaselineProposal[] · required

The budget's re-baseline proposals

GET/v1/budgets/{budgetId}/rebaseline-proposals
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/rebaseline-proposals \ --header 'x-api-key: <api-key>'
Example Responses
{ "data": [ { "id": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "status": "PROPOSED", "proposedAt": "2026-02-01T02:00:00.000Z", "confirmedAt": "confirmedAt" } ] }
json
application/json

List a budget's scenarios

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/scenarios
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Scenarios are assumption overlays (driver-cell overrides and line toggles) on top of the budget's base grid. The isBaseline "Base" scenario represents the grid with no overlay; it is created when the tenant first uses scenarios in the app, so a budget that has never opened the scenario switcher returns an empty list — the base data is the budget detail itself.

Required Scope

  • budgets-read

List a budget's scenarios › path Parameters

budgetId
​string · required

The budget id

List a budget's scenarios › Responses

The budget's scenarios

ListBudgetScenariosResponse
​BudgetScenario[] · required

The budget's scenarios

GET/v1/budgets/{budgetId}/scenarios
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/scenarios \ --header 'x-api-key: <api-key>'
Example Responses
{ "data": [ { "id": "00000000-0000-0000-0000-000000000000", "name": "Aggressive hiring", "description": "description", "isBaseline": true, "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-15T10:30:00.000Z" } ] }
json
application/json

Resolve a budget's grid under a scenario

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/scenarios/{scenarioId}/grid
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Returns the fully resolved grid (budget cells + driver rows) with the scenario's assumptions applied. Read-only — nothing is persisted.

Required Scope

  • budgets-read

Resolve a budget's grid under a scenario › path Parameters

budgetId
​string · required

The budget id

scenarioId
​string · required

The scenario id

Resolve a budget's grid under a scenario › Responses

The resolved scenario grid

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
GET/v1/budgets/{budgetId}/scenarios/{scenarioId}/grid
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/scenarios/:scenarioId/grid \ --header 'x-api-key: <api-key>'
Example Responses
{ "currency": "DKK", "lines": [ { "id": "00000000-0000-0000-0000-000000000000", "ledgerId": "00000000-0000-0000-0000-000000000000", "ledgerName": "Salg af varer/ydelser m/moms", "accountNumber": 1010, "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "amount": "160000.00", "dimensionValueId": "00000000-0000-0000-0000-000000000000", "formula": "formula", "inputMethod": "MANUAL", "source": "ACTUALS", "error": "error", "baseline": "150000.00" } ], "driverRows": [ { "id": "00000000-0000-0000-0000-000000000000", "name": "Headcount", "handle": "headcount", "displayOrder": 1, "unit": "unit", "cells": [ { "id": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "value": 12, "formula": "formula", "error": "error" } ], "scenarioOnlyMonths": [ { "scenarioOverrideId": "00000000-0000-0000-0000-000000000000", "accountingPeriodId": "00000000-0000-0000-0000-000000000000", "value": 2 } ] } ], "hasCycle": true, "forecastHorizonMonth": "2026-12" }
json
application/json

Get the variance report vs a frozen baseline

GET
https://api.ledgerbee.com/api
/v1/budgets/{budgetId}/variance
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Closed-period actuals compared against a frozen baseline (defaults to the most recently frozen one). Variance is actual − frozen baseline — the inverse of the comparison endpoint, which compares against the live plan. Returns an empty data array when the budget has no frozen baseline yet.

Required Scope

  • budgets-read

Get the variance report vs a frozen baseline › path Parameters

budgetId
​string · required

The budget id

Get the variance report vs a frozen baseline › query Parameters

frozenBaselineId
​string · uuid

Frozen baseline to compare against. Defaults to the most recently frozen baseline.

Get the variance report vs a frozen baseline › Responses

Variance rows vs the frozen baseline

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.

GET/v1/budgets/{budgetId}/variance
curl https://api.ledgerbee.com/api/v1/budgets/:budgetId/variance \ --header 'x-api-key: <api-key>'
Example Responses
{ "currency": "DKK", "data": [ { "ledgerId": "00000000-0000-0000-0000-000000000000", "accountName": "Salg af varer/ydelser m/moms", "accountType": "DEBIT", "periodId": "00000000-0000-0000-0000-000000000000", "frozenBaseline": "160000.00", "actual": "170000.00", "variance": "10000.00", "variancePercent": 0, "sentiment": "favourable" } ] }
json
application/json

Get the runway headline

GET
https://api.ledgerbee.com/api
/v1/budgets/runway
x-api-key (header)
or
OAuth 2.0

Credential: a company's API key or OAuth token.

Cash-on-hand, trailing 3-month burn, and months of runway remaining. This is company-wide (cash and burn are properties of the whole company, not of one budget), which is why it is not scoped under a budget id.

Required Scope

  • budgets-read

Get the runway headline › query Parameters

asOf
​string

ISO date (YYYY-MM-DD) the cash and burn are computed as of. Defaults to today.

Example: 2026-08-25

Get the runway headline › Responses

Runway headline for the company

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
GET/v1/budgets/runway
curl https://api.ledgerbee.com/api/v1/budgets/runway \ --header 'x-api-key: <api-key>'
Example Responses
{ "currency": "DKK", "cashOnHand": "2051260.11", "trailing3MonthBurn": "296121.14", "monthsRemaining": 6.9, "status": "OK", "hasCashSource": true, "asOf": "2026-08-25", "feedReportedCashTotal": "2051260.11", "unlinkedBankAccountCount": 0 }
json
application/json

Billing GroupsCheckout