Events
The event feed lists what happened on the platform. Each event has id, type, occurred_at and data. Reads need platform:read and the operations module on read in one of your groups (an admin always has it); without it the route answers 403.
You see the events about what you have access to. An event about a custody or cash account is shown to whoever sees that account (one of them, when it is about several), an event about a lens to the lens's owner and whoever sees the lens through its client or a share (a grant on the lens alone does not show its events), and an event about a client to whoever sees the client. An admin sees every event of the tenant; an event about the tenant as a whole is for admins only. data holds ids and dates only, never names or other personal data.
The feed is oldest first. An event is listed once it is five minutes old, so a write that commits late is never skipped by a cursor that has already passed it: keep your last next_cursor (or the occurred_at of the last event you handled) and ask again.
Event types
calculated_data.createdclientA client's calculated data is ready through a later day.
data:{client_id, as_of_date}. One event per client and day; itsidis fixed for that client and day. Until your tenant has moved from the legacy platform, the day is the oldest of the client's release groups' newest published days, the day/v1/data-statusshows. Not sent today: the job that writes it is switched off.custody_account.released, cash_account.releasedaccountA custody account or cash account was released through a day.
data:{custody_account_id or cash_account_id, released_through}. Reserved: nothing sends these events today.limit.breachedlensA limit's breach period opened: the limit breaches on a day where it did not on the day evaluated before.
data:{limit_id, lens_id, as_of_date}, withas_of_datethe period's first day. A limit on a client rather than a lens haslens_id: null, and its event is shown to whoever sees the client. One event per period, not one per day. Only limits made on the platform are evaluated here; a limit from the legacy platform sends none.transaction.createdaccountA transaction was booked through
POST /v1/transactionsor a transfer (one event per leg).data:{transaction_id, cash_account_id, custody_account_id};custody_account_idis absent when the transaction has none.transaction.correctedaccountA transaction was corrected (
PATCH /v1/transactions/{id}) or cancelled (DELETE /v1/transactions/{id}, and each row cancelled with it).data:{transaction_id, cash_account_id, custody_account_id, replacement_transaction_id};replacement_transaction_idis the corrected row, absent on a cancellation, andcustody_account_idis absent when the transaction has none. Transactions from bank files, the legacy platform and generated corporate-action rows send no event.custodian_authority.awaiting_aletatenantA client consented on a custodian authority, which Aleta now sets up and activates.
data:{custodian_authority_id, entity_id}. Seen by admins and Aleta only.reconciliation_break.opened, reconciliation_break.closedaccountA reconciliation break opened or closed.
opened: the platform's reconciliation found the break, or someone reopened it.closed: someone resolved or waived it, or the reconciliation no longer finds it.data:{reconciliation_break_id, as_of_date, cash_account_id or custody_account_id};as_of_datemay benull. A break on a contract has no account and is seen by admins and Aleta only. Import issues (theinvalid_*andunmatched_*kinds of/v1/import-issues) send no event.custodian_file.receivedaccountReserved: nothing sends it today.
price_source.missingaccountA benchmark computation found no price source for an asset of a client's benchmark: the asset has no price series.
data:{client_id, asset_id, as_of_date};asset_idisnullwhen your tenant has no asset for the benchmark's instrument, andas_of_dateis the day the computation ran through. One event per client, asset and day; itsidis fixed for that client, asset and day, so a rerun sends no second event, and the next day's computation sends a new one while the source is still missing. It is about the client's custody accounts that hold the asset that day, or all of the client's custody accounts when none does, and is shown to whoever sees one of them; a client with no custody account has it shown to whoever sees the client. Only benchmarks the platform computes send it; invalid prices (theinvalid_priceimport issues) send no event. Not sent today: the writer is switched off.
The events that appear today are limit.breached for platform limits, the transaction events of your own v1 writes, the break events of the platform's reconciliation and of the break writes, and custodian_authority.awaiting_aleta. The legacy platform sends no events into the feed.
List events
Returns the events oldest first (occurred_at, then id), as a cursor list. An unknown query parameter is a 400.
Query parameters
typestringOne event type from the list above; another value is a
400.occurred_aftertimestampOnly events after this time (RFC 3339); another format is a
400.cursor, limitstring, integerThe page:
limitdefaults to 100; values above 1000 are capped at 1000. A cursor that does not decode is a400.
curl "https://api.aleta.ai/v1/events?type=calculated_data.created" \
-H "Authorization: Bearer {access_token}"
{
"data": [
{
"id": "bed629cc-513e-53fd-8bd6-843d4d750208",
"type": "calculated_data.created",
"occurred_at": "2026-10-17T06:20:00.000000Z",
"data": {
"client_id": "019dfe9f-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"as_of_date": "2026-10-16"
}
}
],
"next_cursor": null,
"limit": 100
}