Skip to main content
This page is the single reference for order statuses. Webhooks carry the status in payload.orderStatus. Get Order returns it in status. The values are the same.

Lifecycle

Order statuses

* payment_failed and expired are final for your user experience, but a payment that is accepted late (for example a bank transfer that arrives after the window) moves the order to processing. Keep handling webhooks for these orders.
New statuses may be added. Treat any value you don’t recognise as “in progress” and log it, rather than failing.

Payment statuses

paymentStatus tracks the payment leg: the fiat payment for a buy, the crypto deposit for a sell. It drives the order status as shown below. A webhook is only sent when the order status changes, so payment-only changes don’t produce a webhook.

Buy vs sell

Handling rules

  • Status is the current state, not a transition. Each webhook carries the order’s status at the time it was sent. Two quick changes can produce two events with the same status. Store the latest status per order and ignore events whose payload.updateTime is older than the one you have.
  • De-duplicate webhooks on eventUid. Retries of the same event reuse it. See Webhooks.
  • Don’t treat the returnUrl redirect as proof of success. Confirm the status from a webhook or by polling the order.
  • Field names differ by source. Webhooks use orderStatus. Get Order uses status.