Skip to main content
A payment_id means the gateway accepted your payment. It does not mean the funds have arrived. This page shows how to follow a payment to the end and what to do if it fails.

Payment status

The usual paths: finalizing is not final. If you act on it, for example to release goods, you accept the small risk that the payout is reversed. You can also open the payout transaction (transactions.fulfillment) in the destination chain’s block explorer and wait for the number of confirmations you are comfortable with. How long finalizing lasts, and what Atum waits for on each chain, is on Finality. refunding and refund_available are not final either. A late delivery can still end the payment as completed. Refunds explains who returns your funds and how to submit a refund yourself.

Track a payment

POST /v1/payments keeps the connection open for up to 30 seconds and answers as soon as the payment is finalizing, completed or failed. If it is still pending, poll the status every few seconds until it is completed, failed or refunded. If it is refund_available, submit the refund yourself.

What the status response contains

Each entry in transactions has the transaction hash, the chain, and the block once it is mined. A completed payment always has both transactions.deposit and transactions.fulfillment. Read every transaction from transactions. Full shape: Get payment status.

When a payment fails

Read error.code first, then decline_summary. Deadlines lists every deadline error and what to change. For example, a quote window that ends after the operators’ quotes would expire:
Both settlement operators declined. Send a new payment with a new request_id and a shorter quote window.

Retry without paying twice

Not sure it was accepted? Send the same signed request again: if the gateway already accepted it, you get the original payment back instead of a second one. What to do for each status: Retrying by status.

Next steps