POST /webhooks, passing a url and the subscriptions you want. To build the endpoint that receives them, see Receiving webhooks.
Subscriptions
A subscription that names a type not in this catalog receives nothing.
Envelope
Every event has the same six fields.data holds:
null. Status, sub-status, and event-type lists can grow without a version bump: ignore a type you do not handle, and fall back to the part of a sub-status before the dot.
Event types
Each resource sendscreated once, statusChanged on every status change, and updated for any other visible change. Deleting or closing a resource is a status change. A resource that existed before you subscribed has no created event, so treat the first event you see for an ID as its creation.
Resource notes
transaction: a change ofsubStatusalone also sendstransaction.statusChanged, withpreviousStatusequal tostatus. There is notransaction.updated. Sub-statuses are listed in the transaction lifecycle.transfer: one movement of money on one rail. A transaction is made of adeposittransfer, apayouttransfer, and arefundtransfer when money goes back to the sender. A transfer that moves through several statuses at once sends onestatusChangedper status.transfer.updatedreports late details such as a transaction hash intracking.customer: sent a short delay after the change.data.resourceis theGET /customers/{customerId}body without balances or empty lists. A customer OMS sees for the first time is announcedpendingincustomer.created, then moved bycustomer.statusChangedwithpreviousStatus: "pending", even if it was alreadyactive. Endorsement changes arrive ascustomer.updatedwithendorsementsinchangedFields.customerWallet:createdcarriespendingwith noaddress;statusChangedtoactivecarries the address.updatedcoverslabel,metadata, and the firstaddress.depositAddress:createdcarriespending.changedFieldsonupdatedis a subset ofdestination,payout,returnDestination,label,metadata, anddepositInstructions.virtualAccount:createdcarriespending.changedFieldsonupdatedis a subset ofdepositInstructions,destination,label,metadata,payout,returnDestination, andreturnPayout. A delete sendsstatusChangedintodeletingand again on todeleted.cashIn: refreshing the cash-in code sendscashIn.updatedwithchangedFields: ["depositInstructions"].externalAccount: a move toinvalid(for example after a bank return) always sendsstatusChanged.
transaction.* and transfer.*. There are no per-rail deposit or payout events.
Never delivered
transaction.cryptoToCrypto.underReview, transaction.cryptoToFiat.underReview, and transaction.fiatToCrypto.underReview exist for compliance only. They are never delivered and cannot be subscribed to. A transaction under review reads processing.underReview, announced through transaction.statusChanged.
Delivery
- Each delivery is an HTTPS
POSTof the envelope, signed in aWebhook-Signatureheader:t=<unix seconds>,v1=<hex>, wherev1is HMAC-SHA256 under your signing key of<t>.<raw request body>. Reject atmore than 300 seconds from your clock. The timestamp and signature are regenerated on every attempt. - A
2xxacknowledges. Anything else, a timeout (the webhook’stimeoutMs, default 5000, maximum 10000), or a network error is retried 10 times over about 3 days. - Delivery is at-least-once, in parallel, and unordered. Deduplicate on
idandidempotencyKey; order bycreatedAtper resource. - An endpoint failing continuously for about 72 hours is
suspended. Re-enable it withPOST /webhooks/{webhookId}/enable. - Delivery history is kept for 30 days.
GET /webhooks/{webhookId}/deliverieslists it (filtersstatus,eventId,test,createdAfter,createdBefore), and each record nests the body sent underevent.POST /webhooks/{webhookId}/deliveries/retrysends deliveries again. There is noGET /events.
Manage endpoints with
POST/GET /webhooks, GET/PATCH/DELETE /webhooks/{webhookId}, and POST /webhooks/{webhookId}/enable, /disable, /rotate-key, and /test. See the API reference.