States
In flight:processing: created or awaiting deposit.confirming: awaiting source confirmations.awaiting_approval: pending offer or review.swapping: executing a swap.bridging: crossing chains.delivering: sending to the recipient.refunding: refund in flight.
Outcomes
completed: delivered.refunded: funds returned.failed: execution or refund failure.expired: expired without deposit.unfulfilled: unconfirmed or replaced deposit; can resume.
awaiting_approval can mean a pending ZeroConf offer or an operator hold. Offer accept/decline applies only to a pending zeroconfOffer, not to the state alone. Review outcomes can carry reviewStatus; internal paused states appear as processing.
unfulfilled can resume after a late deposit. Keep listening and check supersededByOperationId. For failures, read order.errorCode when polling or data.error.code in webhooks.
A Bitcoin deposit replaced by RBF leaves the original order unfulfilled with supersededByOperationId pointing at the successor. The successor carries recoveredFromOperationId. Each time that link advances, order.superseded fires on the original.
Refunds
Execution outside the quote’s bounds can trigger a refund. SupplyrefundAddress on the quote. Without a valid refund target, or while an operator hold applies, recovery may need manual review. See Errors.
Stages
The status response includesstages[]: execution milestones and their completedAt timestamps. Use them for progress detail, not as a replacement for order status.
Reading status
Use webhooks in production. Use SSE for user-facing progress. Poll as the fallback.- Polling
- Webhooks
- SSE
A quote becomes an order when the deposit lands, so the first thing to poll is the quote. Status requires authentication and returns Client keys need
GET /v1/orchestration/order needs a server key and returns { quote, order, stages } with order null until the deposit is detected:Replace
SERVER_KEY with your fn_... key. Use a new X-Idempotency-Key for each operation and reuse it when retrying that same request. Amounts are integer strings in the asset’s smallest unit: "100000" is 0.001 BTC; "50000000" is 50 USDC on Base. Read each asset’s decimals from /routes.{ order, stages }; read order.status for the current state. Server keys use exactly one of id, quoteId, or txHash; multiple transaction-hash matches return 400 ambiguous_query. Before an order exists, status returns 404 not_found:orders:read and a matching read token: use quoteId with the quote token, or id with a submit/onramp token. Send X-Read-Token or ?readToken=. Client keys cannot look up by txHash.Server keys can list recipient orders through /v1/orchestration/history?address=RECIPIENT_ADDRESS, with status, limit (default 50, max 200), and offset. Poll every 3 seconds; see Rate limits.