Skip to content

Budgets API

All endpoints require authentication and budgets tool permissions.

GET /api/budgets

Query parameters:

ParamTypeDescription
resource_typestringFilter by resource type
resource_idstringFilter by resource ID
company_idstringFilter by company ID
statusstringFilter by status

Response: { budgets }

Each budget includes joined company_name, owner_name, computed line_item_count, spent_amount (sum of line item amounts), and logged_hours (sum of time entry hours).

GET /api/budgets/:id

Path parameters:

ParamTypeDescription
idstringBudget ID

Response: { budget, line_items, time_entries }

  • budget includes joined company_name and owner_name.
  • line_items includes service_type_name, task_title, computed logged_hours (approved time entries only), and invoiced_amount (from non-voided invoices). Ordered by position, then created_at.
  • time_entries includes user_name and task_title. Ordered by date descending.
POST /api/budgets

Requires update permission.

Body:

{
"name": "string (required)",
"resource_type": "string (required)",
"resource_id": "string (required)",
"po_number": "string",
"currency": "string (default: AUD)",
"status": "string (default: draft)",
"total_amount": "number",
"company_id": "string",
"notes": "string"
}

Response: 201 { budget }

Sets owner_id and created_by to the authenticated user. Logs a created history event.

PUT /api/budgets/:id

Requires update permission.

Path parameters:

ParamTypeDescription
idstringBudget ID

Body: Any subset of updatable fields:

FieldTypeDescription
namestringBudget name
po_numberstringPurchase order number
currencystringCurrency code
statusstringBudget status
total_amountnumberTotal budget amount
company_idstringAssociated company ID
owner_idstringBudget owner user ID
budget_typestringBudget type
forecast_datestringForecast date
created_atstringCreation timestamp
resource_typestringResource type
resource_idstringResource ID
notesstringNotes

At least one field must be provided.

Response: { budget }

Automatically sets updated_at. Logs status_changed when status is updated and updated for all other field changes.

DELETE /api/budgets/:id

Requires manage permission.

Path parameters:

ParamTypeDescription
idstringBudget ID

Response: { ok: true }

Logs a deleted history event before removing the record.


POST /api/budgets/:id/line-items

Requires update permission.

Path parameters:

ParamTypeDescription
idstringBudget ID

Body:

{
"description": "string (required)",
"quantity": "number (default: 1)",
"unit_price": "number (default: 0)",
"service_type_id": "string",
"task_id": "string",
"position": "number (default: 0)"
}

amount is computed automatically as quantity * unit_price.

Response: 201 { item }

Logs a line_item_added history event on the parent budget.

PUT /api/budgets/:id/line-items/reorder

Requires update permission.

Path parameters:

ParamTypeDescription
idstringBudget ID

Body:

{
"item_ids": ["string (required) - ordered array of line item IDs"]
}

Sets each item’s position to its index in the provided array. Uses a batched D1 operation for atomicity.

Response: { ok: true }

PUT /api/budgets/:id/line-items/:itemId

Requires update permission.

Path parameters:

ParamTypeDescription
idstringBudget ID
itemIdstringLine item ID

Body: Any subset of updatable fields:

FieldTypeDescription
service_type_idstringService type ID
descriptionstringLine item description
task_idstringLinked task ID
positionnumberSort position
quantitynumberQuantity
unit_pricenumberUnit price

amount is always recomputed as quantity * unit_price (using existing values for any field not provided).

Response: { item }

Logs a line_item_updated history event on the parent budget.

DELETE /api/budgets/:id/line-items/:itemId

Requires update permission.

Path parameters:

ParamTypeDescription
idstringBudget ID
itemIdstringLine item ID

Response: { ok: true }

Logs a line_item_removed history event on the parent budget.