LedgerBee Developer
  • Getting started
  • Conventions
  • Products
  • Configuration
  • API Reference
Information
Accounts
    List accountsget
API Key
    Get current API keyget
Company
    Get company detailsget
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 customerpost
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 categorydeleteCreate a new dimension valuepostUpdate a dimension valueputDelete a dimension valuedelete
Document Templates
    List document templatesget
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 categoriesget
Journal Entries
    Create multiple journal entries in batchpostList journal entriesgetCreate a journal entrypostGet a journal entrygetUpdate a journal entry — correct the reference and/or set your external system idpatchGet attachments for a journal entrygetReverse 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
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 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 productpatch
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
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