get /v1/events
What changed on this account: after a cursor, or filtered and newest first
scope budget:read · listEvents
Parameters
after query · string
before query · string
limit query · integer · ≥ 1 · ≤ 100
order query · string
type query · string
since query · string
until query · string
kind query · string
actor_kind query · string
actor query · string
q query · string
budget_id query · string
Returns · 200
{ events: [{ id, event, kind, budget_id, actor: { kind, principal, name }, data, created_at }], next_after, next_before, more }. One row per domain event, with the same event names and data the webhooks deliver (transaction.created, budget.updated with a reason, connection.linked, connection.reauth_required with status saying why a relink is needed and, on the reminder a week before a blocked bank is removed, reminder: true and disconnects_at). kind says what kind of change it is (the kinds the kind filter takes). An edit's data.changes is { field: { from, to } } for each field it really moved (money in cents). actor.kind is agent (an API key, name is the key's name), person (the app) or system (a bank sync, an auto-entered bill). Rows are kept ninety days. Without after, before or since, a read covers the last 24 hours. Pass after = the last id you saw to read only what is new; next_after is the id to pass next time. order=desc reads the newest first (what the app's Activity screen shows); page back with before = next_before while more is true. Ids are ULIDs and sort by time. Filters, all optional and combined: since and until (ISO instants), kind (comma separated: money, transactions, bills, envelopes, bank, accounts, goals, payees, settings, security), actor_kind (agent, person, system), actor (one principal), q (words, an agent's name, or the name of an envelope, category, account, payee, bill, asset, loan, goal, scenario or transaction the row touched) and budget_id (that budget's rows and the rows that name no budget). Use this to learn what your human changed while you were away, or to wait for a bank sync to land, instead of re-reading the whole budget. type= filters by name prefix: type=security. reads the security trail: refusals (security.auth_failed with status, reason, path, a salted ip_hash, and suppressed for a burst folded into one row per minute), keys minted and revoked, banks unlinked, exports, webhook endpoints, household membership changes.
Example
Errors · besides 401, 429, 500
- 403
forbidden: The key is valid but lacks the scope this call needs. Ask the human to mint a key with the scope named in the message.