Payment lifecycleBreakingPayers
completed arrives later on Ethereum
Affects: payers who wait for a payment to reach completed.Payments on Ethereum and its rollups (Arbitrum, Optimism, Celo and Base) now show as completed only once the payout is final, which takes tens of minutes. Your recipient already has the money once the status is finalizing.- The status moves from
finalizingtocompletedonly once the payout is in a finalized block on Ethereum, Arbitrum, Optimism, Celo and Base. On Ethereum this used to take about 2 minutes. See Time to finality by chain for each chain. - On Polygon, the status reaches
completedsooner, once the block is in a finalized milestone.
What to do
Your recipient has the funds once the status isfinalizing. You can treat a finalizing payment as paid if you accept the small risk that the payout is reversed. If you wait for completed, base your timeout on the chain’s time to finality and leave room for slow periods. Do not retry or refund a payment whose status is still finalizing; it is not stuck. See Payment status.Payment lifecycleAPIBreakingPayers
Removed field, 5-minute default deadline
Affects: payers integrating with the Payments API, SDK or CLI.Payments no longer returnfulfillment_confirmation. If you don’t set a deadline, SDK and CLI 5.0.0 give a payment 5 minutes to be delivered before it is refunded, down from 1 hour, and the CLI stops waiting once the payout is on chain.fulfillment_confirmationis removed. Payments no longer return it; read the payout transaction fromtransactions.fulfillment.- SDK and CLI 5.0.0 default to a 5-minute delivery deadline, down from 1 hour. A payment that is not delivered is refunded sooner. A deadline you set yourself is unchanged, and earlier versions keep the 1-hour default.
send-paymentexits with code5for afinalizingpayment, where it used to exit2, and--waitstops atfinalizing. Pass--wait-for completedto wait as before. Waits in the SDK and CLI also stop atrefund_available.- Expired payout authorizations read
refunding. If you deliver the payout yourself and the settlement operator’s transfer authorization expires unused, the payment now readsrefundinginstead offailedwithSETTLEMENT_FAILED. This change has been live since 2026-10-23.
What to do
Remove any reads offulfillment_confirmation. If a script reads send-payment exit codes, handle 5. If you send large payments with the default deadline, set a longer one. See Deadlines and Refunds.APIPayers
Auto accept
Affects: payers who set amax_source_amount on their payments.You can now take the first acceptable quote instead of waiting for the quote window to close.- Auto accept. Add the query parameter
auto_accept=truetoPOST /v1/payments, or use--auto-acceptin CLI 5.0.0, to take the first valid quote at or under yourmax_source_amount. It is faster, but gives up competitive pricing. - New decline reason
MAX_SOURCE_AMOUNT_TOO_LOW. Settlement operators decline when yourmax_source_amountis below their price.
APIBreakingPayers
Clearer funding and asset errors
Affects: payers whose code handles errors fromPOST /v1/payments, the SDK or the CLI.Payments the paying account can’t fund are now refused when you submit them, with an error code that says why.- Funding errors are returned on submit. If the paying account holds too little of the source token, or has not approved Permit2 for enough of it,
POST /v1/paymentsanswers HTTP 422 withINSUFFICIENT_FUNDSorMISSING_TOKEN_APPROVAL. Before, the payment was accepted and then failed withSETTLEMENT_FAILED. No funds are moved.
What to do
Don’t treat a 422 fromPOST /v1/payments as an outage to retry. If your code maps SETTLEMENT_FAILED to a message for the payer, add the new codes. After INSUFFICIENT_FUNDS or MISSING_TOKEN_APPROVAL, fix the balance or approval and retry with a new request_id. See Errors.Payment lifecycleAPIVeri-FillBreakingSettlement operators
Operators paid after finality
Affects: settlement operators.On Ethereum and its rollups, the settlement vault now pays you once your payout is final, tens of minutes after it is mined./v1/finality-config no longer returns finality_model.- Vault payments arrive later on Ethereum, Arbitrum, Optimism, Celo and Base. The settlement vault pays you only once your payout is in a finalized block. On Polygon, vault payments now arrive sooner, once the block is in a finalized milestone. See Time to finality by chain.
finality_modelis removed from/v1/finality-config. Usefinalityandtime_to_final_ms, orcommitmenton Solana.- New decline reason
MAX_SOURCE_AMOUNT_TOO_LOW. Send it when the payer’smax_source_amountis below your price.
What to do
If your own code readsfinality_model, remove it. See Destination finality and Price holds and declines.APIVeri-FillSettlement operators
Retry signatures on 503
Affects: settlement operators that request release or refund signatures from Veri-Fill.If Veri-Fill, Atum’s verification service that signs releases and refunds for the settlement vault, cannot sign for a deposit right now, it asks you to retry.- Retry when a signature can’t be made yet.
POST /v1/refundand Solana releases answer HTTP 503. If the response has aRetry-Afterheader, wait that long first. If not, send the same request again.
What to do
Treat a 503 from these endpoints as retryable. Wait for theRetry-After header when there is one, then send the same request again. See Veri-Fill.Payment lifecycleAPIBreakingPayers
New refund statuses
Affects: payers whose code branches on payment status.When a settlement operator gives up on a payment, it now readsrefunding or refund_available while the money comes back to you, instead of failed.- Undelivered payments read
refundingorrefund_available. When a settlement operator gives up on a payment, its status is nowrefundingorrefund_available. Before, it readfailed. refund_availablemeans you can submit the refund yourself. Atum has signed the refund, and anyone can submit it; the vault only pays the original payer.- New refund fields. The payment status response carries
refund_reason, andrefund_signaturewhen the status isrefund_available.
What to do
If your code branches on every payment status, add a branch forrefunding, refund_available and refunded. While a payment is refunding or refund_available, do not pay again for the same purchase. See Refunds and Payment status.Payment lifecycleAPIVeri-FillSettlement operators
Refund signature changes
Affects: settlement operators that request refund signatures fromPOST /v1/refund.Asking Veri-Fill, Atum’s verification service, for a refund signature now picks up where the last request left off.- Long checks continue on retry. If checking a refund takes longer than one request,
/v1/refundasks you to try again later, and the next request continues from where the last one stopped, on every chain except Tron. - Canceled payout authorizations can be refunded early. When the payer submits the payout with your transfer authorization and you cancel it, put the cancel’s transaction hash and log index in
authorization_canceledto get the refund signature without waiting for the delivery deadline.
What to do
When/v1/refund asks you to try again later, retry the same request. Except on Tron, each attempt continues the check. See Veri-Fill and When a refund can start.APIx402Payers
Retried x402 settle returns the payment
Affects: integrators who retry/settle on the x402 facilitator.Retrying /settle returns the payment you already made instead of an error.- Retrying
/settlereturns the original payment. A retried/settleis no longer refused once the quote window has closed. It returns the payment you already submitted, so you do not start a second payment by mistake./verifystill checks the quote window.
What to do
Build payment requirements with the x402 SDK instead of setting contract addresses by hand. If you retry/settle after a timeout, keep using the same request. See Verify, Settle and Accept payments with the x402 SDK.Networks and assetsPayersSettlement operators