How scenarios are selected
When we route your order for execution, we match it against a predefined list. The first scenario whose conditions all match wins. If nothing matches, you get the default full fill. Matchers use the same fields you send when placing an order:- Buy orders: set
cash_amountto the exact string shown below. - Sell orders: set
quantityto the exact string shown below (and do not setcash_amount). - Everything else: default full fill.
Scenario reference
Some orders pass through
pending before executing; many skip pending entirely. See the order lifecycle for status definitions and the full webhook list.
Partial fills
Partial scenarios are easy to misread. The order ends asfilled, not cancelled: we execute part of the order, then cancel what is left. You get trade.executed, then order.filled (not order.cancelled). Use Retrieve order or the trade resource to check traded_quantity and related fields.
The same triggers work for currency pairs. Statuses and webhooks match the table above; trade amounts follow your FX quote rather than the sell example.
Examples
Unfilled cancel
order.cancelled and a terminal status of cancelled. No trade.executed event.
Partial fill
trade.executed followed by order.filled. The trade should reflect a partial fill (about 40% of the order); check the response for exact amounts.
Sell partial fill
Usequantity: "20" and omit cash_amount:
trade.executed with quantity of 5, then order.filled.
Sell full fill
Use a quantity of"12" or less (for example "10") and omit cash_amount:
trade.executed with quantity of 10, then order.filled.
Tracking results
Subscribe to webhooks for real-time updates, or poll Retrieve order after each placement. Webhook delivery is at-least-once; deduplicate using the event ID orWebhook-Id header.
Sandbox execution does not mirror production routing, venue behavior, or FIX lifecycles. Use it to test your integration against predictable order and trade outcomes, not to validate production execution logic.