Skip to main content
Exchange events use three data shapes: an order snapshot, an order plus one fill, or an original-and-replacement order pair.

Order snapshot events

exchange.accepted, exchange.cancelled, and exchange.rejected have the same data.order shape. The event type and order status identify the transition.
For exchange.cancelled, order.status is cancelled. cancel_reason is null for an explicit cancel, unfilled_ioc_quantity when an immediate order executed part of its quantity and the remainder was cancelled, or self_trade_prevention when the order would have matched one of your own resting orders. A resting order of yours that is cancelled as the counterparty of one of your own commands also receives this event. For exchange.rejected, order.status is rejected and reject_reason is no_fill (an immediate order found no liquidity) or post_only_would_cross. Requests that fail before reaching the matching engine, such as a missing balance, an invalid price, or a suspended pair, are answered synchronously by the REST or WebSocket call and produce no webhook. An order that fills completely on arrival emits exchange.filled (and exchange.cancelled for any remainder) without a preceding exchange.accepted.

exchange.filled

One order can produce several fill events. data.fill.id identifies the fill; data.order is the order snapshot after that fill was applied.
applied_fee_bps is the fee rate committed for your side of this fill and maker_rebate is any rebate paid to you in the base asset. Both are omitted when they do not apply.

exchange.replaced

A replacement event contains both snapshots. For explicit order_replace, the original is cancelled and links to the new order ID through replace.replaced_by_order_id. The replacement links back through replace.replaces_order_id. For a material market-maker quote amendment, both snapshots have the same order ID: original_order contains the terms before the change and replacement_order contains the current terms afterward. Both retain the live status, cumulative filled quantity, original creation time and existing replacement ancestry. An amendment creates no cancellation or replacement self-links. For example, after 3 units have filled, requesting 8 remaining units updates total quantity to 11 while filled_quantity remains 3. Update your current order from replacement_order, keyed by its id; equal IDs indicate an in-place update. Each material amendment emits one exchange.replaced event using your existing subscription, with no additional accepted or cancelled event. Deduplicate retries by the envelope id. This example shows an explicit replacement with distinct order IDs:
Use data.order.id, data.original_order.id, or data.replacement_order.id with GET /v1/partner/exchange/orders/{order_id} for the authoritative order state, including the order’s fills list. Return to the webhook overview