Skip to main content
Trading calls return 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 for POST /execution/fill, and for POST /execution/orders using the quoteId in its response.
Key fields in the 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:
Each row has 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.