LedgerBee Developer
  • Getting started
  • Conventions
  • Products
  • Configuration
  • API Reference
Information
Accounts
    List accountsget
API Key
    Get current API keyget
Authority Extracts
    Submit authority extract datapost
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 comparisongetList 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-update 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 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 customergetUpdate 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
Document Templates
    List document templatesget
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)patchBook a draft journal entry (v2)post
Entitlements
    List entitlementsgetCreate an entitlementpostGet an entitlementgetDelete an entitlementdeleteUpdate an entitlementpatch
Invoices
    List invoicesgetCreate a draft invoicepostGet an invoicegetGet 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 entrygetPreview a correction without posting itpostMove postings to different accounts, keeping the document intactpostReverse a posted entry and open a draft to re-enter itpostReverse posted journal entries in batchpostReverse 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 settlementgetCheck what settling these entries would dopost
Subscriptions
    List customer subscriptionsgetAssign a subscription to a customerpostGet a customer subscription by its stable idgetUpdate a customer subscriptionpatchRetry a failed card paymentpostList a subscription's pending scheduled changesgetCancel a single pending scheduled changedeleteCancel a customer subscriptionpostList subscription plansgetCreate a subscription planpostArchive a subscription planpost
Suppliers
    List suppliersgetCreate a supplierpostList supplier contactsgetList supplier departmentsgetList supplier groupsget
VAT Codes
    List VAT codesget
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

Projects

Download schema

Project, subproject, and project profit endpoints


List all projects

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

Retrieves all projects for your company. By default archived projects are excluded.

Use ?includeArchived=true to also return archived (read-only) projects.

Required Scope

  • projects-read

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

List all projects › query Parameters

includeArchived
​boolean

Set to true to include archived projects. Defaults to false.

List all projects › Responses

Project list returned successfully.

​Project[]
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
GET/v1/projects
curl https://api.ledgerbee.com/api/v1/projects \ --header 'x-api-key: <api-key>'
Example Responses
[ { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Website Redesign 2025", "isArchived": false, "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "dimensionId": "550e8400-e29b-41d4-a716-446655440002", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440003", "defaultSubprojectId": "550e8400-e29b-41d4-a716-446655440010", "subprojects": [ { "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 } ], "createdAt": "2025-01-15T10:00:00.000Z", "updatedAt": "2025-06-01T14:30:00.000Z" } ]
json
application/json

Create or update a project by external reference

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

Creates or updates a project identified by externalReference.

If no project with the given externalReference exists it is created and the response is 201 Created. If a matching project already exists it is updated in place and the response is 200 OK. Either way the response body is the project resource (same shape as create / get).

Concurrent requests with the same externalReference are safe: a unique-constraint race is caught and resolved to an update.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND — returned when the matched project is deleted mid-race (extremely rare).

Create or update a project by external reference › Headers

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

Optional idempotency key for safely retrying mutating requests.

Create or update a project by external reference › Request Body

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

Create or update a project by external reference › Responses

Existing project updated (matched by externalReference).

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
PUT/v1/projects
curl https://api.ledgerbee.com/api/v1/projects \ --request PUT \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "name": "Website Redesign 2025", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733" }'
Example Request Body
{ "name": "Website Redesign 2025", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733" }
json
application/json
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Website Redesign 2025", "isArchived": false, "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "dimensionId": "550e8400-e29b-41d4-a716-446655440002", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440003", "defaultSubprojectId": "550e8400-e29b-41d4-a716-446655440010", "subprojects": [ { "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 } ], "createdAt": "2025-01-15T10:00:00.000Z", "updatedAt": "2025-06-01T14:30:00.000Z" }
json
application/json

Create a project

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

Creates a new project. The project is automatically provisioned with a default (catch-all) subproject.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_EXTERNAL_REFERENCE_CONFLICT (409) — another project already has the same externalReference.

Create a project › Headers

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

Optional idempotency key for safely retrying mutating requests.

Create a project › Request Body

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

Create a project › Responses

Project created successfully.

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
POST/v1/projects
curl https://api.ledgerbee.com/api/v1/projects \ --request POST \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "name": "Website Redesign 2025", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733" }'
Example Request Body
{ "name": "Website Redesign 2025", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733" }
json
application/json
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Website Redesign 2025", "isArchived": false, "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "dimensionId": "550e8400-e29b-41d4-a716-446655440002", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440003", "defaultSubprojectId": "550e8400-e29b-41d4-a716-446655440010", "subprojects": [ { "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 } ], "createdAt": "2025-01-15T10:00:00.000Z", "updatedAt": "2025-06-01T14:30:00.000Z" }
json
application/json

Get a project

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

Retrieves a single project by its ID, including all subprojects.

Required Scope

  • projects-read

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — no project with the given ID exists for your company.

Get a project › path Parameters

id
​string · required

The project UUID.

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

Get a project › Responses

Project returned successfully.

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
GET/v1/projects/{id}
curl https://api.ledgerbee.com/api/v1/projects/:id \ --header 'x-api-key: <api-key>'
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Website Redesign 2025", "isArchived": false, "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "dimensionId": "550e8400-e29b-41d4-a716-446655440002", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440003", "defaultSubprojectId": "550e8400-e29b-41d4-a716-446655440010", "subprojects": [ { "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 } ], "createdAt": "2025-01-15T10:00:00.000Z", "updatedAt": "2025-06-01T14:30:00.000Z" }
json
application/json

Update a project

PUT
https://api.ledgerbee.com/api
/v1/projects/{id}
x-api-key (header)
or
OAuth 2.0

Updates a project. All fields are optional — only provided fields are changed. Send null for an optional field to clear it. To archive a project set isArchived: true.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — no project with the given ID exists for your company.
  • PROJECT_EXTERNAL_REFERENCE_CONFLICT (409) — another project already has the supplied externalReference.

Update a project › path Parameters

id
​string · required

The project UUID.

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

Update a project › Headers

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

Optional idempotency key for safely retrying mutating requests.

Update a project › Request Body

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

Update a project › Responses

Project updated successfully.

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
PUT/v1/projects/{id}
curl https://api.ledgerbee.com/api/v1/projects/:id \ --request PUT \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "name": "Website Redesign 2026", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "EUR", "budgetHours": 600, "budgetAmount": 120000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "isArchived": false }'
Example Request Body
{ "name": "Website Redesign 2026", "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "EUR", "budgetHours": 600, "budgetAmount": 120000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "isArchived": false }
json
application/json
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Website Redesign 2025", "isArchived": false, "customerId": "550e8400-e29b-41d4-a716-446655440001", "currency": "DKK", "budgetHours": 500, "budgetAmount": 100000, "startDate": "2025-01-01", "endDate": "2025-12-31", "externalReference": "proj-external-123", "color": "#FF5733", "dimensionId": "550e8400-e29b-41d4-a716-446655440002", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440003", "defaultSubprojectId": "550e8400-e29b-41d4-a716-446655440010", "subprojects": [ { "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 } ], "createdAt": "2025-01-15T10:00:00.000Z", "updatedAt": "2025-06-01T14:30:00.000Z" }
json
application/json

Get project profit

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

Returns aggregated profit/cost/revenue data for a project and its subprojects over a date range.

When from and to are omitted the current accounting year is used as the default range.

Required Scope

  • projects-read

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — no project with the given ID exists for your company.

Get project profit › path Parameters

id
​string · required

The project UUID.

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

Get project profit › query Parameters

from
​string

Range start (inclusive), YYYY-MM-DD.

to
​string

Range end (inclusive), YYYY-MM-DD.

Get project profit › Responses

Profit data returned successfully.

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.

GET/v1/projects/{id}/profit
curl https://api.ledgerbee.com/api/v1/projects/:id/profit \ --header 'x-api-key: <api-key>'
Example Responses
{ "projectId": "550e8400-e29b-41d4-a716-446655440000", "from": "2025-01-01", "to": "2025-12-31", "currency": "DKK", "total": { "revenue": 80000, "cost": 60000, "profit": 20000, "budgetAmount": 100000, "burnPercent": 60, "isOverBudget": false }, "subprojects": [ { "revenue": 80000, "cost": 60000, "profit": 20000, "budgetAmount": 100000, "burnPercent": 60, "isOverBudget": false, "subprojectId": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false } ] }
json
application/json

Add a subproject

POST
https://api.ledgerbee.com/api
/v1/projects/{id}/subprojects
x-api-key (header)
or
OAuth 2.0

Creates a new subproject (dimension value) under the given project.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — the parent project does not exist.

Add a subproject › path Parameters

id
​string · required

The project UUID.

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

Add a subproject › Headers

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

Optional idempotency key for safely retrying mutating requests.

Add a subproject › Request Body

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

Add a subproject › Responses

Subproject created successfully.

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
POST/v1/projects/{id}/subprojects
curl https://api.ledgerbee.com/api/v1/projects/:id/subprojects \ --request POST \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "name": "Phase 1", "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 }'
Example Request Body
{ "name": "Phase 1", "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 }
json
application/json
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 }
json
application/json

Update a subproject

PUT
https://api.ledgerbee.com/api
/v1/projects/{id}/subprojects/{subprojectId}
x-api-key (header)
or
OAuth 2.0

Updates an existing subproject. All fields are optional. Send null for an optional field to clear it.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — the parent project does not exist.
  • SUBPROJECT_NOT_FOUND (404) — the subproject does not exist on this project.

Update a subproject › path Parameters

id
​string · required

The project UUID.

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

The subproject UUID.

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

Update a subproject › Headers

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

Optional idempotency key for safely retrying mutating requests.

Update a subproject › Request Body

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

Update a subproject › Responses

Subproject updated successfully.

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
PUT/v1/projects/{id}/subprojects/{subprojectId}
curl https://api.ledgerbee.com/api/v1/projects/:id/subprojects/:subprojectId \ --request PUT \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "name": "Phase 2", "budgetHours": 200, "budgetAmount": 25000, "color": "#4A90E2", "sortOrder": 2 }'
Example Request Body
{ "name": "Phase 2", "budgetHours": 200, "budgetAmount": 25000, "color": "#4A90E2", "sortOrder": 2 }
json
application/json
Example Responses
{ "id": "550e8400-e29b-41d4-a716-446655440010", "dimensionValueId": "550e8400-e29b-41d4-a716-446655440011", "name": "Phase 1", "isDefault": false, "budgetHours": 120, "budgetAmount": 15000, "color": "#4A90E2", "sortOrder": 1 }
json
application/json

Delete a subproject

DELETE
https://api.ledgerbee.com/api
/v1/projects/{id}/subprojects/{subprojectId}
x-api-key (header)
or
OAuth 2.0

Deletes a subproject and its associated dimension value. The default (catch-all) subproject cannot be deleted.

Required Scope

  • projects-write

Required License

  • Projects — the tenant must also hold this module license, or the request returns 403 LICENSE.REQUIRED.

Error codes

  • PROJECT_NOT_FOUND (404) — the parent project does not exist.
  • SUBPROJECT_NOT_FOUND (404) — the subproject does not exist on this project.
  • SUBPROJECT_IS_DEFAULT (400) — the subproject is the project's default catch-all and cannot be deleted.

Delete a subproject › path Parameters

id
​string · required

The project UUID.

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

The subproject UUID.

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

Delete a subproject › Headers

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

Optional idempotency key for safely retrying mutating requests.

Delete a subproject › Responses

Subproject deleted successfully.

No data returned
DELETE/v1/projects/{id}/subprojects/{subprojectId}
curl https://api.ledgerbee.com/api/v1/projects/:id/subprojects/:subprojectId \ --request DELETE \ --header 'x-api-key: <api-key>'
Example Responses
No example specified for this content type

ProductsQuotes