API reference

Schedules

Payments and receipts spread over the months they pay for, each month's share taken in at its close.

Guides: Spread a payment over the months it pays for

List schedules

GET/v1/schedules

client.schedules.list()

Schedules in these books, the newest first: payments spread over the months they pay for, revenue earned over the months it covers, and depreciation.

Parameters

NameTypeDescription
kindQuerystring or null

Only schedules of this kind.

One of revenue, prepaid, depreciation, accrual
statusQuerystring or null

Only schedules in this state.

One of active, complete, cancelled
transaction_idQuerystring or null

An id that starts with txn_.

pausedQueryboolean or null

true: only paused schedules. false: only ones not paused.

limitQueryinteger

Page size, 1–200.

Default 50
cursorQuerystring or null

The next_cursor of the previous page.

Response

200SchedulePage

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl "https://api.ledgerit.ai/v1/schedules" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN"

Spread a transaction over the months it pays for

POST/v1/schedules· Idempotent

client.schedules.create()

Spread a transaction over the months it pays for.

Money out (a year of software, an insurance premium) is used month by month; money in (an annual contract paid by wire) is earned month by month. The transaction stays filed where it is. Nothing posts now: each close keeps the part not yet used or earned in prepaid expenses or deferred revenue, and lets it into the P&L month by month. A month already closed is caught up at the next close.

Refused with not_spreadable for a transaction not in the books, split across accounts, or not an expense or income; with already_spread when it has a schedule.

Request body

SpreadIn

Response

201ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X POST "https://api.ledgerit.ai/v1/schedules" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"ends_on":"2026-09-30","starts_on":"2026-09-30","transaction_id":"…"}'

Accrue a cost in the month it was used

POST/v1/schedules/accruals· Idempotent

client.schedules.accrue()

Accrue a cost in the month it was used, before it is paid: September's AWS, charged in October, or a contractor who invoices after the month.

The close of that month debits the expense and credits accrued liabilities with the estimate. The close of the month the cost reaches the books takes the estimate back out, beside the charge, so that month carries only the difference. With a counterparty, the close finds the charge itself: the first expense from them filed to the same account after the month. Without one, release it when the bill is paid.

Name the department the cost belongs to in dimensions: the cost and its release both carry it. Refused with not_accruable for an account that is not an open expense, a month already closed, or books with no accrued liabilities account; with dimension_required when the account requires a department and none is named.

Request body

AccrueIn

Response

201ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X POST "https://api.ledgerit.ai/v1/schedules/accruals" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"account_id":"…","amount":0,"description":"…","month":"2026-09-30"}'

Get a schedule month by month

GET/v1/schedules/{schedule_id}

client.schedules.get()

A schedule with every month it covers: what reaches the P&L in each, and the close entry that took it in.

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Response

200ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl "https://api.ledgerit.ai/v1/schedules/{schedule_id}" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN"

Change a schedule's months, description or estimate

PATCH/v1/schedules/{schedule_id}· Idempotent

client.schedules.update()

Change what a schedule is for, the months it covers, or how it shares them, an accrual's estimate, or the department its close entries carry. What the closes already posted stays; the next close posts the difference. Refused with schedule_not_editable for one a provider keeps, and with accrual_released for an accrual released. Its department changes until a close has posted from it (schedule_in_use after).

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Request body

ScheduleChange

Response

200ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X PATCH "https://api.ledgerit.ai/v1/schedules/{schedule_id}" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'

Delete a schedule no close has used

DELETE/v1/schedules/{schedule_id}· Idempotent

client.schedules.delete()

Delete a schedule no close has posted from: the transaction it spread counts in full in its own month again. Refused with schedule_in_use once a close has posted from it; shorten it instead.

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Response

204No content

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X DELETE "https://api.ledgerit.ai/v1/schedules/{schedule_id}" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Pause a schedule so no close posts from it

POST/v1/schedules/{schedule_id}/pause

client.schedules.pause()

Pause a schedule: no close posts from it until it is resumed, and what it has already moved stays in the books. Pausing one already paused changes nothing. Refused with schedule_not_editable for one a provider keeps, and with schedule_not_running for one that finished or was cancelled.

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Response

200ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X POST "https://api.ledgerit.ai/v1/schedules/{schedule_id}/pause" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN"

Release an accrual once its cost is in the books

POST/v1/schedules/{schedule_id}/release· Idempotent

client.schedules.release()

Say an accrual's cost is in the books: name the charge that paid it, or, with none, the day it stopped being owed. The close of that month takes the estimate back out. Refused with not_accruable for a schedule that is not an accrual or a charge that is not its cost, and with accrual_released for one already released.

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Request body

ReleaseIn

Response

200ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X POST "https://api.ledgerit.ai/v1/schedules/{schedule_id}/release" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'

Resume a paused schedule

POST/v1/schedules/{schedule_id}/resume

client.schedules.resume()

Resume a paused schedule. Its months stay as they were, so the next close catches up every month it was paused; to push them later instead, change its months. Resuming one that runs changes nothing.

Parameters

NameTypeDescription
schedule_idPath · Requiredstring

An id that starts with sched_.

Response

200ScheduleDetailOut

Errors

400
The request was malformed or a parameter is invalid.
401
No valid credential was sent.
403
The credential or the member's role does not allow this.
404
No such resource in this ledger.
409
A conflicting request, e.g. one with the same Idempotency-Key still running.
422
A well-formed request a business rule refused.
429
Too many requests; retry after the Retry-After header.
500
Something failed on our side; the request_id identifies it.

Example

curl
curl -X POST "https://api.ledgerit.ai/v1/schedules/{schedule_id}/resume" \
  -H "Authorization: Bearer $LEDGERIT_TOKEN"

Objects

The objects these operations take and return.

SchedulePage

NameTypeDescription
dataRequiredarray of ScheduleOut
has_moreRequiredboolean
next_cursorRequiredstring or null

SpreadIn

NameTypeDescription
descriptionstring or null

What it is for; the transaction's description if left out.

ends_onRequiredstring (date)

The last day it pays for.

methodstring

How it is shared across months.

One of daily, monthlyDefault monthly
starts_onRequiredstring (date)

The first day it pays for.

transaction_idRequiredstring

A transaction in the books, filed under one income or expense account.

ScheduleDetailOut

NameTypeDescription
account_codeRequiredstring
account_idRequiredstring

The income or expense account it reaches month by month.

account_nameRequiredstring
counterparty_idRequiredstring or null

An id that starts with party_.

counterparty_nameRequiredstring or null
created_atRequiredstring (date-time)
currencyRequiredstring
descriptionRequiredstring
dimensionsarray of LineDimensionOut

The department, and the value of any other dimension, carried on both lines of every entry a close posts from it, an accrual's release included. A spread schedule's are its transaction's.

editableRequiredboolean

Whether it can be changed, paused or deleted here. A provider's follows its invoice.

ends_onRequiredstring (date)
holding_account_codeRequiredstring
holding_account_idRequiredstring

Where the part not yet used or earned waits: prepaid expenses, deferred revenue, accumulated depreciation; for an accrual, accrued liabilities.

holding_account_nameRequiredstring
idRequiredstring

An id that starts with sched_.

kindRequiredstring

prepaid: paid for something used over months. revenue: received for something earned over months. depreciation: equipment used up over years. accrual: a cost used in one month and paid in a later one.

One of revenue, prepaid, depreciation, accrual
methodRequiredstring

monthly: the same share each calendar month. daily: by the days of each month it covers.

One of daily, monthly
monthsRequiredarray of ScheduleMonthOut

Every month it covers, oldest first.

paused_onstring (date) or null

The day a person paused it; null while it runs. No close posts from a paused schedule. Resumed, the next close catches up the months it skipped.

recognizedRequiredstring

What the closes have taken into the P&L so far. For an accrual, what waits in accrued liabilities: the estimate once its month's close has posted, nothing once it is released.

release_transaction_idRequiredstring or null

An id that starts with txn_.

released_onRequiredstring (date) or null

An accrual: the day its cost reached the books, or stopped being owed. The close of that month takes the estimate back out. Null while it waits.

remainingRequiredstring

What is still to come: total less recognized.

settles_fromstring (date) or null

An accrual: the first day a charge from its vendor, filed to its account, settles it. The day after its month for a cost billed later; its month's first day for one approved from the books' daily check, standing in for a charge the month has not had yet. Null for other schedules.

sourceRequiredstring

Who keeps it: transaction (a person spread one), manual, or the provider whose invoice it follows, such as stripe.

starts_onRequiredstring (date)
statusRequiredstring

active while it has something to move, complete once it has moved everything, cancelled when stopped early.

One of active, complete, cancelled
totalRequiredstring

The whole amount spread; for an accrual, the estimate.

transaction_idRequiredstring or null

An id that starts with txn_.

AccrueIn

NameTypeDescription
account_idRequiredstring

The expense account the cost belongs to.

amountRequirednumber | string

The estimate, in the books' currency.

counterparty_idstring or null

An id that starts with party_.

descriptionRequiredstring

What the cost is, such as "AWS for September".

dimensionsarray of LineDimensionIn

The department, and the value of any other dimension, the cost and its release carry, at most one per dimension. Required when the account requires one (dimension_required); refused with dimension_invalid when a value is not of the dimension named.

monthRequiredstring (date)

Any day of the month the cost was used. That month's close posts it.

ScheduleChange

Only what is sent changes.

NameTypeDescription
descriptionstring or null
dimensionsarray of LineDimensionIn or null

Exactly the values its close entries are to carry, at most one per dimension; an empty list names none. Refused with schedule_in_use once a close has posted from it, and with schedule_not_editable for a spread schedule, which carries its transaction's.

ends_onstring (date) or null

An earlier day takes the rest in at the next close.

methodstring or nullOne of daily, monthly
starts_onstring (date) or null
totalnumber | string or null

An accrual's estimate. The next close posts the difference.

ReleaseIn

NameTypeDescription
released_onstring (date) or null

With no charge, the day it stopped being owed (say, the bill was entered elsewhere). Today if left out.

transaction_idstring or null

An id that starts with txn_.

ScheduleOut

NameTypeDescription
account_codeRequiredstring
account_idRequiredstring

The income or expense account it reaches month by month.

account_nameRequiredstring
counterparty_idRequiredstring or null

An id that starts with party_.

counterparty_nameRequiredstring or null
created_atRequiredstring (date-time)
currencyRequiredstring
descriptionRequiredstring
dimensionsarray of LineDimensionOut

The department, and the value of any other dimension, carried on both lines of every entry a close posts from it, an accrual's release included. A spread schedule's are its transaction's.

editableRequiredboolean

Whether it can be changed, paused or deleted here. A provider's follows its invoice.

ends_onRequiredstring (date)
holding_account_codeRequiredstring
holding_account_idRequiredstring

Where the part not yet used or earned waits: prepaid expenses, deferred revenue, accumulated depreciation; for an accrual, accrued liabilities.

holding_account_nameRequiredstring
idRequiredstring

An id that starts with sched_.

kindRequiredstring

prepaid: paid for something used over months. revenue: received for something earned over months. depreciation: equipment used up over years. accrual: a cost used in one month and paid in a later one.

One of revenue, prepaid, depreciation, accrual
methodRequiredstring

monthly: the same share each calendar month. daily: by the days of each month it covers.

One of daily, monthly
paused_onstring (date) or null

The day a person paused it; null while it runs. No close posts from a paused schedule. Resumed, the next close catches up the months it skipped.

recognizedRequiredstring

What the closes have taken into the P&L so far. For an accrual, what waits in accrued liabilities: the estimate once its month's close has posted, nothing once it is released.

release_transaction_idRequiredstring or null

An id that starts with txn_.

released_onRequiredstring (date) or null

An accrual: the day its cost reached the books, or stopped being owed. The close of that month takes the estimate back out. Null while it waits.

remainingRequiredstring

What is still to come: total less recognized.

settles_fromstring (date) or null

An accrual: the first day a charge from its vendor, filed to its account, settles it. The day after its month for a cost billed later; its month's first day for one approved from the books' daily check, standing in for a charge the month has not had yet. Null for other schedules.

sourceRequiredstring

Who keeps it: transaction (a person spread one), manual, or the provider whose invoice it follows, such as stripe.

starts_onRequiredstring (date)
statusRequiredstring

active while it has something to move, complete once it has moved everything, cancelled when stopped early.

One of active, complete, cancelled
totalRequiredstring

The whole amount spread; for an accrual, the estimate.

transaction_idRequiredstring or null

An id that starts with txn_.

LineDimensionOut

NameTypeDescription
dimension_idRequiredstring

An id that starts with dim_.

dimension_keyRequiredstring

The dimension's key, e.g. department.

dimension_nameRequiredstring
value_codeRequiredstring
value_idRequiredstring

An id that starts with dimv_.

value_nameRequiredstring

ScheduleMonthOut

NameTypeDescription
amountRequiredstring

What reaches the P&L in this month: used, or earned.

ends_onRequiredstring (date)

The month's last day.

journal_entry_idRequiredstring or null

An id that starts with je_.

recognized_onRequiredstring (date) or null

The last day of the month whose close took it in: a later month when it was spread after its own month closed.

LineDimensionIn

NameTypeDescription
dimension_idRequiredstring

An id that starts with dim_.

value_idRequiredstring

A value of that dimension.