LedgerBee Developer
  • Getting started
  • Conventions
  • Products
  • API Reference
Information
Accounts
    List accountsget
API Key
    Get current API keyget
Company
    Get company detailsget
Customers
    List customersgetCreate a customerpostGet a single customergetUpdate a customerpatchList a customer's contactsgetList a customer's departmentsgetList customer groupsget
Dimensions
    List all dimensionsgetCreate a new dimension categorypostGet a single dimension by IDgetUpdate a dimension categoryputDelete a dimension categorydeleteCreate a new dimension valuepostUpdate a dimension valueputDelete a dimension valuedelete
Document Templates
    List document templatesget
Journal Categories
    List journal categoriesget
Journal Entries
    Create multiple journal entries in batch (DEPRECATED — migrate to v2)postList journal entriesgetCreate a single journal entry (DEPRECATED — use POST /api/v2/journal-entries)postGet a single 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
MCP
    LedgerBee Developer MCP Serverpost
Meters
    List meter subscriptions by IDgetReport usagepostList meter subscriptions by nameget
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 projectsgetIdempotent project upsertputCreate a projectpostGet a projectgetUpdate a projectputGet project profitgetAdd a subprojectpostUpdate a subprojectputDelete a subprojectdelete
Subscriptions
    List customer subscriptionsgetAssign a subscription to a customerpostGet a customer subscription by its stable idgetUpdate a customer subscriptionpatchList a subscription’s pending scheduled changesgetCancel a single pending scheduled changedeleteCancel a customer subscriptionpostList subscription plansgetArchive a subscription planpost
VAT Codes
    List VAT codesget
Webhook Endpoints
    List webhook endpointsgetCreate a webhook endpointpostRetrieve a webhook endpointgetUpdate a webhook endpointputDelete a webhook endpointdeleteRoll the signing secretpostSend a test eventpost
Portal SSO
    Published RP signing keys (JWKS) for a tenant's private_key_jwt SSOgetMint a customer-portal SSO handoff referencepostProvision a customer + grant portal access (partner JIT provisioning)postRevoke (force-refresh) a user's customer-portal sessionspost
Credit Notes
    List credit notesgetCreate a credit notepostGet a credit note by IDgetGet the delivery status of a credit notegetDownload the credit note PDFgetSend a credit note to the customerpost
Payment Methods
    List saved payment methods for a customergetApply a payment method to all active subscriptions for a customerpostCancel 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
Draft Journal Entries
    Create multiple draft journal entries in batchpostList draft journal entriesgetCreate a draft journal entrypostGet a single draft journal entrygetDelete a draft journal entrydeleteBook a draft journal entrypost
Invoices
    List invoicesgetCreate a draft invoicepostGet an invoice by IDgetGet the delivery status of an invoicegetDownload the invoice PDFgetSend an invoice to the customerpost
Order Confirmations
    List order confirmationsgetCreate a draft order confirmationpostGet an order confirmation by idgetUpdate a draft order confirmationpatchConvert an order confirmation into an invoicepostDownload an order confirmation as PDFgetSend an order confirmationpost
Portal Plans
    List the full plan cataloguegetGet one plan by idgetResolve the gated pricing catalogue for an identified buyer (partner display)post
Quotes
    List quotesgetCreate a draft quotepostGet a quote by idgetUpdate a draft quotepatchConvert a quotepostDownload a quote as PDFgetSend a quotepost
Vendors
    List vendorsgetCreate a vendorpostList vendor contactsgetList vendor departmentsgetList vendor groupsget
Draft Journal Entries (v2)
    Create draft journal entries in batch (v2)postList draft journal entries (v2)getCreate a draft journal entry (v2)postGet a single draft journal entry (v2)getDelete a draft journal entry (v2)deleteUpdate a draft journal entry (v2)patchBook a draft journal entry (v2)post
Journal Entries (v2)
    Create a journal entry (v2)postCreate journal entries in batch (v2)post
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

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 dimension category ID (journal-tag category) that backs this project. Subproject values live as dimension values under this category.

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
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", "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

Idempotent project upsert

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

Error codes

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

Idempotent project upsert › 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

Idempotent project upsert › 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 dimension category ID (journal-tag category) that backs this project. Subproject values live as dimension values under this category.

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
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
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", "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

Error codes

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

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 dimension category ID (journal-tag category) that backs this project. Subproject values live as dimension values under this category.

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
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
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", "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

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 dimension category ID (journal-tag category) that backs this project. Subproject values live as dimension values under this category.

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
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", "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

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 › 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 dimension category ID (journal-tag category) that backs this project. Subproject values live as dimension values under this category.

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
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
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", "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

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

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 › 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
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

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 › 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
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

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 › 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

ProductsSubscriptions