Skip to main content

Purpose

Use GET /v1/merchant-api/checkouts/{checkoutId}/status with the merchant API key to recover the current hosted checkout. Poll with backoff when webhooks are not suitable; do not infer completion from the return URL. The normal forward path is createdinitiatedpending or active → optional holdcompleted. A checkout may instead move from a non-terminal state to an unsuccessful terminal state. Provider callbacks are authoritative, so integrations must tolerate skipped observable states and must not manufacture transitions locally. For checkout deposits, respect the returned pollAfterSeconds. Continue polling a pending, active, or hold state. A status capability returned by a successful deposit remains usable after the offer deadline so an attached protected trade can finish. For CS2, reservationRequired is true. Once hold begins, the CS2 trade is held for eight days; keep the merchant order reserved and do not fulfill, credit, delete, or release it until payment.completed. Use holdUntil from the API, not a browser timer. fulfillmentAllowed is false until completion. On canceled, declined, failed, or reverted outcomes it remains false and you may release the reservation; reconciliation is manual.
Expected result: one order is fulfilled at most once, only after completed. Polling and webhook handlers must call the same enqueue operation. Implement the worker and crash recovery in Safe fulfillment. Use webhooks for durable notifications.