Adyen supports making account-to-account (A2A) payments in the Netherlands through iDEAL. This feature allows your users to make online payments using their Adyen business account.
This page explains how to:
- Enable Account-to-Account (A2A) payments directly from Adyen business accounts.
- Retrieve payment details using the
/payments/detailsendpoint. - Confirm payments using the
/payments/confirmendpoint - Cancel payments using the
/payments/cancelendpoint.
Requirements
| Requirement | Description |
|---|---|
| Integration type | You must have the Adyen for Platforms integration that supports business accounts. |
| API credentials | The API user making the request must have the following role assigned:
|
| Limitations | Some limitations are:
|
| Setup steps | You must:
|
iDEAL for A2A payments
After you have integrated iDEAL for A2A payments, business account users can select iDEAL as a payment method during checkout. The payment flow redirects users to your platform, where they select their Adyen business account, complete a Strong Customer Authentication (SCA) process, and then authorize the payment.
For platforms, this means faster payments, fewer dependencies on external banks, and a smoother user experience.
How users complete SCA using your platform
To complete the checkout process, your user must use your platform to complete SCA. How your user completes SCA depends on the device that they are using:
Redirection
Users are redirected from the checkout to your platform's app or website to authorize the payment. The user flow is as follows:
Mobile (App-to-app)
- The user starts the checkout on their mobile device, the mobile browser displays a "Select your bank" screen.
- The user must select Adyen from the list, followed by selecting your platform.
- The mobile browser opens your platform's app.
- The user authorizes the payment within your app and is then automatically redirected back to the checkout in their mobile browser.
Desktop computer
- The user starts the checkout on their desktop computer, the desktop browser displays a "Select your bank" screen.
- The user selects Adyen from the list of banks on their desktop browser, followed by selecting your platform.
- The desktop browser opens your platform's web login page.
- The user authorizes the payment on the web page and is then automatically redirected back to the checkout in their desktop browser.
QR scan
Users scan an iDEAL QR code on their desktop to authorize the payment via your mobile app. The user flow is as follows:
Desktop computer
- The user scans the iDEAL QR code displayed in the desktop browser using the QR reader within their mobile app.
- This transfers the authorization session from the desktop computer to the mobile device.
- After authorizing the payment, your mobile app must only show a success or confirmation screen.
- Do not redirect the user from the mobile app to the checkout page. The desktop browser automatically detects the completed payment and handles the redirection to the checkout page.
How it works
The typical iDEAL integration flow with Adyen is as follows:
- Checkout: The user initiates an iDEAL payment at the checkout page.
- Select bank: The user is presented with an iDEAL screen where they can choose to scan a QR code or select a bank. If they choose to select a bank, they must select Adyen from the list of banks.
- Select platform: The user is redirected to a platform selection page, located at the
payment_redirect_urlyou provided in the configure required redirect URLs step. From there, they must choose your platform from a list of all supported options. To automate this process, you can have users scan a QR code from your app. - Log in: The user must authenticate themselves on your platform.
- Show details: The user is shown the details of the payment, prompted to authorize the transaction, and potentially select a source balance account (if multiple exist).
- Authorize: The user authorizes the payment using Strong Customer Authentication (SCA).
- Result: Upon successful payment or cancellation, the user is redirected back to the platform's page. The specific URL for this final redirection is returned by the
/payments/confirmendpoint for success cases and the/payments/cancelendpoint for cancellations. The platform then displays the payment outcome, such as "Payment successful" to the user.
The following tabs show example images of the screens that the user sees at each step of the flow.
Integration steps
Follow these steps to implement an iDEAL integration:
- Configure required redirect URLs
- Retrieve payment information
- Check SCA eligibility
- Initiate SCA payment confirmation
- Authenticate user
- Complete SCA payment confirmation
- Cancel a payment
- iDEAL profile endpoints
Configure required redirect URLs
To enable redirection for A2A payment and authentication to your platform, you must configure redirect URLs on your platform.
-
Configure the following redirect URLs on your platform:
-
payment_redirect_url: This is where Adyen sends users after they select your platform from Adyen's platform selection page. This URL should be configured to:- Require the user to log in with their credentials.
- Accept a
payloadquery parameter, which is then used in the/payments/detailsendpoint. - Redirect the user to a payment page that displays the transaction details for authorization.
-
authenticate_redirect_url: Adyen will use this URL to redirect the user to your platform if iDEAL requests user authentication. For details, see the iDEAL profile authenticate endpoint section.
-
-
Provide the specific URLs for these endpoints to Adyen as part of your integration setup.
Both redirect URLs must support HTTPS and be capable of handling query parameters containing transaction context.
Retrieve payment information
Retrieve the iDEAL transaction information before authorization begins. This is done in two situations: after the user scans the payment QR code, or after they are redirected to your payment_redirect_url and have logged in.
-
From your server, make a POST
/payments/detailsrequest specifying the following parameters:Parameter Location Required Applies to Description methodBody 
All The payment method this payment is from. Set to ideal.sourceBody 
method: idealThe source that was used to obtain the payload. Possible values include redirectorqr.payloadBody 
method: idealThe payment payload is an identifier for the payment. It's generated by iDEAL and provided in two ways: as the content of a QR code or as a query parameter during a redirect. The following example shows a request for retrieving transaction information.
-
In the response, note the
tokenand other transaction details. You will need thistokenin the confirm a payment or cancel a payment step. The response also contains the specific details of the transaction. See the details in the following fields:Parameter Description tokenA unique, short-lived identifier for a pending transaction. Its validity period depends on the payment provider; for iDEAL, it's typically around 15 minutes. It is used to reference the specific payment in subsequent /payments/confirmor/payments/cancelendpoint requests.valueThe numerical value of the amount. currencyCurrency of a monetary amount. counterpartyAn object containing information about the counterparty that will receive the funds. counterparty.accountHolderDetails about the account holder who will receive the funds. fullNameThe full name of the counterparty's account holder.typeThe type of account identification. ibanThe IBAN of the bank account. descriptionA description of the transaction. expiresAtThe timestamp when the transaction token expires.
If you encounter any errors, see error codes and messages.
Check SCA eligibility
Before confirming the payment, first check device eligibility. The following tabs explain how to check for SCA eligibility and initiate authentication using Kotlin, Swift, or JavaScript.
You will use the sdkOutput when confirming the payment.
Initiate SCA payment confirmation
Confirm a payment using the token that you obtained when you retrieved the payment information. The operation is secured by Strong Customer Authentication (SCA).
You must complete the second /payments/confirm request within 10 minutes of the initial request in order to complete authentication.
-
Make an initial POST
/payments/confirmrequest specifying the following parameters:Parameter Location Required Description WWW-AuthenticateHeader 
SCA realm: A2APayment.auth-param1: Value of sdkOutput from the Check SCA eligibility step.tokenBody 
A unique, short-lived identifier for a pending transaction. Its validity period depends on the payment provider; for iDEAL, it's typically around 15 minutes. It is used to reference the specific payment in subsequent /payments/confirmor/payments/cancelendpoint requests.balanceAccountIdBody 
Balance account ID of the account where the funds should be substracted. For example, BA00000000000000000000000. -
The API returns a
HTTP 401 - Unauthorized responsewith the message "User needs to perform SCA." The response headers include the following parameters:Parameter Description WWW-AuthenticateThe header containing the SCA challenge. auth-param1An attribute within the WWW-Authenticateheader that holds thesdkInputvalue.sdkInputThe SCA challenge that you must pass to the user's device for authentication. Here is an example of the response header:
-
Pass
auth-param1to the SDK assdkInput.
Authenticate user
To authenticate your user with the Authentication SDK:
-
Trigger the SDK to start user authentication and pass the
auth-param1value from the previous step assdkInput. -
Pass
sdkOutputto your server.
You will use the sdkOutput when completing the payment confirmation.
Complete SCA payment confirmation
After completing the SCA challenge, you can finalize the payment by sending a POST request to the /payments/confirm endpoint. This request submits the sdkOutput from the solved challenge confirming the transaction.
-
Make a second POST
/payments/confirmrequest specifying the following parameters:Parameter Location Required Description WWW-AuthenticateHeader 
SCA realm: A2APayment.auth-param1: Value of sdkOutput from the Authenticate user step.tokenBody 
A unique, short-lived identifier for a pending transaction. Its validity period depends on the payment provider; for iDEAL, it's typically around 15 minutes. It is used to reference the specific payment in subsequent /payments/confirmor/payments/cancelendpoint requests.balanceAccountIdBody 
Balance account ID of the account where the funds should be substracted. For example, BA00000000000000000000000. -
Verify that the response contains a
successobject indicating the transaction was successful, which contains the related links. See the details in the following fields:Parameter Description linksAn object containing one or more links related to the next steps in the payment flow. successAn object containing the URL that the user should be redirected to in order to complete the "success" path of the payment confirmation. hrefThe URL string to which the user should be redirected. For QR code flows initiated on a desktop computer, do not redirect the user from the mobile app back to the platform. The desktop browser automatically detects the completed payment and handles the redirection to the checkout page.
If you encounter any errors, see error codes and messages.
Cancel a payment
Use the /payments/cancel endpoint to cancel a pending payment that has not yet expired or been confirmed. A payment is considered canceled when the redirectUrl in the API response is opened.
-
Make a POST
/payments/cancelrequest specifying the following parameters:Parameter Location Required Description tokenBody 
A unique, short-lived identifier for a pending transaction. Its validity period depends on the payment provider; for iDEAL, it's typically around 15 minutes. It is used to reference the specific payment in subsequent /payments/confirmor/payments/cancelendpoint requests. -
The response for a successful cancellation contains a
linksobject. This object has acancelfield, which includes ahrefproperty that specifies a redirect URL. See the details in the following fields:Parameter Description linksAn object containing one or more links related to the next steps in the payment flow. cancelAn object containing the URL that the user should be redirected to in order to complete the "cancel" path of the payment. hrefThe URL string to which the user should be redirected.
If you encounter any errors, see error codes and messages.
Payment screen requirements
All screens related to the iDEAL flow (payment, profile, and authentication) must comply with iDEAL's UX and regulatory standards. To comply with these standards, your screens must display the following:
- iDEAL/WERO logo: show the iDEAL logo clearly on all screens to indicate the transaction is using iDEAL as the payment method.
- Amount and currency: the full payment amount and currency.
- Payee (recipient): clearly identify who is recieving the payment.
- Payment description: include a brief, user-friendly description of the transaction.
- Account switch option: let users switch balance accounts if needed.
- Confirmation screen with result: For example, in case of success, display a confirmation screen should display with all the transaction details again. These details must include the selected bank account (in IBAN format), the iDEAL payment method, amount and currency, and description.
Design
Adyen requires early access to the wireframes for the iDEAL flow screens within your app or web application. Share these with your Adyen contact as soon as they are available and before you go live, so that they can be validated and you can be informed of any necessary changes early in your development process.
iDEAL profile endpoints
As an optional feature, you can allow users to create and manage their iDEAL profiles. This lets them securely store payment and delivery information, enabling them to make future payments with a single click.
These endpoints are not required for standard iDEAL payment processing but provide a way to interact with the profile management features, offering a faster and more convenient checkout experience for your users. For more details, see the iDEAL Profile FAQ.
Create an iDEAL profile
To create a new iDEAL profile:
-
Make a POST
/ideal/profile/registerrequest specifying the following parameters:Parameter Required Description accountHolderId
The unique identifier for an account holder. paymentInstrumentIds
The IDs for the payment instruments to be associated with the iDEAL profile. -
The response includes a
redirectUrlobject withhrefproperty. Thishrefspecifies a redirect URL. See the details in the following fields:Parameter Description redirectUrlA short-lived URL that redirects the user to the iDEAL profile registration page. You must redirect the user to this URL within 5 seconds of receiving the response. hrefThe URL string to which the user should be redirected. -
Select the
hrefURL and follow the steps to create your iDEAL profile.
Generate a profile management URL
The iDEAL profile management page allows your users to edit their iDEAL profile. For example, they can manage personal details, linked accounts, and delivery addresses, or view trusted webshops. They can also use this page to delete their profile entirely.
To generate a URL for your user's iDEAL profile management page:
-
Make a POST
/ideal/profile/auth-linkrequest specifying the following parameters:Parameter Required Description accountHolderId
The unique identifier for an account holder. -
The response includes a
redirectUrlobject withhrefproperty. Thishrefspecifies a redirect URL. See the details in the following fields:Parameter Description redirectUrlA short-lived URL that redirects the user to the iDEAL profile registration page. You must redirect the user to this URL within 5 seconds of receiving the response. hrefThe URL string to which the user should be redirected.
Authenticate
To generate a URL after a user has been authenticated, typically via Multi-Factor Authentication (MFA) use the /ideal/profile/authenticate endpoint. This is used for actions such as changing profile details or to unmask sensitive payment information.
-
Make a POST
/ideal/profile/authenticaterequest specifying the following parameters:Parameter Required Description accountHolderId
The unique identifier for an account holder. payload
A payload initiated by iDEAL to complete the authentication process. It's generated by iDEAL and provided in two ways: as the content of a QR code or as a query parameter during a redirect. -
The response includes a
redirectUrlobject withhrefproperty. Thishrefspecifies a redirect URL. See the details in the following fields:Parameter Description redirectUrlA short-lived URL that redirects the user to the iDEAL profile registration page. You must redirect the user to this URL within 5 seconds of receiving the response. hrefThe URL string to which the user should be redirected.
Error codes and messages
These are the common error codes. See the descriptions below for details.
A2A payment errors
| Error code | HTTP status | Description |
|---|---|---|
1069_003 |
400 Bad Request | The received token is invalid, malformed, or expired. |
1069_010 |
400 Bad Request | The received payload is invalid, malformed, or expired. |
1069_004 |
422 Unprocessable Entity | Payment has expired and is no longer available. |
1069_005 |
422 Unprocessable Entity | The payment has been locked by another request and can no longer be processed. This may happen if the payment has already been confirmed, canceled, or is currently being processed by another simultaneous request. |
1069_006 |
422 Unprocessable Entity | An unprocessable error occurred related to iDEAL. |
1069_002 |
500 Internal Server Error | An unexpected error occurred related to iDEAL. |
1069_001 |
500 Internal Server Error | A generic server-side error occurred. |
iDEAL profile errors
| Error code | HTTP status | Description |
|---|---|---|
1069_007 |
422 Unprocessable Entity | The provided account already has a registered iDEAL profile. |
1069_008 |
422 Unprocessable Entity | The provided account does not have a registered iDEAL profile. |
1069_009 |
422 Unprocessable Entity | The authenticate payload has expired and is no longer available. |