Budgets
/v1/budget-categoriesList categories with their budget figures
Every expense category in one period, as the app's budgets page lists them: budgeted or not, with what was spent and what it usually costs. Inactive categories with no budget and no spending are left out.
Parameters
limit integer · query | Page size, 1–200. |
cursor string | null · query | The next_cursor of the previous page. |
period string | null · query | The period to measure. Defaults to the current one. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
purpose string | null · query | Count only personal or only business spending. Both by default. |
X-Organization-Id string | null · header |
Returns 200 · BudgetCategoryList
data | |
has_more boolean · required | |
next_cursor string | null · required |
curl -X GET "https://api.lumaledger.app/v1/budget-categories" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"/v1/budget-cycleGet the budget cycle
The cycle the ledger's budgets run on: the calendar month unless the household budgets by paycheck.
Parameters
X-Organization-Id string | null · header |
Returns 200 · BudgetCycle
anchor_date date · required | For monthly and semi_monthly, the day of the month a period starts on. For biweekly and weekly, a payday the periods count from. |
cadence string · required | monthly, semi_monthly (twice a month, 15 days apart), biweekly (every other week) or weekly. |
is_calendar_month boolean · required | The plain calendar month (monthly from the 1st). Period keys are then YYYY-MM; otherwise they are the period's first day. |
curl -X GET "https://api.lumaledger.app/v1/budget-cycle" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"/v1/budget-cycleSet the budget cycle
Choose the cycle every budget runs on: the calendar month, a monthly period starting on another day, twice a month, or every one or two weeks from a payday. Budgets keep their amounts; their start and their per-period amounts move to the periods the new cycle defines.
Parameters
X-Organization-Id string | null · header |
Body · BudgetCycleUpdate
anchor_date date · required | See BudgetCycle.anchor_date. |
cadence string · required | See BudgetCycle.cadence. Pattern: ^(monthly|semi_monthly|biweekly|weekly)$. |
Returns 200 · BudgetCycle
anchor_date date · required | For monthly and semi_monthly, the day of the month a period starts on. For biweekly and weekly, a payday the periods count from. |
cadence string · required | monthly, semi_monthly (twice a month, 15 days apart), biweekly (every other week) or weekly. |
is_calendar_month boolean · required | The plain calendar month (monthly from the 1st). Period keys are then YYYY-MM; otherwise they are the period's first day. |
curl -X PUT "https://api.lumaledger.app/v1/budget-cycle" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"anchor_date": "2026-09-01",
"cadence": "…"
}'/v1/budgetsList budgets
The ledger's budgets, each measured over one period (the current one
unless period says otherwise): allowed, carried over, spent and left
for a spending budget; planned and paid for a loan's extra payment.
Parameters
limit integer · query | Page size, 1–200. |
cursor string | null · query | The next_cursor of the previous page. |
period string | null · query | The period to measure. Defaults to the current one. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
purpose string | null · query | Count only personal or only business spending. Both by default. |
kind string | null · query | Only spend or only paydown budgets. |
X-Organization-Id string | null · header |
Returns 200 · BudgetList
data | |
has_more boolean · required | |
next_cursor string | null · required |
curl -X GET "https://api.lumaledger.app/v1/budgets" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"/v1/budgetsCreate a budget
Budget a category: an amount per period (or per year), optionally
rolling over. With kind: paydown, plan extra principal on a loan
instead. A category has at most one budget: change an existing one with
budgets.update.
Parameters
Idempotency-Key string | null · header | Any unique string (a UUID is ideal). A retry with the same key returns the first attempt's response instead of doing the work twice. Keys are kept for 24 hours. |
X-Organization-Id string | null · header |
Body · BudgetCreate
account_id integer · required | An expense category (accounts.list?type=expense) or, with kind: paydown, a confirmed loan's liability account. |
amount string · required | Decimal string, at most two decimal places. Per period, or per calendar year when frequency is annual. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
frequency string | monthly (per budget period) or annual (per calendar year; spend only). Pattern: ^(monthly|annual)$. Default: "monthly". |
kind string | spend or paydown. Pattern: ^(spend|paydown)$. Default: "spend". |
rollover boolean | Carry what is left (or owed) into the next period. Monthly only. Default: false. |
start_period string | null | The period the plan starts in; the current one if omitted. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
Returns 201 · BudgetOut
account_id integer · required | The expense category (see accounts.list?type=expense) or, for a paydown budget, the loan's liability account. |
amount Money · required | The default amount per period, or per year when annual. |
created_at datetime · required | |
frequency string · required | monthly: amount is per budget period. annual: amount is per calendar year. |
id integer · required | The budget id. |
kind string · required | spend (a spending plan) or paydown (extra principal on a loan). |
paydown | For a paydown budget whose loan is still confirmed; null otherwise. |
period string · required | The period spending or paydown is measured over. |
period_amounts | Periods that have their own amount instead of the default. |
rollover boolean · required | What is not spent carries into the next period, and an overspend is owed by it. |
spending | For a spend budget; null otherwise. |
start_period string · required | The period the plan starts in. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
updated_at datetime · required |
curl -X POST "https://api.lumaledger.app/v1/budgets" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"account_id": 1,
"amount": "450.00"
}'/v1/budgets/{budget_id}Delete a budget
Remove a budget and its per-period amounts. The spending it measured stays in the ledger.
Parameters
budget_id integer · path · required | |
X-Organization-Id string | null · header |
Returns 204 with no body.
curl -X DELETE "https://api.lumaledger.app/v1/budgets/{budget_id}" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"/v1/budgets/{budget_id}Get a budget
One budget by its id, measured over period (the current one by default).
Parameters
budget_id integer · path · required | |
period string | null · query | The period to measure. Defaults to the current one. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
purpose string | null · query | Count only personal or only business spending. Both by default. |
X-Organization-Id string | null · header |
Returns 200 · BudgetOut
account_id integer · required | The expense category (see accounts.list?type=expense) or, for a paydown budget, the loan's liability account. |
amount Money · required | The default amount per period, or per year when annual. |
created_at datetime · required | |
frequency string · required | monthly: amount is per budget period. annual: amount is per calendar year. |
id integer · required | The budget id. |
kind string · required | spend (a spending plan) or paydown (extra principal on a loan). |
paydown | For a paydown budget whose loan is still confirmed; null otherwise. |
period string · required | The period spending or paydown is measured over. |
period_amounts | Periods that have their own amount instead of the default. |
rollover boolean · required | What is not spent carries into the next period, and an overspend is owed by it. |
spending | For a spend budget; null otherwise. |
start_period string · required | The period the plan starts in. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
updated_at datetime · required |
curl -X GET "https://api.lumaledger.app/v1/budgets/{budget_id}" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"/v1/budgets/{budget_id}Update a budget
Change a budget's amount, frequency, rollover or start. Only the
fields sent change. Making a budget annual drops its per-period
amounts.
Parameters
budget_id integer · path · required | |
X-Organization-Id string | null · header |
Body · BudgetUpdate
amount string | null | See BudgetCreate.amount. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
frequency string | null | Pattern: ^(monthly|annual)$. |
rollover boolean | null | |
start_period string | null | A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
Returns 200 · BudgetOut
account_id integer · required | The expense category (see accounts.list?type=expense) or, for a paydown budget, the loan's liability account. |
amount Money · required | The default amount per period, or per year when annual. |
created_at datetime · required | |
frequency string · required | monthly: amount is per budget period. annual: amount is per calendar year. |
id integer · required | The budget id. |
kind string · required | spend (a spending plan) or paydown (extra principal on a loan). |
paydown | For a paydown budget whose loan is still confirmed; null otherwise. |
period string · required | The period spending or paydown is measured over. |
period_amounts | Periods that have their own amount instead of the default. |
rollover boolean · required | What is not spent carries into the next period, and an overspend is owed by it. |
spending | For a spend budget; null otherwise. |
start_period string · required | The period the plan starts in. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
updated_at datetime · required |
curl -X PATCH "https://api.lumaledger.app/v1/budgets/{budget_id}" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'/v1/budgets/{budget_id}/period-amountSet one period's amount
Give one period of a monthly budget its own amount ("December is 600, not 200"), including a period that has not started; null returns it to the default. Answers with the budget measured over that period.
Parameters
budget_id integer · path · required | |
X-Organization-Id string | null · header |
Body · PeriodAmountUpdate
amount string | null · required | That period's own amount, or null to return it to the budget's default. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
period string · required | The period to plan. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
Returns 200 · BudgetOut
account_id integer · required | The expense category (see accounts.list?type=expense) or, for a paydown budget, the loan's liability account. |
amount Money · required | The default amount per period, or per year when annual. |
created_at datetime · required | |
frequency string · required | monthly: amount is per budget period. annual: amount is per calendar year. |
id integer · required | The budget id. |
kind string · required | spend (a spending plan) or paydown (extra principal on a loan). |
paydown | For a paydown budget whose loan is still confirmed; null otherwise. |
period string · required | The period spending or paydown is measured over. |
period_amounts | Periods that have their own amount instead of the default. |
rollover boolean · required | What is not spent carries into the next period, and an overspend is owed by it. |
spending | For a spend budget; null otherwise. |
start_period string · required | The period the plan starts in. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
updated_at datetime · required |
curl -X PUT "https://api.lumaledger.app/v1/budgets/{budget_id}/period-amount" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amount": "600.00",
"period": "…"
}'/v1/budgets/fillFill budgets in one step
The app's one-click fills: budget every category at what it usually
costs, or carry last period's amounts into this one. At most 100
budgets are written. Send dry_run: true first to see the list.
Parameters
Idempotency-Key string | null · header | Any unique string (a UUID is ideal). A retry with the same key returns the first attempt's response instead of doing the work twice. Keys are kept for 24 hours. |
X-Organization-Id string | null · header |
Body · BudgetFill
dry_run boolean | List what would be written and write nothing. Default: false. |
only_unbudgeted boolean | usual only: leave categories that already have a budget alone. Default: true. |
period string | null | The period to fill; the current one if omitted. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
source string | usual: budget every top-level category at what it usually costs (its three-period average, whole units). last_period: give every monthly budget this period the amount last period allowed, where they differ. Pattern: ^(usual|last_period)$. Default: "usual". |
Returns 200 · BudgetFillResult
applied boolean · required | False on a dry run. |
items | |
period string · required | The period filled. |
source string · required |
curl -X POST "https://api.lumaledger.app/v1/budgets/fill" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'/v1/budgets/summarySummarize a budget period
The totals of one budget period: what the spending budgets allowed,
carried, spent and have left, and what was spent outside any budget.
Per budget, see budgets.list; per category, budget_categories.list.
Parameters
period string | null · query | The period to measure. Defaults to the current one. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
purpose string | null · query | Count only personal or only business spending. Both by default. |
X-Organization-Id string | null · header |
Returns 200 · BudgetSummary
cycle BudgetCycle · required | |
is_future boolean · required | The period has not started: nothing is spent yet, and carried counts only the periods that have finished. |
next_period string · required | The next period's key. |
period BudgetPeriod · required | |
previous_period string · required | The previous period's key. |
totals BudgetTotals · required | |
unbudgeted_spent Money · required | Spent this period in categories with no budget. |
curl -X GET "https://api.lumaledger.app/v1/budgets/summary" \
-H "Authorization: Bearer $LUMALEDGER_TOKEN"Objects
BudgetCategory
One expense category in one period: its budget, if any, beside what the ledger says was spent. Categories without a budget are listed too, with what they usually cost, which is what the app suggests when setting one.
Fields
account_id integer · required | The expense category's account id. |
available Money · required | |
average Money · required | Mean spend per period over the last three complete periods. |
budget_id integer | null · required | Its budget (see budgets.get), or null. |
budgeted Money · required | What the budget allows over the span measured; zero with no budget. |
carried | Rolled in from earlier periods; null unless the budget rolls over. |
code string · required | |
name string · required | |
parent_account_id integer | null · required | The category this is a subcategory of. A budget on the parent covers its subcategories. |
period_spent Money · required | Spent in this period alone. |
remaining Money · required | |
spent Money · required | Spent over the span budgeted covers, subcategories included. |
BudgetCategoryList
A page of expense categories, by account id.
Fields
data | |
has_more boolean · required | |
next_cursor string | null · required |
BudgetCreate
A new budget on a category, or an extra-payment plan on a loan.
Fields
account_id integer · required | An expense category (accounts.list?type=expense) or, with kind: paydown, a confirmed loan's liability account. |
amount string · required | Decimal string, at most two decimal places. Per period, or per calendar year when frequency is annual. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
frequency string | monthly (per budget period) or annual (per calendar year; spend only). Pattern: ^(monthly|annual)$. Default: "monthly". |
kind string | spend or paydown. Pattern: ^(spend|paydown)$. Default: "spend". |
rollover boolean | Carry what is left (or owed) into the next period. Monthly only. Default: false. |
start_period string | null | The period the plan starts in; the current one if omitted. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
BudgetCycle
The periods every budget is measured over.
Fields
anchor_date date · required | For monthly and semi_monthly, the day of the month a period starts on. For biweekly and weekly, a payday the periods count from. |
cadence string · required | monthly, semi_monthly (twice a month, 15 days apart), biweekly (every other week) or weekly. |
is_calendar_month boolean · required | The plain calendar month (monthly from the 1st). Period keys are then YYYY-MM; otherwise they are the period's first day. |
BudgetCycleUpdate
Fields
anchor_date date · required | See BudgetCycle.anchor_date. |
cadence string · required | See BudgetCycle.cadence. Pattern: ^(monthly|semi_monthly|biweekly|weekly)$. |
BudgetFill
Fill several budgets in one step.
Fields
dry_run boolean | List what would be written and write nothing. Default: false. |
only_unbudgeted boolean | usual only: leave categories that already have a budget alone. Default: true. |
period string | null | The period to fill; the current one if omitted. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
source string | usual: budget every top-level category at what it usually costs (its three-period average, whole units). last_period: give every monthly budget this period the amount last period allowed, where they differ. Pattern: ^(usual|last_period)$. Default: "usual". |
BudgetFillItem
BudgetFillResult
Fields
applied boolean · required | False on a dry run. |
items | |
period string · required | The period filled. |
source string · required |
BudgetList
A page of budgets, by id.
Fields
data | |
has_more boolean · required | |
next_cursor string | null · required |
BudgetOut
A budget: the plan for one category (or, for paydown, extra
principal on one loan), and how it stands in the period asked about.
Fields
account_id integer · required | The expense category (see accounts.list?type=expense) or, for a paydown budget, the loan's liability account. |
amount Money · required | The default amount per period, or per year when annual. |
created_at datetime · required | |
frequency string · required | monthly: amount is per budget period. annual: amount is per calendar year. |
id integer · required | The budget id. |
kind string · required | spend (a spending plan) or paydown (extra principal on a loan). |
paydown | For a paydown budget whose loan is still confirmed; null otherwise. |
period string · required | The period spending or paydown is measured over. |
period_amounts | Periods that have their own amount instead of the default. |
rollover boolean · required | What is not spent carries into the next period, and an overspend is owed by it. |
spending | For a spend budget; null otherwise. |
start_period string · required | The period the plan starts in. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
updated_at datetime · required |
BudgetPeriod
Fields
end date · required | Inclusive. |
key string · required | A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
start date · required |
BudgetPeriodAmount
Fields
amount Money · required | |
period string · required | A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. |
BudgetSummary
One period of the ledger's budgets, in total.
Fields
cycle BudgetCycle · required | |
is_future boolean · required | The period has not started: nothing is spent yet, and carried counts only the periods that have finished. |
next_period string · required | The next period's key. |
period BudgetPeriod · required | |
previous_period string · required | The previous period's key. |
totals BudgetTotals · required | |
unbudgeted_spent Money · required | Spent this period in categories with no budget. |
BudgetTotals
Over the per-period (monthly) spending budgets only: an annual
amount is not one period's money.
BudgetUpdate
Only the fields sent change.
Fields
amount string | null | See BudgetCreate.amount. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
frequency string | null | Pattern: ^(monthly|annual)$. |
rollover boolean | null | |
start_period string | null | A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
Money
An amount and its currency. `amount` is a base-10 string with two
decimal places and an optional leading minus sign. Parse it with a
decimal type, not a float.
Fields
amount string · required | Pattern: ^-?\d+\.\d{2}$. |
currency string · required | ISO 4217 code. Pattern: ^[A-Z]{3}$. |
PaydownStatus
An extra-payment plan on a loan, measured over one period.
Fields
extra_paid Money · required | paid_down beyond scheduled_principal, never below zero. |
loan_id integer · required | |
paid_down Money · required | Everything paid to the loan's principal in the period. |
planned Money · required | The extra principal planned for the period. |
remaining Money · required | planned − extra_paid. |
scheduled_principal Money · required | What the scheduled payment alone puts to principal in a period. |
PeriodAmountUpdate
Fields
amount string | null · required | That period's own amount, or null to return it to the budget's default. Pattern: ^\d{1,12}(\.\d{1,2})?$. |
period string · required | The period to plan. A budget period key: YYYY-MM while the ledger budgets by calendar month, otherwise the ISO date (YYYY-MM-DD) of the period's first day. As input either form is accepted, and any day names the period it falls in. Pattern: ^\d{4}-\d{2}(-\d{2})?$. |
SpendingStatus
A spending budget measured over one period.
Fields
available Money · required | budgeted + carried. |
average Money · required | Mean spend per period over the last three complete periods. |
budgeted Money · required | What the plan allows over the span measured: the period, or the calendar year for an annual budget. |
carried | Rolled in from earlier periods (negative: an overspend being repaid). Null unless the budget rolls over. |
period_spent Money · required | Spent in this period alone. |
remaining Money · required | available − spent. Negative is over budget. |
spent Money · required | Spent over the same span as budgeted, subcategories included. |