API reference
Schedules
Payments and receipts spread over the months they pay for, each month's share taken in at its close.
- GET
/v1/schedulesList schedules - POST
/v1/schedulesSpread a transaction over the months it pays for - POST
/v1/schedules/accrualsAccrue a cost in the month it was used - GET
/v1/schedules/{schedule_id}Get a schedule month by month - PATCH
/v1/schedules/{schedule_id}Change a schedule's months, description or estimate - DELETE
/v1/schedules/{schedule_id}Delete a schedule no close has used - POST
/v1/schedules/{schedule_id}/pausePause a schedule so no close posts from it - POST
/v1/schedules/{schedule_id}/releaseRelease an accrual once its cost is in the books - POST
/v1/schedules/{schedule_id}/resumeResume a paused schedule
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
| Name | Type | Description |
|---|---|---|
kindQuery | string or null | Only schedules of this kind. revenue, prepaid, depreciation, accrual |
statusQuery | string or null | Only schedules in this state. active, complete, cancelled |
transaction_idQuery | string or null | An id that starts with |
pausedQuery | boolean or null |
|
limitQuery | integer | Page size, 1–200. |
cursorQuery | string or null | The |
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 "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
Response
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 -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
Response
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 -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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
Response
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 "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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
Request body
Response
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 -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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
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 -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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
Response
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 -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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
Request body
Response
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 -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
| Name | Type | Description |
|---|---|---|
schedule_idPath · Required | string | An id that starts with |
Response
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 -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
| Name | Type | Description |
|---|---|---|
dataRequired | array of ScheduleOut | |
has_moreRequired | boolean | |
next_cursorRequired | string or null |
SpreadIn
| Name | Type | Description |
|---|---|---|
description | string or null | What it is for; the transaction's description if left out. |
ends_onRequired | string (date) | The last day it pays for. |
method | string | How it is shared across months. daily, monthlyDefault monthly |
starts_onRequired | string (date) | The first day it pays for. |
transaction_idRequired | string | A transaction in the books, filed under one income or expense account. |
ScheduleDetailOut
| Name | Type | Description |
|---|---|---|
account_codeRequired | string | |
account_idRequired | string | The income or expense account it reaches month by month. |
account_nameRequired | string | |
counterparty_idRequired | string or null | An id that starts with |
counterparty_nameRequired | string or null | |
created_atRequired | string (date-time) | |
currencyRequired | string | |
descriptionRequired | string | |
dimensions | array 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. |
editableRequired | boolean | Whether it can be changed, paused or deleted here. A provider's follows its invoice. |
ends_onRequired | string (date) | |
holding_account_codeRequired | string | |
holding_account_idRequired | string | Where the part not yet used or earned waits: prepaid expenses, deferred revenue, accumulated depreciation; for an accrual, accrued liabilities. |
holding_account_nameRequired | string | |
idRequired | string | An id that starts with |
kindRequired | string |
revenue, prepaid, depreciation, accrual |
methodRequired | string |
daily, monthly |
monthsRequired | array of ScheduleMonthOut | Every month it covers, oldest first. |
paused_on | string (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. |
recognizedRequired | string | 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_idRequired | string or null | An id that starts with |
released_onRequired | string (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. |
remainingRequired | string | What is still to come: |
settles_from | string (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. |
sourceRequired | string | Who keeps it: |
starts_onRequired | string (date) | |
statusRequired | string |
active, complete, cancelled |
totalRequired | string | The whole amount spread; for an accrual, the estimate. |
transaction_idRequired | string or null | An id that starts with |
AccrueIn
| Name | Type | Description |
|---|---|---|
account_idRequired | string | The expense account the cost belongs to. |
amountRequired | number | string | The estimate, in the books' currency. |
counterparty_id | string or null | An id that starts with |
descriptionRequired | string | What the cost is, such as "AWS for September". |
dimensions | array 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 ( |
monthRequired | string (date) | Any day of the month the cost was used. That month's close posts it. |
ScheduleChange
Only what is sent changes.
| Name | Type | Description |
|---|---|---|
description | string or null | |
dimensions | array 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 |
ends_on | string (date) or null | An earlier day takes the rest in at the next close. |
method | string or null | One of daily, monthly |
starts_on | string (date) or null | |
total | number | string or null | An accrual's estimate. The next close posts the difference. |
ReleaseIn
| Name | Type | Description |
|---|---|---|
released_on | string (date) or null | With no charge, the day it stopped being owed (say, the bill was entered elsewhere). Today if left out. |
transaction_id | string or null | An id that starts with |
ScheduleOut
| Name | Type | Description |
|---|---|---|
account_codeRequired | string | |
account_idRequired | string | The income or expense account it reaches month by month. |
account_nameRequired | string | |
counterparty_idRequired | string or null | An id that starts with |
counterparty_nameRequired | string or null | |
created_atRequired | string (date-time) | |
currencyRequired | string | |
descriptionRequired | string | |
dimensions | array 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. |
editableRequired | boolean | Whether it can be changed, paused or deleted here. A provider's follows its invoice. |
ends_onRequired | string (date) | |
holding_account_codeRequired | string | |
holding_account_idRequired | string | Where the part not yet used or earned waits: prepaid expenses, deferred revenue, accumulated depreciation; for an accrual, accrued liabilities. |
holding_account_nameRequired | string | |
idRequired | string | An id that starts with |
kindRequired | string |
revenue, prepaid, depreciation, accrual |
methodRequired | string |
daily, monthly |
paused_on | string (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. |
recognizedRequired | string | 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_idRequired | string or null | An id that starts with |
released_onRequired | string (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. |
remainingRequired | string | What is still to come: |
settles_from | string (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. |
sourceRequired | string | Who keeps it: |
starts_onRequired | string (date) | |
statusRequired | string |
active, complete, cancelled |
totalRequired | string | The whole amount spread; for an accrual, the estimate. |
transaction_idRequired | string or null | An id that starts with |
LineDimensionOut
| Name | Type | Description |
|---|---|---|
dimension_idRequired | string | An id that starts with |
dimension_keyRequired | string | The dimension's key, e.g. |
dimension_nameRequired | string | |
value_codeRequired | string | |
value_idRequired | string | An id that starts with |
value_nameRequired | string |
ScheduleMonthOut
| Name | Type | Description |
|---|---|---|
amountRequired | string | What reaches the P&L in this month: used, or earned. |
ends_onRequired | string (date) | The month's last day. |
journal_entry_idRequired | string or null | An id that starts with |
recognized_onRequired | string (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
| Name | Type | Description |
|---|---|---|
dimension_idRequired | string | An id that starts with |
value_idRequired | string | A value of that dimension. |