pending right away and finish in the background. You find out how a trade
ended by polling, or by listening for webhooks and WebSocket events. Always keep going until you
reach a terminal state.
Two levels of status
A fill split across two venues is one trade with two orders.
Order statuses
A market order never shows
open, partially_filled_open, or cancel_pending.
partialFillReason is an open set. Known values: venue_capacity, price_slipped,
venue_cancelled, venue_expired, venue_closed, user_cancelled, timeout,
clearinghouse_capacity, native_remainder_voided.
The diagram shows the usual paths. Not every order visits every state, and a failure can happen
from any in-flight state. Branch on the status you read, not on the path you expect.
Trade states
GET /execution/status rolls the orders up into overallState:
Stop when
terminal is true, not when you see a particular state. terminal can stay false
for a short time after every order is final, while steps that run after the fill finish.
Poll a quote-based trade
Use this forPOST /execution/fill, and for POST /execution/orders using the quoteId in its
response.
404 means no order is recorded for that quoteId for this user yet. Right after a fill request,
the request may still be running, so a 404 is not proof that the fill was rejected. See
safe retries. Raw amounts are strings in 6-decimal units: "15300000" is $15.30 or 15.3 shares.
API reference: Get execution status.
Poll by order id or your own id
GET /execution/orders lists the user’s orders. Filter it to one order:
status, filledAmountRaw, actualSharesRaw, executionPrice, txHash, and
errorMessage. Poll until status is terminal. A resting limit order stays open until it fills,
is cancelled, or expires.
Push instead of polling
Payloads are small. Read the order from the API for amounts and prices.
Idempotency at a glance
Full rules: Errors, retries & idempotency.