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 method | Default | Why |
|---|---|---|
| Cards | 30 minutes | A 3-D Secure flow should be complete well within this |
| Checkout | 30 minutes | |
| iDEAL | 30 minutes | |
| Bancontact | 60 minutes | |
| Bank Transfer | 1 hour | |
| in3 | 4 hours | in3 expires the transaction after 4 hours by default |
| PayPal | 6 hours | 3 hours to redirect the payer, plus 3 hours to approve |
| Klarna | 48 hours | Driven by Klarna's payment session, which expires after 48 hours |
| Belfius Pay Button | 5 days | |
| Apple Pay / Google Pay session | 10 minutes | Applies 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.
{
"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 —
| Flow | Maximum |
|---|---|
| iDEAL payment requests | 1 hour |
| Payment Service orders | 21 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.