Skip to main content

Overview

Every payment request has two deadlines. You set both. The gateway never changes them and never fills them in. The SDK and CLI fill them in only when you leave them out.

Quote expiry

Every quote carries its own expiry, award_deadline. The settlement operator that makes the quote chooses it, based on its own risk, capital and delivery speed. You cannot set it. Once it passes, the quote can no longer be selected.

How a payment uses them

  1. Quote window. Settlement operators send quotes until quote_deadline. By default the gateway waits for the whole window, even if a quote arrives early, then selects the best valid quote: the best one that has not expired. With auto accept, it selects the first valid quote instead.
  2. Delivery. The selected operator moves your funds into the settlement vault, waits until that deposit is confirmed on the source chain, then pays your recipient. The payout must be mined on the destination chain before fulfillment_deadline.
  3. Finality. Once the payout is mined the status is finalizing. It becomes completed when the payout is final on the destination chain. This step does not count against fulfillment_deadline. See Finality.

Choosing values

Quote window

The quote window is the time between the request submission and quote_deadline (set by the payment originator). Widening this window will only result in a slower payment. Keep the default. Make it longer only when you sign now, and submit later. For example, with send-payment --prepare-only: a signed request can only be submitted while its quote window is open. Add seconds, not minutes. A settlement operator declines a window that ends after its quote would expire (QUOTE_WINDOW_TOO_LONG). If you lengthen the quote window, lengthen the delivery deadline by the same amount. Both count from when you build the request, so a longer quote window leaves less time for delivery. The SDK refuses a quote window of 5 minutes or more unless you also pass a fulfillmentDeadlineSeconds that ends after it.

Accept the first valid quote

To start delivery sooner, add the query parameter auto_accept=true to POST /v1/payments: POST /v1/payments?auto_accept=true. It is not a field of the request body. The gateway then selects the first valid quote at or under your max_source_amount as soon as it arrives, instead of waiting for the quote window to close.
  • You give up comparing quotes, so set max_source_amount to the price you accept. A request with auto_accept and no max_source_amount is refused.
  • quote_deadline still applies. If no valid quote arrives by then, the payment fails as usual.
  • auto_accept is not part of the signed request. Sending the same request again returns the original payment, with the setting it was first sent with.

Delivery deadline

fulfillment_deadline is the latest time the payout to your recipient can be mined on the destination chain. If no payout is mined by then, your funds are refunded. The payout does not have to be final by then. See Finality. It is set when you build the request, the same way as quote_deadline, so the time left for delivery is what remains after the quote window. The deadline is a limit, not the time a payment takes. Most payments are delivered within seconds, long before it. What its length changes:
  • A longer deadline never slows a successful payment. Settlement operators deliver as soon as they can.
  • A longer deadline delays a refund. If a payment is not delivered after your funds reach the settlement vault, the refund waits for the deadline. See When a refund can start.
  • A deadline that is too short gets no quote. Settlement operators decline with DEADLINE_TOO_SHORT, and the payment fails before your funds move.

Choosing a delivery deadline

If you accept payments with x402 or MPP, you set fulfillmentDeadlineSeconds for your corridors yourself. Choose it the same way.

Large payments

Before it pays your recipient, the settlement operator waits for your deposit to be confirmed on the source chain. For a large payment, an operator may wait until the source chain has finalized your deposit. On Ethereum and its rollups that takes tens of minutes. What counts as large is each operator’s choice. See Finality. If your delivery deadline cannot cover that wait, operators decline with DEADLINE_TOO_SHORT and the payment fails with NO_QUOTES_RECEIVED. Your funds do not move. Send the payment again with a longer deadline and a new request_id. For a large payment, set the delivery deadline yourself:

Waiting for the result

How long POST /v1/payments waits for the result, and how to follow the payment after that: Track a payment. A quote request answers straight away with a quote_request_id, which you poll with GET /v1/payments/quote-requests/{quote_request_id}. Pass wait=true to keep the connection open until the quote window ends, for up to 5 seconds. See Get a price quote.

Deadline errors

After a payment has failed, its request_id is used up: sending it again returns the same failure. Use a new request_id for the next attempt. See Idempotency.

Why nobody quoted

When a payment fails with NO_QUOTES_RECEIVED, the status response tells you why:
  • requested_count: how many settlement operators were asked.
  • decline_summary: how many declined, grouped by decline reason.

Next steps