Skip to main content
After you create an offramp order, you track it to completion, either by polling or by subscribing to webhooks. This guide covers both, plus what happens when a payout fails.

Check order status

Fetch an order any time with its orderId:
curl -X GET 'https://staging.crossmint.com/api/2022-06-09/orders/<ORDER_ID>' \
  -H 'X-API-KEY: <YOUR_SERVER_API_KEY>'
You get the full order back (see the Quickstart for the complete shape). Follow the phase field to know where it is.

Order lifecycle

An offramp order moves through two stages.
1

Waiting for the deposit

Right after you create the order, it sits in the payment phase until the user’s USDC arrives.
{
  "phase": "payment",
  "payment": { "status": "awaiting-payment" }
}
2

Paid out

Once the deposit lands, Crossmint matches it by its memo, sends the fiat, and moves the order to completed. The payment.received field shows the matched on-chain transaction.
{
  "phase": "completed",
  "payment": {
    "status": "completed",
    "received": { "chain": "base-sepolia", "txId": "0xc953...a338e85", "amount": "1", "currency": "usdc" }
  },
  "lineItems": [{ "delivery": { "status": "completed" } }]
}
Most payouts finish within a couple of minutes. If no deposit arrives in time, the quote expires and you create a new order. For the full picture, see How It Works.

Webhooks

Instead of polling, subscribe to order events so Crossmint notifies your backend as the order progresses. Offramp orders emit the same orders.* events as the rest of the Crossmint orders system. Configure an endpoint and subscribe in the Webhooks guide. The events that matter for offramp are:
EventFires when
orders.payment.succeededThe on-chain USDC deposit is matched to the order.
orders.delivery.completedThe fiat payout to the bank completes.
orders.delivery.failedThe payout could not be completed.
orders.payment.failedThe deposit could not be processed.
Use these to drive your own UI updates (for example, showing the user “payout on the way” and “funds sent”) and to reconcile completed payouts on your side.

When a payout fails

If a payout cannot be completed after the USDC deposit is received, the deposit is returned to the user and the order reflects the failure. Listen for orders.delivery.failed (or poll for the failed state) so you can surface it in your app and, if appropriate, prompt the user to try again with corrected bank details.

Next steps

Quickstart

Build the full flow

Going to Production

Move from staging to live payouts