Event types
You choose which events to subscribe to per endpoint, so you can listen only for the ones you care about (most integrations just needtransaction.completed and transaction.failed).
Transaction events
Each event maps 1:1 to a transaction status.Payout tracking events
transaction.sent
transaction.uetr.assigned
transaction.completed —
treat the two as independent.uetr and tracking_codes on the
payout once it has one. Use the event to be told, and the endpoints to look up a payout
you already know about.- Not every payout gets one. The UETR exists for cross-border payouts on the SWIFT network. Local-rail payouts and stablecoin transfers have no UETR, and a corridor that never returns one emits no event. Never block your own flow waiting for it.
- It is sent once per payout. The reference doesn’t change once assigned, so the
event carries a stable
event_idand a redelivery is recognisable as the same event.
Fee events
A fee your account bears for an account you manage moves through three stages, and each is announced separately. Subscribe to all three, or only to the one you act on.event and effect say which stage it is. amount is in minor units — 25000 means 250.00, the same scale the transaction endpoints report. fee_type is what the fee was charged for — withdrawal, payin or card_funding. related_transaction_id is the movement that incurred it and incurred_by_account the account that made it, so the charge can be attributed without matching on amount or timing.
Each stage carries its own event_id, so a redelivery of the same stage is recognisable while the three stages never suppress one another.
fee_amount on that account’s own transaction. To list fees rather than be pushed them, filter List Transactions Across Accounts on transactionType=fee.Account events
These cover the onboarding lifecycle of the accounts you manage via the API (the additional business/individual accounts you create under your profile), plus the deposit accounts provisioned for them.Payer name events
These cover Named Payouts — the affiliated payer names you register so a beneficiary sees a related entity of yours, or your end-customer, on a payout instead of your own business name.processing event: payer_name.approved already says the name is being worked on, so the next thing you hear is an outcome. A name that is later archived emits nothing — you archived it, so you already know.
Payer name lifecycle
payer_name.changes_requested (optional detour)
payer_name.approved
payer_name.active
payer_name_id as payerNameId on a payout, or make it your default.payer_name.rejected / payer_name.action_required (dead ends)
active yet — it is accepted and simply waits. For anything time-sensitive, hold the payout until payer_name.active arrives.Account lifecycle
An account onboarded through the API typically moves through:account.onboarded
account.submitted
account.approved / account.rejected / account.changes_requested (review outcome)
account.submitted again).account.virtual_account.created
data.virtual_account object carries the details — the same shape you’d get from the funding instructions endpoint.Deposit account requests
A USD deposit account request is reviewed before the account is provisioned, so it resolves one of three ways:account.virtual_account.created
account.virtual_account.changes_requested
data.bank_account_request.reason explains what. Re-issue the account with the corrections and the same request reopens — no duplicate is created.account.virtual_account.declined
data.bank_account_request.reason. Further requests for the same currency are blocked until the decision is lifted.account.rejected and account.changes_requested refer to the account’s application and are unrelated.Transaction lifecycle
A typical transaction emitstransaction.pending and then one or more later events as it progresses to a terminal state:
transaction.pending
transaction.processing / transaction.sent (in flight)
transaction.completed (success path)
transaction.failed / rejected (failure paths)
transaction.refunded event may follow a completed transaction that is later reversed.processing, sent) may be skipped depending on the rail and how fast the transaction settles. A deposit that is auto-confirmed may jump from pending to completed; a payout that fails will emit transaction.pending then transaction.failed. Always treat the event’s status as the source of truth and don’t assume ordering.transaction.uetr.assigned sits outside this sequence. It reports a reference becoming
available rather than a change to the payment, carries no status of its own, and may
arrive at any point after the payout is sent — including after it has completed.
The event_id field
Each logical event has a stable event_id. The same logical event (for example, “transaction X completed”) always carries the same event_id, even if it is delivered more than once. Use it to make your handler idempotent.
Distinguishing deposits from payouts
The payload’sdata.type field is either deposit or payout. The data.rail field tells you whether it’s fiat or stablecoin. See Payloads for the full schema and samples.