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.
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.updateTimeis older than the one you have. - De-duplicate webhooks on
eventUid. Retries of the same event reuse it. See Webhooks. - Don’t treat the
returnUrlredirect 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 usesstatus.