Skip to main content
A Budget is a named plan of an Entity’s results, month by month, such as “Presupuesto 2027” or “Escenario optimista”. An Entity can hold as many Budgets as it wants, and none is the default. Budget names are unique within the Entity. A Budget plans only Result Accounts: income, cost_of_goods_sold, operating_expense, other_income, and other_expense. Each planned amount is one Result Account in one calendar month. A month with no amount plans nothing. A Budget is planning data, not part of the books. It posts no entries and belongs to no Book. To compare the actual results against a Budget, pass its id as budgetId to the income statement.

Planned amounts

Every planned amount follows these rules:
  • month is the first day of a calendar month, for example 2027-03-01.
  • amount is an integer in the minor unit of the Entity’s functional currency. CLP has no decimals, so 5000000 is $5.000.000.
  • amount reads on the account’s normal side, as the income statement shows it. A planned income is positive, and a planned cost or expense is positive too. A negative amount plans the opposite, such as an expected refund on an income account.
While a Budget plans an account, the account’s type cannot change (LEDGER_ACCOUNT_FACT_PINNED_ERROR). Deleting a Budget deletes all its amounts. Deleting an account, which is possible only while it has no entries, removes its amounts from every Budget.

GET /api/entities/:entityId/budgets

List the Budgets of an Entity, ordered by name.
  • Path param: entityId (UUID)
  • Success response: array of Budget objects
  • Status: 200

POST /api/entities/:entityId/budgets

Create a Budget. It starts with no amounts.
  • Path param: entityId (UUID)
  • Body:
  • Success response: the created Budget (same shape as the list response)
  • Status: 201

GET /api/entities/:entityId/budgets/:budgetId

Read the whole plan of one Budget. The response lists every Result Account of the Entity, in code order, including accounts the Budget doesn’t plan yet. Use it to find the account ids to plan.
  • Path params: entityId (UUID), budgetId (UUID)
  • Success response: the Budget fields from the list response, plus accounts
  • Status: 200
Each item in accounts:

PATCH /api/entities/:entityId/budgets/:budgetId

Rename a Budget.
  • Path params: entityId (UUID), budgetId (UUID)
  • Body:
  • Success response: the updated Budget (same shape as the list response)
  • Status: 200

DELETE /api/entities/:entityId/budgets/:budgetId

Delete a Budget and all its amounts.
  • Path params: entityId (UUID), budgetId (UUID)
  • Success response: the deleted Budget (same shape as the list response)
  • Status: 200

PUT /api/entities/:entityId/budgets/:budgetId/amounts

Set or clear planned amounts. Each cell names one account and one month. The write is all or nothing: if any cell is refused, no cell changes. A cell you don’t send keeps its amount. To plan the same amount every month of a year, send twelve cells for the account.
  • Path params: entityId (UUID), budgetId (UUID)
  • Body:
Each item in cells:
  • Success response: the whole plan, in the same shape as GET /api/entities/:entityId/budgets/:budgetId. A cleared month no longer appears in amounts.
  • Status: 200
To load more than 2000 cells, split the load into several calls of whole accounts.

Compare the income statement against a Budget

Pass budgetId to GET /reports/income-statement. Each account then carries the months the Budget plans for it in budgetAmounts, next to its actual monthly amounts. For example, to compare the actual results of 2027 against a Budget:

Domain error codes

Status codes