Reconciliation breaks
A reconciliation break is one day on which the platform's calculated position and the bank's reported position disagree, for a cash account (its balance), a custody account's asset (its quantity) or a contract (its amount). Breaks are computed as the legacy platform computes them: each subject is compared on each banking day of its custodian with the tolerances and frequency of its reconciliation settings, and a day without a bank point is compared with the newest points there are. A break keeps its id while it stands; when the figures agree again an open break goes away (one that has notes is closed as resolved instead), while a resolved or waived one stays. Reads need custody:read, writes custody:write. Every write answers 200 with the break, takes ?dry_run=true and an Idempotency-Key header, and is logged in the change history.
Rejected bank rows and rejected transactions are not breaks; they are import issues.
Data model
idstringStable identifier of the break: the same subject on the same day always has the same id. A UUID.
as_of_datedate or nullThe day of the break.
kindstringvalue_mismatch(a cash account's or a contract's amount) orquantity_mismatch(an asset in a custody account); the computation files these two. A stored break can also carrymissing_account,missing_assetorperiod_mismatch.severitystringerror.statusstringopen,resolved(closed by hand with a comment) orwaived(the waiver of the day is recorded).cash_account_id, custody_account_id, asset_idstring or nullThe subject: a cash account, or a custody account and its asset. A contract break names the contract's asset only.
reconciliation_frequencystring or nulldaily,weekly,monthlyorquarterly, from the subject's setting.amount_differencestring or nullCustodian minus calculated amount, for a cash account or a contract. A decimal as a string.
quantity_differencestring or nullCustodian minus calculated quantity, for an asset.
currency_codestring or nullThe currency the amounts are in.
calculated_pointobject or nullThe platform's figure:
date,amount(cash account, contract) orquantity(asset),priceandprice_date(the market price used),market_value(at value date),currency_codeandexchange_rate. Null when there is no calculated figure for the day.custodian_pointobject or nullThe bank's figure, the same fields plus
custodian_id(left out when the point names no custodian) andsource(custodianfor a bank feed,manualfor a point entered by hand). Null when the bank reported nothing for the day.notesstring or nullThe comments given on resolve, reopen and waive, one per line.
resolved_at, resolved_bytimestamp, string or nullWhen and by whom the break was closed (resolve or waive).
waived_at, waived_bytimestamp, string or nullSet while the break is waived.
List reconciliation breaks
Returns the breaks you can see, newest day first (a break without a day last), then the newest id, as a cursor list. An admin sees every break; a user sees the breaks of the cash and custody accounts they have access to. An unknown parameter or value is a 400.
Query parameters
statusstringopen,resolvedorwaived.kindstringvalue_mismatch,quantity_mismatch,missing_account,missing_assetorperiod_mismatch.from_date, to_datedateBreaks on these days, both inclusive.
YYYY-MM-DD.cash_account_id, custody_account_idstringBreaks of this cash account or custody account.
cursor, limitstring, integerThe page:
limitdefaults to 100, at most 1000.
curl -G https://api.aleta.ai/v1/reconciliation-breaks \
-H "Authorization: Bearer {access_token}" \
-d status=open -d from_date=2026-10-01
{
"data": [
{
"id": "6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60",
"as_of_date": "2026-10-15",
"kind": "value_mismatch",
"severity": "error",
"status": "open",
"cash_account_id": "019dfeb0-0511-77a7-a8be-a911ab988a0a",
"custody_account_id": null,
"asset_id": null,
"reconciliation_frequency": "daily",
"amount_difference": "-12.50",
"quantity_difference": null,
"currency_code": "EUR",
"calculated_point": {
"date": "2026-10-15",
"amount": "1012.50",
"quantity": null,
"price": null,
"price_date": null,
"market_value": null,
"currency_code": "EUR",
"exchange_rate": "7.46"
},
"custodian_point": {
"date": "2026-10-15",
"amount": "1000.00",
"quantity": null,
"price": null,
"price_date": null,
"market_value": null,
"currency_code": "EUR",
"exchange_rate": "7.46",
"custodian_id": "019dfeb0-0a11-7c2e-9f4b-1d2e3f4a5b6c",
"source": "custodian"
},
"notes": null,
"resolved_at": null,
"resolved_by": null,
"waived_at": null,
"waived_by": null
}
],
"next_cursor": null,
"limit": 100
}
Retrieve a reconciliation break
Returns one break. An unknown id, one you cannot see, one that is an import issue, or one that is not a UUID is a 404.
curl https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60 \
-H "Authorization: Bearer {access_token}"
Resolve a break
Closes an open break by hand; no figure changes. The comment is required and is added to notes. A break that is already resolved is answered unchanged (200, no new stamp, no new note). A waived break is a 409 whose next_action is the reopen route.
Body parameters
commentstringWhy the break is closed. Required; a missing or blank comment is a
400.
curl -X POST https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60/resolve \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"comment": "Fee booked on the 16th."}'
Reopen a break
Opens a resolved or waived break again and clears who closed it and the waiver. An open break is a 409 (already_open) whose next_action is the resolve route. An optional comment is added to notes.
curl -X POST https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60/reopen \
-H "Authorization: Bearer {access_token}"
Waive a break
Records the waiver of the break's day (the legacy platform's approve) and closes the break; the calculated figure itself is not changed. A waiver survives every recompute and every new bank file. A waived break is answered unchanged; a resolved break is a 409 whose next_action is the reopen route. An optional comment is added to notes.
curl -X POST https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60/waive \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"comment": "Bank file late; figure confirmed by phone."}'
Errors on the writes
400bad_requestA missing comment on resolve, or an unknown body field.
403forbiddenYou need a grant on the whole cash or custody account the break is on. A break on no account (a contract) only an admin acts on.
404not_foundThe break does not exist, you cannot see it, or the id is not a UUID.
409already_openReopen on an open break;
next_actionisPOST /v1/reconciliation-breaks/{id}/resolve.409in_useResolve on a waived break or waive on a resolved one;
next_actionisPOST /v1/reconciliation-breaks/{id}/reopen.409legacy_managedThe break comes from the legacy platform, which is still master for your tenant.
409period_lockedA waive, or reopening a waived break, on a day on or before the closing date of the account's entity.
The checks run in this order: 400 for a missing comment on resolve, 404, 403, 409 legacy_managed, then the status (409 or 200 unchanged), then the period lock.