View as Markdown

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

idstring

Stable identifier of the break: the same subject on the same day always has the same id. A UUID.

as_of_datedate or null

The day of the break.

kindstring

value_mismatch (a cash account's or a contract's amount) or quantity_mismatch (an asset in a custody account); the computation files these two. A stored break can also carry missing_account, missing_asset or period_mismatch.

severitystring

error.

statusstring

open, resolved (closed by hand with a comment) or waived (the waiver of the day is recorded).

cash_account_id, custody_account_id, asset_idstring or null

The subject: a cash account, or a custody account and its asset. A contract break names the contract's asset only.

reconciliation_frequencystring or null

daily, weekly, monthly or quarterly, from the subject's setting.

amount_differencestring or null

Custodian minus calculated amount, for a cash account or a contract. A decimal as a string.

quantity_differencestring or null

Custodian minus calculated quantity, for an asset.

currency_codestring or null

The currency the amounts are in.

calculated_pointobject or null

The platform's figure: date, amount (cash account, contract) or quantity (asset), price and price_date (the market price used), market_value (at value date), currency_code and exchange_rate. Null when there is no calculated figure for the day.

custodian_pointobject or null

The bank's figure, the same fields plus custodian_id (left out when the point names no custodian) and source (custodian for a bank feed, manual for a point entered by hand). Null when the bank reported nothing for the day.

notesstring or null

The comments given on resolve, reopen and waive, one per line.

resolved_at, resolved_bytimestamp, string or null

When and by whom the break was closed (resolve or waive).

waived_at, waived_bytimestamp, string or null

Set while the break is waived.


GET/v1/reconciliation-breaks

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

statusstring

open, resolved or waived.

kindstring

value_mismatch, quantity_mismatch, missing_account, missing_asset or period_mismatch.

from_date, to_datedate

Breaks on these days, both inclusive. YYYY-MM-DD.

cash_account_id, custody_account_idstring

Breaks of this cash account or custody account.

cursor, limitstring, integer

The page: limit defaults to 100, at most 1000.

Request
GET/v1/reconciliation-breaks
curl -G https://api.aleta.ai/v1/reconciliation-breaks \
  -H "Authorization: Bearer {access_token}" \
  -d status=open -d from_date=2026-10-01
Response
{
  "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
}

GET/v1/reconciliation-breaks/{id}

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.

Request
GET/v1/reconciliation-breaks/{id}
curl https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60 \
  -H "Authorization: Bearer {access_token}"

POST/v1/reconciliation-breaks/{id}/resolve

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

commentstring

Why the break is closed. Required; a missing or blank comment is a 400.

Request
POST/v1/reconciliation-breaks/{id}/resolve
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."}'

POST/v1/reconciliation-breaks/{id}/reopen

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.

Request
POST/v1/reconciliation-breaks/{id}/reopen
curl -X POST https://api.aleta.ai/v1/reconciliation-breaks/6f1c2a3b-9d4e-4f50-8a61-7b2c3d4e5f60/reopen \
  -H "Authorization: Bearer {access_token}"

POST/v1/reconciliation-breaks/{id}/waive

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.

Request
POST/v1/reconciliation-breaks/{id}/waive
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_request

A missing comment on resolve, or an unknown body field.

403forbidden

You 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_found

The break does not exist, you cannot see it, or the id is not a UUID.

409already_open

Reopen on an open break; next_action is POST /v1/reconciliation-breaks/{id}/resolve.

409in_use

Resolve on a waived break or waive on a resolved one; next_action is POST /v1/reconciliation-breaks/{id}/reopen.

409legacy_managed

The break comes from the legacy platform, which is still master for your tenant.

409period_locked

A 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.