Conversion Filled
Emitted when an internal conversion is executed atomically; there is no intermediate state.
Event Types
| Event | When Emitted |
|---|---|
exchange.order.executed | Internal exchange executed |
Delivery Contract
- We send a
POSTrequest withapplication/jsonto your configured endpoint, with a 10-second timeout. - Any 2xx response acknowledges receipt. Non-2xx responses and timeouts trigger retries with backoff.
- Four request headers:
content-type·z-signature·z-event-id·z-event-type。 - Deduplicate by
z-event-id— the same event may be delivered more than once.
There are no amounts, asset codes, card number fragments or risk-control reasons. This is a security boundary: the webhook endpoint is your service, whose transport and storage we cannot guarantee.
The GET /v1/<resource>/{id} endpoint applies API key, scope and on-behalf-of checks. Fetch details using data.id;
do not use webhook payloads as the source of amounts for your ledger.
Event Details
exchange.order.executed
Internal exchange executedExchange is atomic and irreversible, without intermediate states; execution is its only event. POST /v1/exchange/orders is synchronous and has already executed when 201 is returned. This event is therefore mainly useful when a member exchanges through the App and your server needs to synchronize balances. ⚠ status_version is always 0 because there is no state machine.
{
"event_id": "evt_4f8d21b60a9e47c5b370ed81c2a6594f",
"event_type": "exchange.order.executed",
"created_at": "2026-08-12T18:02:33Z",
"merchant_id": "acme",
"livemode": true,
"data": {
"object": "exchange_order",
"id": "7e13a5c8-62f0-4d91-ae35-0b8c4d7f2916",
"external_member_id": "u_88123",
"status": "executed",
"status_version": 0
}
}Signature Verification
The signature verification procedure is the same for all events. See Webhook Overview; use the Signature Debugger to compare signing strings character by character.