Developers
API reference

Budgets

get/v1/budget-categories

List categories with their budget figures

budget_categories.listread tokenidempotent

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
array of BudgetCategory · required
has_more
boolean · required
next_cursor
string | null · required
Example
curl -X GET "https://api.lumaledger.app/v1/budget-categories" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN"
get/v1/budget-cycle

Get the budget cycle

budget_cycle.getread tokenidempotent

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.
Example
curl -X GET "https://api.lumaledger.app/v1/budget-cycle" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN"
put/v1/budget-cycle

Set the budget cycle

budget_cycle.updatewrite tokenidempotent

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.
Example
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": "…"
  }'
get/v1/budgets

List budgets

budgets.listread tokenidempotent

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
array of BudgetOut · required
has_more
boolean · required
next_cursor
string | null · required
Example
curl -X GET "https://api.lumaledger.app/v1/budgets" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN"
post/v1/budgets

Create a budget

budgets.createwrite tokenidempotent

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
PaydownStatus | null · required
For a paydown budget whose loan is still confirmed; null otherwise.
period
string · required
The period spending or paydown is measured over.
period_amounts
array of BudgetPeriodAmount · required
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
SpendingStatus | null · required
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
Example
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"
  }'
delete/v1/budgets/{budget_id}

Delete a budget

budgets.deletewrite tokendestructiveidempotent

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.

Example
curl -X DELETE "https://api.lumaledger.app/v1/budgets/{budget_id}" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN"
get/v1/budgets/{budget_id}

Get a budget

budgets.getread tokenidempotent

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
PaydownStatus | null · required
For a paydown budget whose loan is still confirmed; null otherwise.
period
string · required
The period spending or paydown is measured over.
period_amounts
array of BudgetPeriodAmount · required
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
SpendingStatus | null · required
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
Example
curl -X GET "https://api.lumaledger.app/v1/budgets/{budget_id}" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN"
patch/v1/budgets/{budget_id}

Update a budget

budgets.updatewrite tokenidempotent

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
PaydownStatus | null · required
For a paydown budget whose loan is still confirmed; null otherwise.
period
string · required
The period spending or paydown is measured over.
period_amounts
array of BudgetPeriodAmount · required
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
SpendingStatus | null · required
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
Example
curl -X PATCH "https://api.lumaledger.app/v1/budgets/{budget_id}" \
  -H "Authorization: Bearer $LUMALEDGER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
put/v1/budgets/{budget_id}/period-amount

Set one period's amount

budgets.set_period_amountwrite tokenidempotent

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
PaydownStatus | null · required
For a paydown budget whose loan is still confirmed; null otherwise.
period
string · required
The period spending or paydown is measured over.
period_amounts
array of BudgetPeriodAmount · required
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
SpendingStatus | null · required
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
Example
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": "…"
  }'
post/v1/budgets/fill

Fill budgets in one step

budgets.fillwrite tokenidempotent

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
array of BudgetFillItem · required
period
string · required
The period filled.
source
string · required
Example
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 '{}'
get/v1/budgets/summary

Summarize a budget period

budgets.summaryread tokenidempotent

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.
Example
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
Money | null · required
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
array of BudgetCategory · required
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

Fields

account_id
integer · required
The expense category.
amount
Money · required
What the fill writes for the period.
current
Money | null · required
What the period allowed before; null with no budget.
name
string · required

BudgetFillResult

Fields

applied
boolean · required
False on a dry run.
items
array of BudgetFillItem · required
period
string · required
The period filled.
source
string · required

BudgetList

A page of budgets, by id.

Fields

data
array of BudgetOut · required
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
PaydownStatus | null · required
For a paydown budget whose loan is still confirmed; null otherwise.
period
string · required
The period spending or paydown is measured over.
period_amounts
array of BudgetPeriodAmount · required
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
SpendingStatus | null · required
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.

Fields

available
Money · required
budgeted + carried.
budgeted
Money · required
carried
Money · required
Rolled in from earlier periods; negative is an overspend being repaid.
remaining
Money · required
available − spent. Negative is over budget.
spent
Money · required

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
Money | null · required
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.