Skip to main content

Transaction expiration

Every transaction has an expiry time. If the consumer has not completed the payment by then, the transaction moves to EXPIRED and can no longer be paid.

You control this with the optional expiresAt field on the create-transaction request. Leave it out and a default is applied, chosen to match what the payment method itself supports.

Default expiry per payment method​

Payment methodDefaultWhy
Cards30 minutesA 3-D Secure flow should be complete well within this
Checkout30 minutes
iDEAL30 minutes
Bancontact60 minutes
Bank Transfer1 hour
in34 hoursin3 expires the transaction after 4 hours by default
PayPal6 hours3 hours to redirect the payer, plus 3 hours to approve
Klarna48 hoursDriven by Klarna's payment session, which expires after 48 hours
Belfius Pay Button5 days
Apple Pay / Google Pay session10 minutesApplies to the direct API session, not Checkout

These defaults are fixed — they are not configured per merchant. To use a different value, send expiresAt in the request.

Setting your own expiry​

expiresAt is an RFC 3339 date and time — any timestamp at least a minute in the future, such as 2030-01-15T14:30:00Z.

Create transaction — excerpt
{
"amount": 1000,
"currency": "EUR",
"expiresAt": "2030-01-15T14:30:00Z"
}

Minimum: one minute from now. A shorter value is rejected.

Maximum: enforced on two flows only —

FlowMaximum
iDEAL payment requests1 hour
Payment Service orders21 days

Other payment methods do not enforce an upper bound at the API level. That does not mean any value works: the payment provider behind the method has its own limits, and a value beyond what they support may be rejected or shortened by them. The defaults above reflect each provider's usable window, so treat them as guidance rather than a floor to push against.

What happens when a transaction expires​

The transaction's status becomes EXPIRED. It is final — an expired transaction cannot be paid, and a new one must be created.

If you asked to be notified when you created the transaction, by including the webhooks array in the request, you receive a webhook call when the status changes to EXPIRED, on the URL you specified. Treat it as a signal to fetch the transaction and update your own records — see Webhooks.

If you did not request webhooks, poll the get-transaction endpoint for the payment method you are using. Webhooks are a best-effort mechanism, so it is worth polling as a fallback even when you do use them.