{"title":"Account-to-account (A2A) payments with iDEAL","category":"default","creationDate":1753199520,"content":"<p>Adyen supports making account-to-account (A2A) payments in the Netherlands through <a href=\"https:\/\/ideal.nl\/en\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">iDEAL<\/a>. This feature allows your users to make online payments using their Adyen business account.<\/p>\n<p>This page explains how to:<\/p>\n<ul>\n<li>Enable Account-to-Account (A2A) payments directly from Adyen business accounts.<\/li>\n<li>Retrieve payment details using the <code>\/payments\/details<\/code> endpoint.<\/li>\n<li>Confirm payments using the <code>\/payments\/confirm<\/code> endpoint<\/li>\n<li>Cancel payments using the <code>\/payments\/cancel<\/code> endpoint.<\/li>\n<\/ul>\n<h2>Requirements<\/h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">You must have the Adyen for Platforms integration that supports business accounts.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><a href=\"\/development-resources\/api-credentials\/\">API credentials<\/a><\/strong><\/td>\n<td style=\"text-align: left;\">The API user making the request must have the following role assigned: <ul><li markdown=\"1\"><strong>Role for A2A Issuer payments - API<\/strong><\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">Some limitations are: <ul><li markdown=\"1\">This documentation is only for platforms or marketplaces operating in the Netherlands.<\/li><li markdown=\"1\">Payments are exclusively facilitated via the iDEAL network.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">You must: <ul><li markdown=\"1\">Have an Adyen business account.<\/li><li markdown=\"1\"><a href=\"\/business-accounts\/implement-sca\/\">Implement Strong Customer Authentication (SCA)<\/a>.<\/li><li markdown=\"1\">Integrate one of two ways: redirect or QR code. The QR code method requires your app to have a built-in QR reader that sends the raw QR information directly to the endpoint.<\/li><li markdown=\"1\">Ensure your platform's user interface and experience (UI\/UX) follows iDEAL's UX and regulatory standards in the  <a href=\"#payment-screen-requirements\">Payment screen requirements<\/a> section.<\/li><li markdown=\"1\">Provide the specific URLs for the <a href=\"#configure-required-redirect-urls\">required redirect URLs<\/a> to Adyen contact.<\/li><li markdown=\"1\">Provide your Adyen contact with a platform logo between (34\u201348) x 34 px.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>iDEAL for A2A payments<\/h2>\n<p>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.<\/p>\n<p>For platforms, this means faster payments, fewer dependencies on external banks, and a smoother user experience.<\/p>\n<h3>How users complete SCA using your platform<\/h3>\n<p>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:<\/p>\n<h3>Redirection<\/h3>\n<p>Users are redirected from the checkout to your platform's app or website to authorize the payment. The user flow is as follows:<\/p>\n<h4>Mobile (App-to-app)<\/h4>\n<ol>\n<li>The user starts the checkout on their mobile device, the mobile browser displays a \"Select your bank\" screen.<\/li>\n<li>The user must select <strong>Adyen<\/strong> from the list, followed by selecting your platform.<\/li>\n<li>The mobile browser opens your platform's app.<\/li>\n<li>The user authorizes the payment within your app and is then automatically redirected back to the checkout in their mobile browser.<\/li>\n<\/ol>\n<h4>Desktop computer<\/h4>\n<ol>\n<li>The user starts the checkout on their desktop computer, the desktop browser displays a \"Select your bank\" screen.<\/li>\n<li>The user selects <strong>Adyen<\/strong> from the list of banks on their desktop browser, followed by selecting your platform.<\/li>\n<li>The desktop browser opens your platform's web login page.<\/li>\n<li>The user authorizes the payment on the web page and is then automatically redirected back to the checkout in their desktop browser.<\/li>\n<\/ol>\n<h3>QR scan<\/h3>\n<p>Users scan an iDEAL QR code on their desktop to authorize the payment via your mobile app. The user flow is as follows:<\/p>\n<h4>Desktop computer<\/h4>\n<ol>\n<li>The user scans the iDEAL QR code displayed in the desktop browser using the QR reader within their mobile app.<\/li>\n<li>This transfers the authorization session from the desktop computer to the mobile device.<\/li>\n<li>After authorizing the payment, your mobile app must only show a success or confirmation screen.<\/li>\n<li>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.<\/li>\n<\/ol>\n<h2>How it works<\/h2>\n<p>The typical iDEAL integration flow with Adyen is as follows:<\/p>\n<ol>\n<li><strong>Checkout<\/strong>: The user initiates an iDEAL payment at the checkout page.<\/li>\n<li><strong>Select bank<\/strong>: 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 <strong>Adyen<\/strong> from the list of banks.<\/li>\n<li><strong>Select platform<\/strong>: The user is redirected to a platform selection page, located at the <code>payment_redirect_url<\/code> you provided in the <a href=\"#configure-required-redirect-urls\">configure required redirect URLs<\/a> 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.<\/li>\n<li><strong>Log in<\/strong>: The user must authenticate themselves on your platform.<\/li>\n<li><strong>Show details<\/strong>: The user is shown the details of the payment, prompted to authorize the transaction, and potentially select a source balance account (if multiple exist).<\/li>\n<li><strong>Authorize<\/strong>: The user authorizes the payment using Strong Customer Authentication (SCA).<\/li>\n<li><strong>Result<\/strong>: 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 <code>\/payments\/confirm<\/code> endpoint for success cases and the <code>\/payments\/cancel<\/code> endpoint for cancellations. The platform then displays the payment outcome, such as \"Payment successful\" to the user.<\/li>\n<\/ol>\n<p>The following tabs show example images of the screens that the user sees at each step of the flow.<\/p>\n\n<div id=\"tabJ3Anx\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Checkout&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-checkout.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;initial checkout\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-checkout.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-checkout&quot;,&quot;oldTabId&quot;:&quot;ideal-checkout_1&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Select bank&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-select-bank.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;select bank\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-select-bank.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-select-bank&quot;,&quot;oldTabId&quot;:&quot;ideal-select-bank_2&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Select platform&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-select-platform.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;select platform\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-select-platform.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-select-platform&quot;,&quot;oldTabId&quot;:&quot;ideal-select-platform_3&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Log in&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-login-platform.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;login to platform\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-login-platform.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-login-platform&quot;,&quot;oldTabId&quot;:&quot;ideal-login-platform_4&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Show details&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-show-details-payment.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;show details of payment\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-show-details-payment.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-show-details-payment&quot;,&quot;oldTabId&quot;:&quot;ideal-show-details-payment_5&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Authorize&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-authorize-payment.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;authorize payment\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-authorize-payment.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-authorize&quot;,&quot;oldTabId&quot;:&quot;ideal-authorize_6&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Result&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;&lt;a rel=\\&quot;lightbox\\&quot; href=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-payment-result.png\\&quot; src=\\&quot;\\&quot;&gt;\\n  &lt;img alt=\\&quot;payment result\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/pfs-business-accounts\\\/ideal-integration-issuing\\\/ideal-payment-result.png\\&quot; \\\/&gt;\\n&lt;\\\/a&gt;&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;ideal-payment-result&quot;,&quot;oldTabId&quot;:&quot;ideal-payment-result_7&quot;,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='true'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<h3>Integration steps<\/h3>\n<p>Follow these steps to implement an iDEAL integration:<\/p>\n<ol>\n<li><a href=\"#configure-required-redirect-urls\">Configure required redirect URLs<\/a><\/li>\n<li><a href=\"#retrieve-payment-information\">Retrieve payment information<\/a><\/li>\n<li><a href=\"#check-sca-eligibility\">Check SCA eligibility<\/a><\/li>\n<li><a href=\"#initiate-sca-payment-confirmation\">Initiate SCA payment confirmation<\/a><\/li>\n<li><a href=\"#authenticate-user\">Authenticate user<\/a><\/li>\n<li><a href=\"#complete-sca-payment-confirmation\">Complete SCA payment confirmation<\/a><\/li>\n<li><a href=\"#cancel-a-payment\">Cancel a payment<\/a><\/li>\n<li><a href=\"#ideal-profile-endpoints\">iDEAL profile endpoints<\/a><\/li>\n<\/ol>\n<h2 id=\"configure-required-redirect-urls\">Configure required redirect URLs<\/h2>\n<p>To enable redirection for A2A payment and authentication to your platform, you must configure redirect URLs on your platform.<\/p>\n<ol>\n<li>\n<p>Configure the following redirect URLs on your platform:<\/p>\n<ul>\n<li>\n<p><code>payment_redirect_url<\/code>: This is where Adyen sends users after they select your platform from Adyen's platform selection page. This URL should be configured to:<\/p>\n<ul>\n<li>Require the user to log in with their credentials.<\/li>\n<li>Accept a <code>payload<\/code> query parameter, which is then used in the <code>\/payments\/details<\/code> endpoint.<\/li>\n<li>Redirect the user to a payment page that displays the transaction details for authorization.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><code>authenticate_redirect_url<\/code>: Adyen will use this URL to redirect the user to your platform if iDEAL requests user authentication. For details, see the <a href=\"#authenticate\">iDEAL profile authenticate endpoint<\/a> section.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Provide the specific URLs for these endpoints to Adyen as part of your integration setup.<\/p>\n<div class=\"notices green\">\n<p>Both redirect URLs must support HTTPS and be capable of handling query parameters containing transaction context.<\/p>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Retrieve payment information<\/h2>\n<p>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 <code>payment_redirect_url<\/code> and have logged in.<\/p>\n<ol>\n<li>\n<p>From your server, make a POST <code>\/payments\/details<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Location<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Applies to<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>method<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">All<\/td>\n<td style=\"text-align: left;\">The payment method this payment is from. Set to <code>ideal<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>source<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><code>method: ideal<\/code><\/td>\n<td style=\"text-align: left;\">The source that was used to obtain the payload. Possible values include <code>redirect<\/code> or <code>qr<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>payload<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><code>method: ideal<\/code><\/td>\n<td style=\"text-align: left;\">The 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.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The following example shows a request for retrieving transaction information.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Retrieve transaction information'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/payments\\\/details' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: ADYEN-API-KEY' \\\\\\n--data '{\\n    \\&quot;method\\&quot;: \\&quot;ideal\\&quot;,\\n    \\&quot;source\\&quot;: \\&quot;redirect\\&quot;,\\n    \\&quot;payload\\&quot;: \\&quot;https:\\\/\\\/ext.tx.ideal.nl\\\/2\\\/A7AFBMA3QHGB5HFNU7SAGEBYFYI?sig=BGBCQEIAE3ECSXSQQMPPFFSG3YNHOS2WOHG7IP67A3LNOGIRN2JIPD455NABCCAGZZSV5OJMARVPO3TIDDU63USPSKU7VRKOKA6VQK2BTXOGJRAY5QM\\&quot;\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>In the response, note the <code>token<\/code> and other transaction details. You will need this <code>token<\/code> in the <a href=\"#initiate-sca-payment-confirmation\">confirm a payment<\/a> or <a href=\"#cancel-a-payment\">cancel a payment<\/a> step. The response also contains the specific details of the transaction. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>token<\/code><\/td>\n<td style=\"text-align: left;\">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 <code>\/payments\/confirm<\/code> or <code>\/payments\/cancel<\/code> endpoint requests.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>value<\/code><\/td>\n<td style=\"text-align: left;\">The numerical value of the amount.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>currency<\/code><\/td>\n<td style=\"text-align: left;\">Currency of a monetary amount.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>counterparty<\/code><\/td>\n<td style=\"text-align: left;\">An object containing information about the counterparty that will receive the funds.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>counterparty.accountHolder<\/code><\/td>\n<td style=\"text-align: left;\">Details about the account holder who will receive the funds.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>fullName<\/code><\/td>\n<td style=\"text-align: left;\">The full name of the <code>counterparty<\/code>'s account holder.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>type<\/code><\/td>\n<td style=\"text-align: left;\">The type of account identification.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>iban<\/code><\/td>\n<td style=\"text-align: left;\">The IBAN of the bank account.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>description<\/code><\/td>\n<td style=\"text-align: left;\">A description of the transaction.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>expiresAt<\/code><\/td>\n<td style=\"text-align: left;\">The timestamp when the transaction token expires.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"token\\\": \\\"eyJ0b2tlbiI6InNvbWVUb2tlbiJ9\\\",\\n  \\\"details\\\": {\\n    \\\"amount\\\": {\\n      \\\"value\\\": 10,\\n      \\\"currency\\\": \\\"EUR\\\"\\n    },\\n    \\\"counterparty\\\": {\\n      \\\"accountHolder\\\": {\\n        \\\"fullName\\\": \\\"The Dutch CookieShop Company N.V.\\\"\\n      },\\n      \\\"accountIdentification\\\": {\\n        \\\"type\\\": \\\"iban\\\",\\n        \\\"iban\\\": \\\"NL44RABO0123456789\\\"\\n      }\\n    },\\n    \\\"description\\\": \\\"26d1f6ca-a55a-4923-b189-e9558b4fb7cd\\\",\\n    \\\"expiresAt\\\": \\\"2026-04-17T15:36:22.77Z\\\"\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<p>If you encounter any errors, see <a href=\"#error-codes-and-messages\">error codes and messages<\/a>.<\/p>\n<h2>Check SCA eligibility<\/h2>\n<p>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.<\/p>\n\n<div id=\"tabs9rzO\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Android (Kotlin)&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;To check if the Android device is eligible for SCA:&lt;\\\/p&gt;\\n&lt;ol&gt;\\n&lt;li&gt;\\n&lt;p&gt;Initiate the &lt;code&gt;AdyenAuthentication&lt;\\\/code&gt; class in your Activity or Fragment.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Initiate authentication&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;kotlin\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;private lateinit var adyenAuthentication: AdyenAuthentication\\\\n\\\\noverride fun onCreate(savedInstanceState: Bundle?) {\\\\n    super.onCreate(savedInstanceState)\\\\n    adyenAuthentication = AdyenAuthentication(this)\\\\n}\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;\\\/li&gt;\\n&lt;li&gt;\\n&lt;p&gt;Check if SCA is available on the device.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Check SCA eligibility&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;kotlin\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;lifecycleScope.launch {\\\\n    val availabilityResult: AvailabilityResult = adyenAuthentication.checkAvailability()\\\\n    if (availabilityResult is AvailabilityResult.Available) {\\\\n        availabilityResult.sdkOutput\\\\n    }\\\\n}\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;The function returns an &lt;code&gt;sdkOutput&lt;\\\/code&gt;.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;li&gt;\\n&lt;p&gt;Pass the &lt;code&gt;sdkOutput&lt;\\\/code&gt; to your server.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;\\\/ol&gt;\\n&quot;,&quot;altTitle&quot;:&quot;kotlin&quot;,&quot;oldTabId&quot;:&quot;sca-eligibility-kotlin_1&quot;,&quot;relation&quot;:&quot;kotlin&quot;},{&quot;title&quot;:&quot;iOS (Swift)&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;To check if the iOS device is eligible for SCA:&lt;\\\/p&gt;\\n&lt;ol&gt;\\n&lt;li&gt;\\n&lt;p&gt;Initialize the &lt;code&gt;AuthenticationService&lt;\\\/code&gt; class.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Initialize authentication service&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;swift\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;let configuration = AuthenticationService.Configuration(\\\\n    localizedRegistrationReason: registrationReason,\\\\n    localizedAuthenticationReason: authenticationReason,\\\\n    appleTeamIdendtifier: appleTeamIdentifier\\\\n)\\\\nlet authenticationService = AuthenticationService(configuration: configuration)\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;\\\/li&gt;\\n&lt;li&gt;\\n&lt;p&gt;Check if SCA is available on the device.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Check SCA eligibility&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;swift\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;let sdkOutput = try authenticationService.checkSupport()\\\\n\\\\\\\/\\\\\\\/\\\\\\\/ send the sdkOutput to your backend\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;The function returns an &lt;code&gt;sdkOutput&lt;\\\/code&gt;.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;li&gt;\\n&lt;p&gt;Pass the &lt;code&gt;sdkOutput&lt;\\\/code&gt; to your server.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;\\\/ol&gt;\\n&quot;,&quot;altTitle&quot;:&quot;swift&quot;,&quot;oldTabId&quot;:&quot;sca-eligibility-swift_2&quot;,&quot;relation&quot;:&quot;swift&quot;},{&quot;title&quot;:&quot;Web (JavaScript)&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;To check if the web browser on your web-enabled device is eligible for SCA:&lt;\\\/p&gt;\\n&lt;ol&gt;\\n&lt;li&gt;\\n&lt;p&gt;Import the node package in your application. &lt;\\\/p&gt;\\n&lt;p&gt;&lt;code&gt;RelyingPartyName&lt;\\\/code&gt; is the name the user will be presented with when creating or validating a &lt;code&gt;WebAuthn&lt;\\\/code&gt; operation. We recommend that the value of the &lt;code&gt;RelyingPartyName&lt;\\\/code&gt; be the merchant name or the URL domain.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Import web sdk and initiate authentication&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=\\&quot;[{&amp;quot;language&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;import ScaWebauthn from &#039;@adyen\\\\\\\/bpscaweb&#039;;\\\\n\\\\nconst scaWebauthn = ScaWebauthn.create({ \\\\n    relyingPartyName: &#039;merchant&#039;,\\\\n});\\\\n\\\\nconst sdkOutput = await scaWebauthn.checkAvailability().catch((error) =&amp;gt; \\\\\\\/* SCA_UNAVAILABLE error*\\\\\\\/);&amp;quot;}]\\&quot; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;If the user&#039;s browser supports SCA, the function returns &lt;code&gt;sdkOutput&lt;\\\/code&gt; to exchange in requests to the server. If SCA is not supported, the method throws an &lt;code&gt;SCA_UNAVAILABLE&lt;\\\/code&gt; error.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;li&gt;\\n&lt;p&gt;Pass the &lt;code&gt;sdkOutput&lt;\\\/code&gt; to your server.&lt;\\\/p&gt;\\n&lt;\\\/li&gt;\\n&lt;\\\/ol&gt;\\n&quot;,&quot;altTitle&quot;:&quot;javascript&quot;,&quot;oldTabId&quot;:&quot;sca-eligibility-javascript_3&quot;,&quot;relation&quot;:&quot;javascript&quot;}]\"\n            :should-update-when-url-changes='true'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<p>You will use the <code>sdkOutput<\/code> when <a href=\"#initiate-sca-payment-confirmation\">confirming the payment<\/a>.<\/p>\n<h2>Initiate SCA payment confirmation<\/h2>\n<p>Confirm a payment using the <code>token<\/code> that you obtained when you <a href=\"#retrieve-payment-information\">retrieved the payment information<\/a>. The operation is secured by Strong Customer Authentication (SCA).<\/p>\n<div class=\"notices green\">\n<p>You must complete the second <code>\/payments\/confirm<\/code> request within 10 minutes of the initial request in order to complete authentication.<\/p>\n<\/div>\n<ol>\n<li>\n<p>Make an initial POST <code>\/payments\/confirm<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: left;\">Location<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>WWW-Authenticate<\/code><\/td>\n<td style=\"text-align: left;\">Header<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td><code>SCA realm<\/code>: <strong>A2APayment<\/strong>.<br><code>auth-param1<\/code>: Value of <strong>sdkOutput<\/strong> from the <a href=\"#check-sca-eligibility\">Check SCA eligibility<\/a> step.<\/td>\n<\/tr>\n<tr>\n<td><code>token<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>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 <code>\/payments\/confirm<\/code> or <code>\/payments\/cancel<\/code> endpoint requests.<\/td>\n<\/tr>\n<tr>\n<td><code>balanceAccountId<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>Balance account ID of the account where the funds should be substracted. For example, <code>BA00000000000000000000000<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Confirm a payment - initial request'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/payments\\\/confirm' \\\\\\n--header 'WWW-Authenticate: SCA realm=\\&quot;A2APayment\\&quot; auth-param1=\\&quot;eyJkZXZpY2UiOiJpT1MiLCJAdHlwZSI6ImNvbS5hZHllbi53ZWJhdXRobi5lbnRpdGllcy5BdXRoZW50aWNhdGlvbkFwcERhdGEifQ==\\&quot;' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: ADYEN-API-KEY' \\\\\\n--data '{\\n    \\&quot;token\\&quot;:\\&quot;BQABAQA2th6I0RbAQLWVNC9Q2bycAGxVf11\\\/HT9pDXPpvVX1QwjYdvOAGLUj4lE0b9LEXLYUJ14zRzr+ETknWhWZ1Y7RF3L6ckElVX+CmQ8mYI9cJ7ADvqiLDMV2daxtmsAeT7BjV7GwX1rwGPsY6FXeEI9MH6PI6nSklPbbsA8adF8Y1EUJqeXWMqWDW+ddqDylfWF8uy5zQPBsRsU64zsP+COeWxJEpYSodPIGTSbpACi8+81Xx5sTBROpnNrslnQBlUEFk9hlnCc3XE5ZMTEyor3XVzjfgjsKEHN9PzewMo7dC+loHL5FEk0r5iYZJoPwT47+Vsj8FFLAA\\\/\\\/ywhuDjT8GDMfFb3X5pwXSMPtsEgAAnEnm+6Y\\\/LClpYZ\\\/CBNW1JE1h6LWYvUn+V3zueak\\\/Qwk0EcJWDo5kC0QSRhaP+LeRgWwOMCpVGx6hD\\\/tfa4EM3Q4uwoo7+4jiuw7BdPkvFyljYtV6UJqbZguCmYMSJQ09hXVvc8L3gz+PvL3xP6berp8oiKMmC5NjzfQdbdLA9u\\\/0pyOIbmkx9LGr3wVRgZqsfx9Bp3H\\\/mqZOA4JdrKEL8iA\\\/yamOWxlYdwj0SpDZWPjvJoyBPxIIq3YgLuAHSBwU0lHgPEyXHJUrh6SCVA==\\&quot;,\\n    \\&quot;balanceAccountId\\&quot;: \\&quot;BA32272223222K5JF79DL53KQ\\&quot;\\n\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The API returns a <code>HTTP 401 - Unauthorized response<\/code> with the message \"User needs to perform SCA.\" The response headers include the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>WWW-Authenticate<\/code><\/td>\n<td style=\"text-align: left;\">The header containing the SCA challenge.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>auth-param1<\/code><\/td>\n<td style=\"text-align: left;\">An attribute within the <code>WWW-Authenticate<\/code> header that holds the <code>sdkInput<\/code> value.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>sdkInput<\/code><\/td>\n<td style=\"text-align: left;\">The SCA challenge that you must pass to the user's device for authentication.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Here is an example of the response header:<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response header'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"\\\"WWW-Authenticate: SCA realm=\\\"A2APayment\\\" auth-param1=\\\"eyJ2YWx1ZSI6InNvbWUgb3BhcXVlIGpzb24gd2l0aCB0aGUgU0NBIGNoYWxsZW5nZSJ9\\\"\\\"\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Pass <code>auth-param1<\/code> to the SDK as <code>sdkInput<\/code>.<\/p>\n<\/li>\n<\/ol>\n<h2>Authenticate user<\/h2>\n<p>To authenticate your user with the Authentication SDK:<\/p>\n<ol>\n<li>\n<p>Trigger the SDK to start user authentication and pass the <code>auth-param1<\/code> value from <a href=\"#initiate-sca-payment-confirmation\">the previous step<\/a> as <code>sdkInput<\/code>.<\/p>\n\n<div id=\"tab9bw8g\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Android (Kotlin)&quot;,&quot;content&quot;:&quot;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Authenticate with SCA SDK&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;kotlin\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;lifecycleScope.launch {\\\\n        if (adyenAuthentication.hasCredential(\\\\\\&quot;sdkInput\\\\\\&quot;)) {\\\\n            \\\\\\\/\\\\\\\/ Authenticate existing credential\\\\n            val authenticationResult: AuthenticationResult = adyenAuthentication.authenticate(\\\\\\&quot;sdkInput\\\\\\&quot;)\\\\n            when (authenticationResult) {\\\\n                is AuthenticationResult.AuthenticationSuccessful -&amp;gt; {\\\\n                    authenticationResult.sdkOutput\\\\n                }\\\\n                is AuthenticationResult.Canceled -&amp;gt; {\\\\n                    \\\\\\\/\\\\\\\/ User cancelled the authentication flow\\\\n                }\\\\n                is AuthenticationResult.Error -&amp;gt; {\\\\n                    \\\\\\\/\\\\\\\/ Unexpected error\\\\n                    authenticationResult.errorMessage\\\\n                }\\\\n                is AuthenticationResult.AuthenticationError -&amp;gt; {\\\\n                    \\\\\\\/\\\\\\\/ FIDO API Error\\\\n                    authenticationResult.authenticationError\\\\n                }\\\\n            }\\\\n        } else {\\\\n            \\\\\\\/\\\\\\\/ None of the existing credentials exist in this device\\\\n        }\\\\n    }\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;If successful, the SDK generates a Base64-encoded &lt;code&gt;sdkOutput&lt;\\\/code&gt; data blob.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;kotlin&quot;,&quot;oldTabId&quot;:&quot;authenticate-user-kotlin_1&quot;,&quot;relation&quot;:&quot;kotlin&quot;},{&quot;title&quot;:&quot;iOS (Swift)&quot;,&quot;content&quot;:&quot;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Authenticate with SCA SDK&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;swift\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;delegatedAuthenticationSession.authenticate(withBase64URLString: sdkInput) { [weak self] result in\\\\n        switch result {\\\\n        case let .success(sdkOutput):\\\\n            \\\\\\\/\\\\\\\/\\\\\\\/ send the sdkOutput to the backend\\\\n        case let .failure(error):\\\\n            \\\\\\\/\\\\\\\/\\\\\\\/ authentication failed\\\\n        }\\\\n    }\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;The SDK uses the &lt;a href=\\&quot;https:\\\/\\\/developer.apple.com\\\/documentation\\\/devicecheck\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot; class=\\&quot;external-link no-image\\&quot;&gt;Apple DeviceCheck framework&lt;\\\/a&gt; to generate a Base64-encoded &lt;code&gt;sdkOutput&lt;\\\/code&gt; data blob. To do this, the SDK authenticates the user using Touch ID, Face ID, or the device passcode. To enable Face ID support, add &lt;code&gt;NSFaceIDUsageDescription&lt;\\\/code&gt; to &lt;code&gt;Info.plist&lt;\\\/code&gt;.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;swift&quot;,&quot;oldTabId&quot;:&quot;authenticate-user-swift_2&quot;,&quot;relation&quot;:&quot;swift&quot;},{&quot;title&quot;:&quot;Web (JavaScript)&quot;,&quot;content&quot;:&quot;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Authenticate with SCA SDK&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;javascript\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;const sdkOutput = await scaWebauthn.authenticate(sdkInput);\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;If successful, the SDK generates a Base64-encoded &lt;code&gt;sdkOutput&lt;\\\/code&gt; data blob.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:&quot;javascript&quot;,&quot;oldTabId&quot;:&quot;authenticate-user-javascript_3&quot;,&quot;relation&quot;:&quot;javascript&quot;}]\"\n            :should-update-when-url-changes='true'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<\/li>\n<li>\n<p>Pass <code>sdkOutput<\/code> to your server.<\/p>\n<\/li>\n<\/ol>\n<p>You will use the sdkOutput when <a href=\"#complete-sca-payment-confirmation\">completing the payment confirmation<\/a>.<\/p>\n<h2>Complete SCA payment confirmation<\/h2>\n<p>After completing the SCA challenge, you can finalize the payment by sending a POST request to the <code>\/payments\/confirm<\/code> endpoint. This request submits the <code>sdkOutput<\/code> from the solved challenge confirming the transaction.<\/p>\n<ol>\n<li>\n<p>Make a second POST <code>\/payments\/confirm<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: left;\">Location<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>WWW-Authenticate<\/code><\/td>\n<td style=\"text-align: left;\">Header<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td><code>SCA realm<\/code>: <strong>A2APayment<\/strong>.<br><code>auth-param1<\/code>: Value of <strong>sdkOutput<\/strong> from the <a href=\"#authenticate-user\">Authenticate user<\/a> step.<\/td>\n<\/tr>\n<tr>\n<td><code>token<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>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 <code>\/payments\/confirm<\/code> or <code>\/payments\/cancel<\/code> endpoint requests.<\/td>\n<\/tr>\n<tr>\n<td><code>balanceAccountId<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>Balance account ID of the account where the funds should be substracted. For example, <code>BA00000000000000000000000<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Confirm a payment - final request'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/payments\\\/confirm' \\\\\\n--header 'WWW-Authenticate: SCA realm=\\&quot;A2APayment\\&quot; auth-param1=\\&quot;eyJhc3NlcnRpb25PYmplY3QiOiJ2Mmx6YVdkdVlYUjFjbVZZUnpCRkFpQnJsWTlqUHBraWI3OG1hd2RRUDdKei9oSlI4QWVCYnVsQzBHNExTcStrTGdJaEFNWEF5anVlbDJPQ1JQZ1lybktZbklwZS9STkJ3dFRTV2dXOGd0c0I5S1pIY1dGMWRHaGxiblJwWTJGMGIzSkVZWFJoV0NVZ1cwOTd6b2lidDNTK3VVcm5iWHZROW82VlhFOWR0amdVTVpCMUtkZDFJVVVBQUFBQS93PT0iLCJjcmVkZW50aWFsSWQiOiJUZGwyOEZaY3lhblBuRVJHRkFmSytUcGJoc2tWSnh6YzFDZys3Tzd2aDRBPSIsInJwSWQiOiJCMk5ZU1M1OTMyLmNvbS5hZHllbi5BZHllbjNEUzJEZW1vIiwicHNwUmVmZXJlbmNlIjoiQlNDUjQyOTY4MjIzMjIzUDVNVDdCNTM1TTM0RlBUX18wMC0yM2ViYTgzN2Y5ZDM2OGE3OWU4ODBmM2JlNGQxNTAzZC00YWI1MWE0ZGNmYjc0NzM1LTAxIiwidHJhY2luZyI6IjAwLTIzZWJhODM3ZjlkMzY4YTc5ZTg4MGYzYmU0ZDE1MDNkLTRhYjUxYTRkY2ZiNzQ3MzUtMDEiLCJkZXZpY2UiOiJpT1MifQ==\\&quot;' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: ADYEN-API-KEY' \\\\\\n--data '{\\n    \\&quot;token\\&quot;:\\&quot;BQABAQA2th6I0RbAQLWVNC9Q2bycAGxVf11\\\/HT9pDXPpvVX1QwjYdvOAGLUj4lE0b9LEXLYUJ14zRzr+ETknWhWZ1Y7RF3L6ckElVX+CmQ8mYI9cJ7ADvqiLDMV2daxtmsAeT7BjV7GwX1rwGPsY6FXeEI9MH6PI6nSklPbbsA8adF8Y1EUJqeXWMqWDW+ddqDylfWF8uy5zQPBsRsU64zsP+COeWxJEpYSodPIGTSbpACi8+81Xx5sTBROpnNrslnQBlUEFk9hlnCc3XE5ZMTEyor3XVzjfgjsKEHN9PzewMo7dC+loHL5FEk0r5iYZJoPwT47+Vsj8FFLAA\\\/\\\/ywhuDjT8GDMfFb3X5pwXSMPtsEgAAnEnm+6Y\\\/LClpYZ\\\/CBNW1JE1h6LWYvUn+V3zueak\\\/Qwk0EcJWDo5kC0QSRhaP+LeRgWwOMCpVGx6hD\\\/tfa4EM3Q4uwoo7+4jiuw7BdPkvFyljYtV6UJqbZguCmYMSJQ09hXVvc8L3gz+PvL3xP6berp8oiKMmC5NjzfQdbdLA9u\\\/0pyOIbmkx9LGr3wVRgZqsfx9Bp3H\\\/mqZOA4JdrKEL8iA\\\/yamOWxlYdwj0SpDZWPjvJoyBPxIIq3YgLuAHSBwU0lHgPEyXHJUrh6SCVA==\\&quot;,\\n    \\&quot;balanceAccountId\\&quot;: \\&quot;BA32272223222K5JF79DL53KQ\\&quot;\\n\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Verify that the response contains a <code>success<\/code> object indicating the transaction was successful, which contains the related links. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>links<\/code><\/td>\n<td style=\"text-align: left;\">An object containing one or more links related to the next steps in the payment flow.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>success<\/code><\/td>\n<td style=\"text-align: left;\">An object containing the URL that the user should be redirected to in order to complete the \"success\" path of the payment confirmation.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>href<\/code><\/td>\n<td style=\"text-align: left;\">The URL string to which the user should be redirected.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"links\\\": {\\n        \\\"success\\\": {\\n            \\\"href\\\": \\\"https:\\\/\\\/checkoutshopper-test.adyen.com\\\/checkoutshopper\\\/checkoutPaymentReturn?gpid=GPEB06E7D8AC9D9AB5&amp;pspEchoData=ZLLRBHX6KWMWSD75%3A821204%3Aj7igk8cQHA5rQ1fetWe8Yyn0%2BOc%3D\\\"\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div class=\"sc-notice info\"><div>\n<p>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.<\/p>\n<\/div><\/div>\n<\/li>\n<\/ol>\n<p>If you encounter any errors, see <a href=\"#error-codes-and-messages\">error codes and messages<\/a>.<\/p>\n<h2>Cancel a payment<\/h2>\n<p>Use the <code>\/payments\/cancel<\/code> endpoint to cancel a pending payment that has not yet expired or been confirmed. A payment is considered canceled when the <code>redirectUrl<\/code> in the API response is opened.<\/p>\n<ol>\n<li>\n<p>Make a POST <code>\/payments\/cancel<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: left;\">Location<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>token<\/code><\/td>\n<td style=\"text-align: left;\">Body<\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>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 <code>\/payments\/confirm<\/code> or <code>\/payments\/cancel<\/code> endpoint requests.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Cancel a payment'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/payments\\\/cancel' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: ADYEN-API-KEY' \\\\\\n--data '{\\n    \\&quot;token\\&quot;:\\&quot;BQABAQA2th6I0RbAQLWVNC9Q2bycAGxVf11\\\/HT9pDXPpvVX1QwjYdvOAGLUj4lE0b9LEXLYUJ14zRzr+ETknWhWZ1Y7RF3L6ckElVX+CmQ8mYI9cJ7ADvqiLDMV2daxtmsAeT7BjV7GwX1rwGPsY6FXeEI9MH6PI6nSklPbbsA8adF8Y1EUJqeXWMqWDW+ddqDylfWF8uy5zQPBsRsU64zsP+COeWxJEpYSodPIGTSbpACi8+81Xx5sTBROpnNrslnQBlUEFk9hlnCc3XE5ZMTEyor3XVzjfgjsKEHN9PzewMo7dC+loHL5FEk0r5iYZJoPwT47+Vsj8FFLAA\\\/\\\/ywhuDjT8GDMfFb3X5pwXSMPtsEgAAnEnm+6Y\\\/LClpYZ\\\/CBNW1JE1h6LWYvUn+V3zueak\\\/Qwk0EcJWDo5kC0QSRhaP+LeRgWwOMCpVGx6hD\\\/tfa4EM3Q4uwoo7+4jiuw7BdPkvFyljYtV6UJqbZguCmYMSJQ09hXVvc8L3gz+PvL3xP6berp8oiKMmC5NjzfQdbdLA9u\\\/0pyOIbmkx9LGr3wVRgZqsfx9Bp3H\\\/mqZOA4JdrKEL8iA\\\/yamOWxlYdwj0SpDZWPjvJoyBPxIIq3YgLuAHSBwU0lHgPEyXHJUrh6SCVA==\\&quot;\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The response for a successful cancellation contains a <code>links<\/code> object. This object has a <code>cancel<\/code> field, which includes a <code>href<\/code> property that specifies a redirect URL. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>links<\/code><\/td>\n<td style=\"text-align: left;\">An object containing one or more links related to the next steps in the payment flow.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>cancel<\/code><\/td>\n<td style=\"text-align: left;\">An object containing the URL that the user should be redirected to in order to complete the \"cancel\" path of the payment.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>href<\/code><\/td>\n<td style=\"text-align: left;\">The URL string to which the user should be redirected.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"links\\\": {\\n        \\\"cancel\\\": {\\n            \\\"href\\\": \\\"https:\\\/\\\/ext.pay.ideal.nl\\\/transactions\\\/HTTPS%3A%2F%2FEXT.TX.IDEAL.NL%2F2%2FA2JXWE33UOOXZXPMJBMV46AR7U4\\\/cancellation-and-merchant-redirection?sig=BGBCAEIDYUXOMFC3ETVAYBKLQYCELNFFXJXYP5HI6CR7VNFEKDPYH6K7XMQBCA3WTS2IIH5UT7C5BQDIMLDO4CANJ2YY3VEE422LUFUNIQRGLDGZU\\\"\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<p>If you encounter any errors, see <a href=\"#error-codes-and-messages\">error codes and messages<\/a>.<\/p>\n<h2>Payment screen requirements<\/h2>\n<p>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:<\/p>\n<ul>\n<li><strong>iDEAL\/WERO logo<\/strong>: show the iDEAL logo clearly on all screens to indicate the transaction is using iDEAL as the payment method.<\/li>\n<li><strong>Amount and currency<\/strong>: the full payment amount and currency.<\/li>\n<li><strong>Payee (recipient)<\/strong>: clearly identify who is recieving the payment.<\/li>\n<li><strong>Payment description<\/strong>: include a brief, user-friendly description of the transaction.<\/li>\n<li><strong>Account switch option<\/strong>: let users switch balance accounts if needed.<\/li>\n<li><strong>Confirmation screen with result<\/strong>: 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.<\/li>\n<\/ul>\n<h3>Design<\/h3>\n<p>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.<\/p>\n<h2>iDEAL profile endpoints<\/h2>\n<p>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.<\/p>\n<p>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 <a href=\"https:\/\/ideal.nl\/en\/products\/faq-ideal-profiel\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">iDEAL Profile FAQ<\/a>.<\/p>\n<h3>Create an iDEAL profile<\/h3>\n<p>To create a new iDEAL profile:<\/p>\n<ol>\n<li>\n<p>Make a POST <code>\/ideal\/profile\/register<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>accountHolderId<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>The unique identifier for an account holder.<\/td>\n<\/tr>\n<tr>\n<td><code>paymentInstrumentIds<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>The IDs for the payment instruments to be associated with the iDEAL profile.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Create a new profile'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/ideal\\\/profile\\\/register' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: YOUR_API_KEY' \\\\\\n--data '{\\n    \\&quot;accountHolderId\\&quot;: \\&quot;AH00000000000000000000001\\&quot;,\\n    \\&quot;paymentInstrumentIds\\&quot;: [\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;]\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The response includes a  <code>redirectUrl<\/code> object with <code>href<\/code> property. This <code>href<\/code> specifies a redirect URL. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>redirectUrl<\/code><\/td>\n<td style=\"text-align: left;\">A 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.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>href<\/code><\/td>\n<td style=\"text-align: left;\">The URL string to which the user should be redirected.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"redirectUrl\\\": {\\n    \\\"href\\\": \\\"https:\\\/\\\/ext.profile.ideal.nl\\\/session\\\/eyJraWQiOiJpcHIxIiwidHlwIjoiSldUIiwiYWxnIjoiRVMyNTYifQ.eyJzdWIiOiJQUk9GSUxFOnpEU0JyMmlxVjVjekxyb3BuaUNZVDRUVVRaeVpGM21vIiwic3ViX2luZm8iOiJBRFlCTkwyQSIsImV4cCI6MTc1NTg1OTEzOCwicmVzb3VyY2UiOiJQQUdFOlBST0ZJTEVfUkVHSVNUUkFUSU9OX1BBR0VfVjIiLCJqdGkiOiJjODBhYTA3MS0zMzMwLTRkNTctYWNmMy0xNjkxMDk0ZTE1MjMifQ.XYL8uGHe6yRVL1AMxzH-BhecY3W2nuJZa6-bnc-WjQ8So8PCMm7NQ2_cWGvLa8hkiEiT66Nq_pRKpZL-aJgAiA\\\"\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Select the <code>href<\/code> URL and follow the steps to create your iDEAL profile.<\/p>\n<\/li>\n<\/ol>\n<h3>Generate a profile management URL<\/h3>\n<p>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.<\/p>\n<p>To generate a URL for your user's iDEAL profile management page:<\/p>\n<ol>\n<li>\n<p>Make a POST <code>\/ideal\/profile\/auth-link<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>accountHolderId<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>The unique identifier for an account holder.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Generate a profile management URL'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/ideal\\\/profile\\\/auth-link' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: YOUR_API_KEY' \\\\\\n--data '{ \\&quot;accountHolderId\\&quot;: \\&quot;AH00000000000000000000001\\&quot; }'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The response includes a  <code>redirectUrl<\/code> object with <code>href<\/code> property. This <code>href<\/code> specifies a redirect URL. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>redirectUrl<\/code><\/td>\n<td style=\"text-align: left;\">A 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.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>href<\/code><\/td>\n<td style=\"text-align: left;\">The URL string to which the user should be redirected.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"redirectUrl\\\": {\\n    \\\"href\\\": \\\"https:\\\/\\\/ext.profile.ideal.nl\\\/session\\\/eyJraWQiOiJpcHIxIiwidHlwIjoiSldUIiwiYWxnIjoiRVMyNTYifQ.eyJzdWIiOiJQUk9GSUxFOkI2NDR6Z0RzalU5bWNaWmdwaE53Y3JLeXRmMDh5aVZHIiwic3ViX2luZm8iOiJBRFlCTkwyQSIsImV4cCI6MTc1NTg1ODk0NSwicmVzb3VyY2UiOiJQQUdFOlBST0ZJTEVfTUFOQUdFTUVOVF9QQUdFIiwianRpIjoiOWQyYmM4YTItZmZjMS00NzkyLTljNTQtNmEzNGQ1NzAyNGU2In0.b6jvGX0IXtMMe3Vjn3cCVSkikTKeZzEBsaG-7_ZG9xqvFANS4_IulZ57vR-6Lvd1fZ8PCTHOw1-ZH2gtsmHfZQ\\\"\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h3>Authenticate<\/h3>\n<p>To generate a URL after a user has been authenticated, typically via Multi-Factor Authentication (MFA) use the <code>\/ideal\/profile\/authenticate<\/code> endpoint. This is used for actions such as changing profile details or to unmask sensitive payment information.<\/p>\n<ol>\n<li>\n<p>Make a POST <code>\/ideal\/profile\/authenticate<\/code> request specifying the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>accountHolderId<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>The unique identifier for an account holder.<\/td>\n<\/tr>\n<tr>\n<td><code>payload<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>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.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Create a new profile'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl --location --request POST 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/a2aissuer-api\\\/v1\\\/ideal\\\/profile\\\/authenticate' \\\\\\n--header 'Content-Type: application\\\/json' \\\\\\n--header 'x-api-key: {ADYEN_API_KEY}' \\\\\\n--data '{\\n    \\&quot;accountHolderId\\&quot;: \\&quot;AH00000000000000000000001\\&quot;,\\n    \\&quot;payload\\&quot;: \\&quot;https:\\\/\\\/AU.IDEAL.NL\\\/2\\\/RECOGNIZE_PROFILE_BY_CIT\\\/I45ECVKSKI4TANRUIRCFIMSXGFJFOORVJNFEMQ2VIRATUMJXGU2DQOJYGY4TS?sig=BGBDAEIIAUVQ5SYITU4JVDF3URUJ6AQSHXYDDBRLEP3EN5DFNK3TPDHFA75XQEIIAYMT7AZMHUDZKRNQS4OMSRCJ5NOCX4JG2GFN5U44AIC6EADUOEDFA\\&quot;\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The response includes a  <code>redirectUrl<\/code> object with <code>href<\/code> property. This <code>href<\/code> specifies a redirect URL. See the details in the following fields:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>redirectUrl<\/code><\/td>\n<td style=\"text-align: left;\">A 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.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>href<\/code><\/td>\n<td style=\"text-align: left;\">The URL string to which the user should be redirected.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"redirectUrl\\\": {\\n    \\\"href\\\": \\\"https:\\\/\\\/ext.profile.ideal.nl\\\/auth\\\/session\\\/eyJraWQiOiJpcGEtZXh0IiwidHlwIjoiSldUIiwiYWxnIjoiRVMyNTYifQ.eyJzdWIiOiJTRVNTSU9OX1BBR0U6Tk9ORSIsImV4cCI6MTc1NTg1OTE0OCwicmVzb3VyY2UiOiJBVVRIX1JFUVVFU1Q6SFRUUFM6Ly9BVS5JREVBTC5OTC8yL1JFQ09HTklaRV9QUk9GSUxFX0JZX0NJVC9JNDVFNE1aWkpSRlVFVVNOSlU0VlVTMlFHNU5GTU9TWUpWS1RBVFNMS0kyVFVNSlhHVTJUUU5KWkdNM1RHIiwianRpIjoiODY0MDEwOWEtOGEyMS00OWEwLWE0YTUtZTlmNmJiMDdjYzdhIiwiYXV0aG9yaXRpZXMiOlsiU0VUVVBfUFJPRklMRV9BVVRIX0NPT0tJRSJdfQ.dM8DM1RUaa0o9rdvOyBLi2S1y1-nDOXlUdGUgIbPH0AJUrMI9Lnc4Cmz1_30NcwN0cJzlWyX5l_ni3NmFrLBfg\\\"\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Error codes and messages<\/h2>\n<p>These are the common error codes. See the descriptions below for details.<\/p>\n<h4>A2A payment errors<\/h4>\n<table>\n<thead>\n<tr>\n<th>Error code<\/th>\n<th style=\"text-align: center;\">HTTP status<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>1069_003<\/code><\/td>\n<td style=\"text-align: center;\">400 Bad Request<\/td>\n<td>The received token is invalid, malformed, or expired.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_010<\/code><\/td>\n<td style=\"text-align: center;\">400 Bad Request<\/td>\n<td>The received payload is invalid, malformed, or expired.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_004<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>Payment has expired and is no longer available.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_005<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>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.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_006<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>An unprocessable error occurred related to iDEAL.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_002<\/code><\/td>\n<td style=\"text-align: center;\">500 Internal Server Error<\/td>\n<td>An unexpected error occurred related to iDEAL.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_001<\/code><\/td>\n<td style=\"text-align: center;\">500 Internal Server Error<\/td>\n<td>A generic server-side error occurred.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>iDEAL profile errors<\/h4>\n<table>\n<thead>\n<tr>\n<th>Error code<\/th>\n<th style=\"text-align: center;\">HTTP status<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>1069_007<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>The provided account already has a registered iDEAL profile.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_008<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>The provided account does not have a registered iDEAL profile.<\/td>\n<\/tr>\n<tr>\n<td><code>1069_009<\/code><\/td>\n<td style=\"text-align: center;\">422 Unprocessable Entity<\/td>\n<td>The authenticate payload has expired and is no longer available.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/business-accounts\/transactions\"\n                        target=\"_self\"\n                        >\n                    Track transactions\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/business-accounts\/send-funds-ideal-integration","articleFields":{"description":"Learn how to integrate A2A payment flow through Adyen.","feedback_component":true,"id":"25196327","type":"page","_expandable":{"operations":""},"status":"current","parameters":{"directoryPath":"\/business-accounts","model":"balance platform"},"last_edit_on":"22-08-2025 17:52"},"algolia":{"url":"https:\/\/docs.adyen.com\/business-accounts\/send-funds-ideal-integration","title":"Account-to-account (A2A) payments with iDEAL","content":"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.\nThis page explains how to:\n\nEnable Account-to-Account (A2A) payments directly from Adyen business accounts.\nRetrieve payment details using the \/payments\/details endpoint.\nConfirm payments using the \/payments\/confirm endpoint\nCancel payments using the \/payments\/cancel endpoint.\n\nRequirements\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nYou must have the Adyen for Platforms integration that supports business accounts.\n\n\nAPI credentials\nThe API user making the request must have the following role assigned: Role for A2A Issuer payments - API\n\n\nLimitations\nSome limitations are: This documentation is only for platforms or marketplaces operating in the Netherlands.Payments are exclusively facilitated via the iDEAL network.\n\n\nSetup steps\nYou must: Have an Adyen business account.Implement Strong Customer Authentication (SCA).Integrate one of two ways: redirect or QR code. The QR code method requires your app to have a built-in QR reader that sends the raw QR information directly to the endpoint.Ensure your platform's user interface and experience (UI\/UX) follows iDEAL's UX and regulatory standards in the  Payment screen requirements section.Provide the specific URLs for the required redirect URLs to Adyen contact.Provide your Adyen contact with a platform logo between (34\u201348) x 34 px.\n\n\n\niDEAL for A2A payments\nAfter 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.\nFor platforms, this means faster payments, fewer dependencies on external banks, and a smoother user experience.\nHow users complete SCA using your platform\nTo 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:\nRedirection\nUsers are redirected from the checkout to your platform's app or website to authorize the payment. The user flow is as follows:\nMobile (App-to-app)\n\nThe user starts the checkout on their mobile device, the mobile browser displays a \"Select your bank\" screen.\nThe user must select Adyen from the list, followed by selecting your platform.\nThe mobile browser opens your platform's app.\nThe user authorizes the payment within your app and is then automatically redirected back to the checkout in their mobile browser.\n\nDesktop computer\n\nThe user starts the checkout on their desktop computer, the desktop browser displays a \"Select your bank\" screen.\nThe user selects Adyen from the list of banks on their desktop browser, followed by selecting your platform.\nThe desktop browser opens your platform's web login page.\nThe user authorizes the payment on the web page and is then automatically redirected back to the checkout in their desktop browser.\n\nQR scan\nUsers scan an iDEAL QR code on their desktop to authorize the payment via your mobile app. The user flow is as follows:\nDesktop computer\n\nThe user scans the iDEAL QR code displayed in the desktop browser using the QR reader within their mobile app.\nThis transfers the authorization session from the desktop computer to the mobile device.\nAfter authorizing the payment, your mobile app must only show a success or confirmation screen.\nDo 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.\n\nHow it works\nThe typical iDEAL integration flow with Adyen is as follows:\n\nCheckout: The user initiates an iDEAL payment at the checkout page.\nSelect 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.\nSelect platform: The user is redirected to a platform selection page, located at the payment_redirect_url you 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.\nLog in: The user must authenticate themselves on your platform.\nShow 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).\nAuthorize: The user authorizes the payment using Strong Customer Authentication (SCA).\nResult: 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\/confirm endpoint for success cases and the \/payments\/cancel endpoint for cancellations. The platform then displays the payment outcome, such as \"Payment successful\" to the user.\n\nThe following tabs show example images of the screens that the user sees at each step of the flow.\n\n\n    \n        \n        \n    \n\n\nIntegration steps\nFollow these steps to implement an iDEAL integration:\n\nConfigure required redirect URLs\nRetrieve payment information\nCheck SCA eligibility\nInitiate SCA payment confirmation\nAuthenticate user\nComplete SCA payment confirmation\nCancel a payment\niDEAL profile endpoints\n\nConfigure required redirect URLs\nTo enable redirection for A2A payment and authentication to your platform, you must configure redirect URLs on your platform.\n\n\nConfigure the following redirect URLs on your platform:\n\n\npayment_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:\n\nRequire the user to log in with their credentials.\nAccept a payload query parameter, which is then used in the \/payments\/details endpoint.\nRedirect the user to a payment page that displays the transaction details for authorization.\n\n\n\nauthenticate_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.\n\n\n\n\nProvide the specific URLs for these endpoints to Adyen as part of your integration setup.\n\nBoth redirect URLs must support HTTPS and be capable of handling query parameters containing transaction context.\n\n\n\nRetrieve payment information\nRetrieve 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.\n\n\nFrom your server, make a POST \/payments\/details request specifying the following parameters:\n\n\n\nParameter\nLocation\nRequired\nApplies to\nDescription\n\n\n\n\nmethod\nBody\n\nAll\nThe payment method this payment is from. Set to ideal.\n\n\nsource\nBody\n\nmethod: ideal\nThe source that was used to obtain the payload. Possible values include redirect or qr.\n\n\npayload\nBody\n\nmethod: ideal\nThe 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.\n\n\n\nThe following example shows a request for retrieving transaction information.\n\n\n\n\n\nIn the response, note the token and other transaction details. You will need this token in 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:\n\n\n\nParameter\nDescription\n\n\n\n\ntoken\nA 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\/confirm or \/payments\/cancel endpoint requests.\n\n\nvalue\nThe numerical value of the amount.\n\n\ncurrency\nCurrency of a monetary amount.\n\n\ncounterparty\nAn object containing information about the counterparty that will receive the funds.\n\n\ncounterparty.accountHolder\nDetails about the account holder who will receive the funds.\n\n\nfullName\nThe full name of the counterparty's account holder.\n\n\ntype\nThe type of account identification.\n\n\niban\nThe IBAN of the bank account.\n\n\ndescription\nA description of the transaction.\n\n\nexpiresAt\nThe timestamp when the transaction token expires.\n\n\n\n\n\n\n\n\nIf you encounter any errors, see error codes and messages.\nCheck SCA eligibility\nBefore 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.\n\n\n    \n        \n        \n    \n\n\nYou will use the sdkOutput when confirming the payment.\nInitiate SCA payment confirmation\nConfirm a payment using the token that you obtained when you retrieved the payment information. The operation is secured by Strong Customer Authentication (SCA).\n\nYou must complete the second \/payments\/confirm request within 10 minutes of the initial request in order to complete authentication.\n\n\n\nMake an initial POST \/payments\/confirm request specifying the following parameters:\n\n\n\nParameter\nLocation\nRequired\nDescription\n\n\n\n\nWWW-Authenticate\nHeader\n\nSCA realm: A2APayment.auth-param1: Value of sdkOutput from the Check SCA eligibility step.\n\n\ntoken\nBody\n\nA 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\/confirm or \/payments\/cancel endpoint requests.\n\n\nbalanceAccountId\nBody\n\nBalance account ID of the account where the funds should be substracted. For example, BA00000000000000000000000.\n\n\n\n\n\n\n\n\nThe API returns a HTTP 401 - Unauthorized response with the message \"User needs to perform SCA.\" The response headers include the following parameters:\n\n\n\nParameter\nDescription\n\n\n\n\nWWW-Authenticate\nThe header containing the SCA challenge.\n\n\nauth-param1\nAn attribute within the WWW-Authenticate header that holds the sdkInput value.\n\n\nsdkInput\nThe SCA challenge that you must pass to the user's device for authentication.\n\n\n\nHere is an example of the response header:\n\n\n\n\n\nPass auth-param1 to the SDK as sdkInput.\n\n\nAuthenticate user\nTo authenticate your user with the Authentication SDK:\n\n\nTrigger the SDK to start user authentication and pass the auth-param1 value from the previous step as sdkInput.\n\n\n    \n        \n        \n    \n\n\n\n\nPass sdkOutput to your server.\n\n\nYou will use the sdkOutput when completing the payment confirmation.\nComplete SCA payment confirmation\nAfter 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.\n\n\nMake a second POST \/payments\/confirm request specifying the following parameters:\n\n\n\nParameter\nLocation\nRequired\nDescription\n\n\n\n\nWWW-Authenticate\nHeader\n\nSCA realm: A2APayment.auth-param1: Value of sdkOutput from the Authenticate user step.\n\n\ntoken\nBody\n\nA 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\/confirm or \/payments\/cancel endpoint requests.\n\n\nbalanceAccountId\nBody\n\nBalance account ID of the account where the funds should be substracted. For example, BA00000000000000000000000.\n\n\n\n\n\n\n\n\nVerify that the response contains a success object indicating the transaction was successful, which contains the related links. See the details in the following fields:\n\n\n\nParameter\nDescription\n\n\n\n\nlinks\nAn object containing one or more links related to the next steps in the payment flow.\n\n\nsuccess\nAn object containing the URL that the user should be redirected to in order to complete the \"success\" path of the payment confirmation.\n\n\nhref\nThe URL string to which the user should be redirected.\n\n\n\n\n\n\n\nFor 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.\n\n\n\nIf you encounter any errors, see error codes and messages.\nCancel a payment\nUse 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.\n\n\nMake a POST \/payments\/cancel request specifying the following parameters:\n\n\n\nParameter\nLocation\nRequired\nDescription\n\n\n\n\ntoken\nBody\n\nA 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\/confirm or \/payments\/cancel endpoint requests.\n\n\n\n\n\n\n\n\nThe response for a successful cancellation contains a links object. This object has a cancel field, which includes a href property that specifies a redirect URL. See the details in the following fields:\n\n\n\nParameter\nDescription\n\n\n\n\nlinks\nAn object containing one or more links related to the next steps in the payment flow.\n\n\ncancel\nAn object containing the URL that the user should be redirected to in order to complete the \"cancel\" path of the payment.\n\n\nhref\nThe URL string to which the user should be redirected.\n\n\n\n\n\n\n\n\nIf you encounter any errors, see error codes and messages.\nPayment screen requirements\nAll 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:\n\niDEAL\/WERO logo: show the iDEAL logo clearly on all screens to indicate the transaction is using iDEAL as the payment method.\nAmount and currency: the full payment amount and currency.\nPayee (recipient): clearly identify who is recieving the payment.\nPayment description: include a brief, user-friendly description of the transaction.\nAccount switch option: let users switch balance accounts if needed.\nConfirmation 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.\n\nDesign\nAdyen 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.\niDEAL profile endpoints\nAs 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.\nThese 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.\nCreate an iDEAL profile\nTo create a new iDEAL profile:\n\n\nMake a POST \/ideal\/profile\/register request specifying the following parameters:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\naccountHolderId\n\nThe unique identifier for an account holder.\n\n\npaymentInstrumentIds\n\nThe IDs for the payment instruments to be associated with the iDEAL profile.\n\n\n\n\n\n\n\n\nThe response includes a  redirectUrl object with href property. This href specifies a redirect URL. See the details in the following fields:\n\n\n\nParameter\nDescription\n\n\n\n\nredirectUrl\nA 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.\n\n\nhref\nThe URL string to which the user should be redirected.\n\n\n\n\n\n\n\n\nSelect the href URL and follow the steps to create your iDEAL profile.\n\n\nGenerate a profile management URL\nThe 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.\nTo generate a URL for your user's iDEAL profile management page:\n\n\nMake a POST \/ideal\/profile\/auth-link request specifying the following parameters:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\naccountHolderId\n\nThe unique identifier for an account holder.\n\n\n\n\n\n\n\n\nThe response includes a  redirectUrl object with href property. This href specifies a redirect URL. See the details in the following fields:\n\n\n\nParameter\nDescription\n\n\n\n\nredirectUrl\nA 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.\n\n\nhref\nThe URL string to which the user should be redirected.\n\n\n\n\n\n\n\n\nAuthenticate\nTo 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.\n\n\nMake a POST \/ideal\/profile\/authenticate request specifying the following parameters:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\naccountHolderId\n\nThe unique identifier for an account holder.\n\n\npayload\n\nA 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.\n\n\n\n\n\n\n\n\nThe response includes a  redirectUrl object with href property. This href specifies a redirect URL. See the details in the following fields:\n\n\n\nParameter\nDescription\n\n\n\n\nredirectUrl\nA 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.\n\n\nhref\nThe URL string to which the user should be redirected.\n\n\n\n\n\n\n\n\nError codes and messages\nThese are the common error codes. See the descriptions below for details.\nA2A payment errors\n\n\n\nError code\nHTTP status\nDescription\n\n\n\n\n1069_003\n400 Bad Request\nThe received token is invalid, malformed, or expired.\n\n\n1069_010\n400 Bad Request\nThe received payload is invalid, malformed, or expired.\n\n\n1069_004\n422 Unprocessable Entity\nPayment has expired and is no longer available.\n\n\n1069_005\n422 Unprocessable Entity\nThe 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.\n\n\n1069_006\n422 Unprocessable Entity\nAn unprocessable error occurred related to iDEAL.\n\n\n1069_002\n500 Internal Server Error\nAn unexpected error occurred related to iDEAL.\n\n\n1069_001\n500 Internal Server Error\nA generic server-side error occurred.\n\n\n\niDEAL profile errors\n\n\n\nError code\nHTTP status\nDescription\n\n\n\n\n1069_007\n422 Unprocessable Entity\nThe provided account already has a registered iDEAL profile.\n\n\n1069_008\n422 Unprocessable Entity\nThe provided account does not have a registered iDEAL profile.\n\n\n1069_009\n422 Unprocessable Entity\nThe authenticate payload has expired and is no longer available.\n\n\n\nSee also\n\n\n                    Track transactions\n                \n","type":"page","locale":"en","boost":18,"hierarchy":{"lvl0":"Home","lvl1":"Business accounts","lvl2":"Account-to-account (A2A) payments with iDEAL"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/business-accounts","lvl2":"\/business-accounts\/send-funds-ideal-integration"},"levels":3,"category":"","category_color":"","tags":["Account-to-account","(A2A)","payments","iDEAL"]}}
