Skip to main content
Prices move, and bank accounts for deposits don’t stay open forever. These are the time limits to plan for.

At a glance

The quote time is the one you’ll notice most. Create the payment as soon as your customer confirms the price. The exact expiry time is always in the quote’s expires_at field.

Quotes

A quote holds a price for a short time. Always read expires_at instead of assuming a fixed time.
  • Before you create a payment: if the quote has expired, call Refresh a quote to get a fresh price with the same quote ID, or get a new quote.
  • After you create a payment: the quote is locked to that payment. While the payment is still waiting for your customer’s money (initiated, quote_locked, fiat_pending, or stable_pending), you can still refresh it to update the price. After the money arrives, the price is final.
Trying to create a payment with an expired quote fails with:

Deposits

After you create a payment, your customer has 30 minutes to send the money:
  • Onramp: the fiat, by bank transfer or mobile money. For mobile money, ask them to approve the payment on their phone straight away.
  • Offramp: the stablecoin, to the deposit address.
If nothing arrives in that time, the payment moves to failed and you receive a payment.onramp.failed or payment.offramp.failed webhook. To try again, start with a new quote.

Your webhook endpoint

Your server must reply within 10 seconds. If your work takes longer, reply with 200 first and do the work afterwards. See How webhooks work.

Your requests

Most requests return in under a second. Creating a payment calls our payment partners, so it can take longer. If a partner doesn’t respond in time, you get a 504 error. See Status codes.
Always send an Idempotency-Key when you create a payment. Then if a request times out on your side, you can safely send it again.
Last modified on October 29, 2026