{"title":"Manage mobile devices registered for SCA","category":"default","creationDate":1669827120,"content":"<p>After you registered devices for Strong Customer Authentication (SCA), you can use our API to:<\/p>\n<ul>\n<li><a href=\"#get-registered-devices\">Get the device registered for a card<\/a><\/li>\n<li><a href=\"#associate-payment-instruments-to-a-registered-device\">Associate payment instruments to a registered device<\/a> <\/li>\n<li><a href=\"#deregister-device\">Deregister a device from a specific card<\/a><\/li>\n<\/ul>\n<h2>Requirements<\/h2>\n<p>Ensure that your <a href=\"\/pt\/issuing\/manage-access\/webservice-roles\">API credential<\/a> has the following role:<\/p>\n<ul>\n<li><strong>Bank SCA Webservice Role<\/strong><\/li>\n<\/ul>\n<h2 id=\"get-registered-devices\">Get the device registered for a card<\/h2>\n<p>After the device is registered, you use the API to get information about the SCA device connected to a specific card such as the device ID, the name of the device, and the type of the device. You can use this information to build user interfaces or to check the payment instrument's devices before <a href=\"#associate-business-accounts-to-a-registered-device\">associating more<\/a>. <\/p>\n<p>To get the SCA device registered for a specific card:<\/p>\n<ol>\n<li>\n<p>Make a GET  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices<\/a> request. Include the following query parameter:<\/p>\n<div class=\"sticky-table-container\">\n    \n<table>\n<thead>\n<tr>\n<th>Query parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#query-paymentInstrumentId\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">paymentInstrumentId<\/a><\/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>Limits the returned list to SCA devices registered for this card.<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<\/div>\n\n<p>The following example shows a GET  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices<\/a> request for the <code>paymentInstrumentId<\/code> <strong>PI00000000000000000000001<\/strong>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example GET \/registeredDevices request'\" :id=\"'get-registered-devices'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl --request GET 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices?paymentInstrumentId=PI00000000000000000000001' \\\\\\n--header 'X-API-Key:ADYEN_BALANCE_PLATFORM_API_KEY'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v33.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.balanceplatform.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.balancePlatform.*;\\n\\nClient client = new Client(\\&quot;\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nRegisterSCARequest registerSCARequest = new RegisterSCARequest();\\n\\n\\\/\\\/ Send the request\\nManageScaDevicesApi service = new ManageScaDevicesApi(client);\\nRegisterSCAResponse response = service.initiateRegistrationOfScaDevice(registerSCARequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;&lt;?php\\n\\\/\\\/ Adyen PHP API Library v24.0.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\BalancePlatform\\\\RegisterSCARequest;\\nuse Adyen\\\\Service\\\\BalancePlatform\\\\ManageScaDevicesApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$registerSCARequest = new RegisterSCARequest();\\n$registerSCARequest;\\n\\n\\\/\\\/ Send the request\\n$service = new ManageScaDevicesApi($client);\\n$response = $service-&gt;initiateRegistrationOfScaDevice($registerSCARequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v28.0.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.BalancePlatform;\\nusing Adyen.Service.BalancePlatform;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nRegisterSCARequest registerSCARequest = new RegisterSCARequest\\n\\n};\\n\\n\\\/\\\/ Send the request\\nvar service = new ManageScaDevicesService(client);\\nvar response = service.InitiateRegistrationOfScaDevice(registerSCARequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v23.3.0\\nconst { Client, BalancePlatformAPI } = require('@adyen\\\/api-library');\\n\\nconst client = new Client({ apiKey: \\&quot;\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst registerSCARequest = { }\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.initiateRegistrationOfScaDevice(registerSCARequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v17.0.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v17\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v17\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v17\\\/src\\\/balancePlatform\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\nregisterSCARequest := balancePlatform.RegisterSCARequest,\\n}\\n\\n\\\/\\\/ Send the request\\nservice := client.BalancePlatform()\\nreq := service.ManageScaDevicesApi.InitiateRegistrationOfScaDeviceInput().RegisterSCARequest(registerSCARequest)\\nres, httpRes, err := service.ManageScaDevicesApi.InitiateRegistrationOfScaDevice(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v13.3.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = { }\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.initiate_registration_of_sca_device(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v10.1.1\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = ''\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = { }\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.initiate_registration_of_sca_device(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v23.3.0\\nimport { Client, BalancePlatformAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\nconst client = new Client({ apiKey: \\&quot;\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst registerSCARequest: Types.balancePlatform.RegisterSCARequest = \\n};\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.initiateRegistrationOfScaDevice(registerSCARequest);&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 following parameters:<\/p>\n<div class=\"sticky-table-container\">\n    \n<table>\n<thead>\n<tr>\n<th>Response parameter<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#responses-200-data\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data<\/a><\/td>\n<td>Contains data about the device registered for SCA.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#responses-200-data-id\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data.id<\/a><\/td>\n<td>The unique identifier of the registered SCA device.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#responses-200-data-name\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data.name<\/a><\/td>\n<td>The name of the SCA device. You can show this name to your user to help them identify the device.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#responses-200-data-paymentInstrumentId\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data.paymentInstrumentId<\/a><\/td>\n<td>The unique identifier of the card for which the SCA device is registered.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#responses-200-data-type\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data.type<\/a><\/td>\n<td><strong>ios<\/strong>, <strong>android<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<\/div>\n\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example GET \/registeredDevices response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"data\\\": [\\n        {\\n            \\\"id\\\": \\\"BSDR00000000000000000000000001\\\",\\n            \\\"name\\\": \\\"android_1709902088787\\\",\\n            \\\"paymentInstrumentId\\\": \\\"PI00000000000000000000001\\\",\\n            \\\"type\\\": \\\"android\\\"\\n        }\\n    ],\\n    \\\"itemsTotal\\\": 1,\\n    \\\"link\\\": {\\n        \\\"first\\\": {\\n            \\\"href\\\": \\\"https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices?pageNumber=0&amp;paymentInstrumentId=PI00000000000000000000001\\\"\\n        },\\n        \\\"last\\\": {\\n            \\\"href\\\": \\\"https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices?pageNumber=0&amp;paymentInstrumentId=PI00000000000000000000001\\\"\\n        },\\n        \\\"self\\\": {\\n            \\\"href\\\": \\\"https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices?pageNumber=0&amp;paymentInstrumentId=PI00000000000000000000001\\\"\\n        }\\n    },\\n    \\\"pagesTotal\\\": 1\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Associate cards to a registered device<\/h2>\n<p>After you <a href=\"\/pt\/issuing\/3d-secure\/oob-auth-sdk\/register-devices\/\">register a device<\/a>, you can connect additional payment instruments to the device using the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/overview\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Configuration API<\/a>. This enables a single device to handle authentication for multiple payment instruments. You can associate up to five payment instruments to a device per  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> API request. Each payment instrument can only be linked to one device.<\/p>\n<p>To add payment instruments to a registered device:<\/p>\n<ol>\n<li>\n<p>From your server, initiate the association by making a POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request with the user's device ID as a path parameter. In the request body, specify up to five payment instrument IDs in the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations#request-ids\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ids<\/a> array.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Initiate the association'\" :id=\"'initiateAssociation'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices\\\/{deviceId}\\\/associations \\\\\\n    -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \\\\\\n    -H 'content-type: application\\\/json' \\\\\\n    -X POST \\\\\\n    -d '{\\n        \\&quot;ids\\&quot;: [                        \\n            \\&quot;PI00000000000000000000001\\&quot;,\\n            \\&quot;PI00000000000000000000002\\&quot;,\\n            \\&quot;PI00000000000000000000003\\&quot;,\\n            \\&quot;PI00000000000000000000004\\&quot;,\\n            \\&quot;PI00000000000000000000005\\&quot;\\n        ],\\n        \\&quot;type\\&quot;: \\&quot;PaymentInstrument\\&quot;\\n    }'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v35.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.balanceplatform.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.balancePlatform.*;\\n\\nClient client = new Client(\\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nAssociationInitiateRequest associationInitiateRequest = new AssociationInitiateRequest()\\n  .ids(Arrays.asList(\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;))\\n  .type(AssociationInitiateRequest.TypeEnum.PAYMENTINSTRUMENT);\\n\\n\\\/\\\/ Send the request\\nManageScaDevicesApi service = new ManageScaDevicesApi(client);\\nAssociationInitiateResponse response = service.initiateAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationInitiateRequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;&lt;?php\\n\\\/\\\/ Adyen PHP API Library v27.0.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\BalancePlatform\\\\AssociationInitiateRequest;\\nuse Adyen\\\\Service\\\\BalancePlatform\\\\ManageScaDevicesApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$associationInitiateRequest = new AssociationInitiateRequest();\\n$associationInitiateRequest\\n  -&gt;setIds(array(\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;))\\n  -&gt;setType(\\&quot;PaymentInstrument\\&quot;);\\n\\n\\\/\\\/ Send the request\\n$service = new ManageScaDevicesApi($client);\\n$response = $service-&gt;initiateAssociationBetweenScaDeviceAndResource('deviceId', $associationInitiateRequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v31.0.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.BalancePlatform;\\nusing Adyen.Service.BalancePlatform;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nAssociationInitiateRequest associationInitiateRequest = new AssociationInitiateRequest\\n{\\n  Ids = { \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; },\\n  Type = AssociationInitiateRequest.TypeEnum.PaymentInstrument\\n};\\n\\n\\\/\\\/ Send the request\\nvar service = new ManageScaDevicesService(client);\\nvar response = service.InitiateAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationInitiateRequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v26.0.0\\nconst { Client, BalancePlatformAPI } = require('@adyen\\\/api-library');\\n\\nconst client = new Client({ apiKey: \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst associationInitiateRequest = {\\n  ids: [ \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; ],\\n  type: \\&quot;PaymentInstrument\\&quot;\\n}\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.initiateAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationInitiateRequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v20.0.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/balancePlatform\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\nassociationInitiateRequest := balancePlatform.AssociationInitiateRequest{\\n  Ids: []string{\\n    \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;,\\n  },\\n  Type: \\&quot;PaymentInstrument\\&quot;,\\n}\\n\\n\\\/\\\/ Send the request\\nservice := client.BalancePlatform()\\nreq := service.ManageScaDevicesApi.InitiateAssociationBetweenScaDeviceAndResourceInput(\\&quot;deviceId\\&quot;).AssociationInitiateRequest(associationInitiateRequest)\\nres, httpRes, err := service.ManageScaDevicesApi.InitiateAssociationBetweenScaDeviceAndResource(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v13.4.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = {\\n  \\&quot;ids\\&quot;: [ \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; ],\\n  \\&quot;type\\&quot;: \\&quot;PaymentInstrument\\&quot;\\n}\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.initiate_association_between_sca_device_and_resource(request=json_request, deviceId=\\&quot;deviceId\\&quot;)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v10.2.0\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_BALANCE_PLATFORM_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = {\\n  :ids =&gt; [ 'PI00000000000000000000001', 'PI00000000000000000000002', 'PI00000000000000000000003', 'PI00000000000000000000004', 'PI00000000000000000000005' ],\\n  :type =&gt; 'PaymentInstrument'\\n}\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.initiate_association_between_sca_device_and_resource(request_body, 'deviceId')&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v26.0.0\\nimport { Client, BalancePlatformAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\nconst client = new Client({ apiKey: \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst associationInitiateRequest: Types.balancePlatform.AssociationInitiateRequest = {\\n  ids: [\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;],\\n  type: Types.balancePlatform.AssociationInitiateRequest.TypeEnum.PaymentInstrument\\n};\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.initiateAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationInitiateRequest);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>The response contains a Base64-encoded string, which our <a href=\"\/pt\/issuing\/3d-secure\/oob-auth-sdk\/install-sdk-mobile#installation\">Authentication SDKs<\/a> uses to authenticate the requested association. You do not need to decode or validate this string.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'POST \/association response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"sdkInput\\\": \\\"eyJtZXNzYWdlIjogIkFuIGV4YW1wbGUgZW5jb2RlZCBtZXNzYWdlLiBUaGlzIGlzIHdoYXQgeW91IG1pZ2h0IGdldCBvdXQgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIFNESy4gSG93ZXZlciwgeW91IHdvdWxkIG5vdCBuZWVkIHRvIGRlY29kZSBpdCAtLSBqdXN0IGtlZXAgaXQgZW5jb2RlZCwgb2theT8ifQ==\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Pass the resulting <code>sdkInput<\/code> to your client.<\/p>\n<\/li>\n<li>\n<p>On your client, initialize the SDK and call the <code>authenticate()<\/code> method using the <code>sdkInput<\/code> from your server as an argument.<\/p>\n<p>The <code>authenticate()<\/code> method prompts the user to respond to a challenge, for example, Touch ID, Face ID, or the device password.<\/p>\n\n<div id=\"tabOzBk0\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Android (Kotlin)&quot;,&quot;content&quot;:&quot;\\n&lt;pre&gt;&lt;code class=\\&quot;language-kotlin\\&quot;&gt;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    }&lt;\\\/code&gt;&lt;\\\/pre&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;pre&gt;&lt;code class=\\&quot;language-swift\\&quot;&gt;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    }&lt;\\\/code&gt;&lt;\\\/pre&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;pre&gt;&lt;code class=\\&quot;language-javascript\\&quot;&gt;import ScaWebauthn from &#039;@adyen\\\/bpscaweb&#039;;\\n\\n\\\/\\\/ Initialize the scaWebauthn instance\\nconst scaWebauthn = ScaWebauthn.create({\\n    relyingPartyName: &#039;YOUR_MERCHANT_NAME&#039;,\\n});\\n\\n\\\/\\\/ Launch the authentication flow\\nconst authenticationResult = await scaWebauthn.authenticate(sdkInput)\\n.catch((error) =&amp;gt; {\\n    \\\/\\\/ Example: NotAllowedError: The operation either timed out or was not allowed.\\n    \\\/\\\/ See https:\\\/\\\/webidl.spec.whatwg.org\\\/#idl-DOMException-error-names for possible webauthn errors.\\n});&lt;\\\/code&gt;&lt;\\\/pre&gt;\\n&lt;p&gt;The &lt;code&gt;authenticate()&lt;\\\/code&gt; function returns a Base64-encoded string that contains data about the user authentication and challenge. You can check that the authentication result is not empty to verify that the authentication was successful. You do not need to decode or validate this string.&lt;\\\/p&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Authentication result&#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;console.log(authenticationResult)\\\\n\\\\\\\/\\\\\\\/ eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\\\\\/In0=\\&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&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 the authentication result to your server.<\/p>\n<\/li>\n<li>\n<p>On your server, finalize the association by making a PATCH  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/patch\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request using the device ID as a path parameter. In the request body, specify the following:<\/p>\n<div class=\"sticky-table-container\">\n    \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> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations#request-ids\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ids<\/a><\/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>An array of the payment instrument IDs that you want to associate. These IDs must be the same that you sent in the POST request in step 1.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/patch\/registeredDevices\/(deviceId)\/associations#request-strongCustomerAuthentication-sdkOutput\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">strongCustomerAuthentication.sdkOutput<\/a><\/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 data returned from the client-side <code>authenticate()<\/code> method.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/patch\/registeredDevices\/(deviceId)\/associations#request-type\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">type<\/a><\/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 type of resource that you are associating with the SCA device. <br\/> Possible value: <strong>PaymentInstrument<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<\/div>\n\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Finalize the assocation'\" :id=\"'finalizeAssociation'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices\\\/{deviceId}\\\/associations \\\\\\n    -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \\\\\\n    -H 'content-type: application\\\/json' \\\\\\n    -X PATCH \\\\\\n    -d '{\\n        \\&quot;ids\\&quot;: [                        \\n            \\&quot;PI00000000000000000000001\\&quot;,\\n            \\&quot;PI00000000000000000000002\\&quot;,\\n            \\&quot;PI00000000000000000000003\\&quot;,\\n            \\&quot;PI00000000000000000000004\\&quot;,\\n            \\&quot;PI00000000000000000000005\\&quot;\\n        ],\\n        \\&quot;strongCustomerAuthentication\\&quot;: {\\n            \\&quot;sdkOutput\\&quot;: \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;\\n        },\\n        \\&quot;type\\&quot;: \\&quot;PaymentInstrument\\&quot;\\n    }'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v35.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.balanceplatform.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.balancePlatform.*;\\n\\nClient client = new Client(\\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nAssociationDelegatedAuthenticationData associationDelegatedAuthenticationData = new AssociationDelegatedAuthenticationData()\\n  .sdkOutput(\\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;);\\n\\nAssociationFinaliseRequest associationFinaliseRequest = new AssociationFinaliseRequest()\\n  .strongCustomerAuthentication(associationDelegatedAuthenticationData)\\n  .ids(Arrays.asList(\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;))\\n  .type(AssociationFinaliseRequest.TypeEnum.PAYMENTINSTRUMENT);\\n\\n\\\/\\\/ Send the request\\nManageScaDevicesApi service = new ManageScaDevicesApi(client);\\nAssociationFinaliseResponse response = service.completeAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationFinaliseRequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;&lt;?php\\n\\\/\\\/ Adyen PHP API Library v27.0.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\BalancePlatform\\\\AssociationDelegatedAuthenticationData;\\nuse Adyen\\\\Model\\\\BalancePlatform\\\\AssociationFinaliseRequest;\\nuse Adyen\\\\Service\\\\BalancePlatform\\\\ManageScaDevicesApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$associationDelegatedAuthenticationData = new AssociationDelegatedAuthenticationData();\\n$associationDelegatedAuthenticationData\\n  -&gt;setSdkOutput(\\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;);\\n\\n$associationFinaliseRequest = new AssociationFinaliseRequest();\\n$associationFinaliseRequest\\n  -&gt;setStrongCustomerAuthentication($associationDelegatedAuthenticationData)\\n  -&gt;setIds(array(\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;))\\n  -&gt;setType(\\&quot;PaymentInstrument\\&quot;);\\n\\n\\\/\\\/ Send the request\\n$service = new ManageScaDevicesApi($client);\\n$response = $service-&gt;completeAssociationBetweenScaDeviceAndResource('deviceId', $associationFinaliseRequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v31.0.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.BalancePlatform;\\nusing Adyen.Service.BalancePlatform;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nAssociationDelegatedAuthenticationData associationDelegatedAuthenticationData = new AssociationDelegatedAuthenticationData\\n{\\n  SdkOutput = \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;\\n};\\n\\nAssociationFinaliseRequest associationFinaliseRequest = new AssociationFinaliseRequest\\n{\\n  StrongCustomerAuthentication = associationDelegatedAuthenticationData,\\n  Ids = { \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; },\\n  Type = AssociationFinaliseRequest.TypeEnum.PaymentInstrument\\n};\\n\\n\\\/\\\/ Send the request\\nvar service = new ManageScaDevicesService(client);\\nvar response = service.CompleteAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationFinaliseRequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v26.0.0\\nconst { Client, BalancePlatformAPI } = require('@adyen\\\/api-library');\\n\\nconst client = new Client({ apiKey: \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst associationFinaliseRequest = {\\n  ids: [ \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; ],\\n  strongCustomerAuthentication: {\\n    sdkOutput: \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;\\n  },\\n  type: \\&quot;PaymentInstrument\\&quot;\\n}\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.completeAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationFinaliseRequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v20.0.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v20\\\/src\\\/balancePlatform\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\nassociationDelegatedAuthenticationData := balancePlatform.AssociationDelegatedAuthenticationData{\\n  SdkOutput: \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;,\\n}\\n\\nassociationFinaliseRequest := balancePlatform.AssociationFinaliseRequest{\\n  StrongCustomerAuthentication: associationDelegatedAuthenticationData,\\n  Ids: []string{\\n    \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;,\\n  },\\n  Type: \\&quot;PaymentInstrument\\&quot;,\\n}\\n\\n\\\/\\\/ Send the request\\nservice := client.BalancePlatform()\\nreq := service.ManageScaDevicesApi.CompleteAssociationBetweenScaDeviceAndResourceInput(\\&quot;deviceId\\&quot;).AssociationFinaliseRequest(associationFinaliseRequest)\\nres, httpRes, err := service.ManageScaDevicesApi.CompleteAssociationBetweenScaDeviceAndResource(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v13.4.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = {\\n  \\&quot;ids\\&quot;: [ \\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot; ],\\n  \\&quot;strongCustomerAuthentication\\&quot;: {\\n    \\&quot;sdkOutput\\&quot;: \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;\\n  },\\n  \\&quot;type\\&quot;: \\&quot;PaymentInstrument\\&quot;\\n}\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.complete_association_between_sca_device_and_resource(request=json_request, deviceId=\\&quot;deviceId\\&quot;)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v10.2.0\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_BALANCE_PLATFORM_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = {\\n  :ids =&gt; [ 'PI00000000000000000000001', 'PI00000000000000000000002', 'PI00000000000000000000003', 'PI00000000000000000000004', 'PI00000000000000000000005' ],\\n  :strongCustomerAuthentication =&gt; {\\n    :sdkOutput =&gt; 'eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0='\\n  },\\n  :type =&gt; 'PaymentInstrument'\\n}\\n\\n# Send the request\\nresult = adyen.balancePlatform.manage_sca_devices_api.complete_association_between_sca_device_and_resource(request_body, 'deviceId')&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v26.0.0\\nimport { Client, BalancePlatformAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\nconst client = new Client({ apiKey: \\&quot;ADYEN_BALANCE_PLATFORM_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot; });\\n\\n\\\/\\\/ Create the request object(s)\\nconst associationDelegatedAuthenticationData: Types.balancePlatform.AssociationDelegatedAuthenticationData = {\\n  sdkOutput: \\&quot;eyJtZXNzYWdlIjogIlRoaXMgaXMgd2hhdCB5b3UgbWlnaHQgZ2V0IGFzIGEgcmVzdWx0IGZvciB0aGUgYXV0aGVudGljYXRlKCkgbWV0aG9kLiBJdCB3aWxsIGhhdmUgbG90cyBvZiBkaWZmZXJlbnQgaW5mb3JtYWl0b24gaW4gaXQsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHlvdSB0byBkZWNvZGUgaXQgb3IgaW5zcGVjdCBpdC4gV2Ugd2lsbCBoYW5kbGUgdGhhdCBmb3IgeW91ISBTbywgZmVlbCBmcmVlIHRvIGRlY29kZSBpdC4gSG93ZXZlciwgZG8gbm90IHJlLWVuY29kZSBpdCBhbmQgZXhwZWN0IHRoZSBzYW1lIHJlc3VsdC4gVGhlIFNESyBlbmNvZGVzIHRoZSBibG9iIGluIGEgc3BlY2lmaWMgd2F5LCBhbmQgaWYgeW91IGRlY29kZSBpdCBhbmQgcmUtZW5jb2RlIGl0LCB5b3UgbWlnaHQgaW50cm9kdWNlIHByb2JsZW1zLiBTbywganVzdCBsZWF2ZSBpdCBlbmNvZGVkIG9rYXk\\\/In0=\\&quot;\\n};\\n\\nconst associationFinaliseRequest: Types.balancePlatform.AssociationFinaliseRequest = {\\n  strongCustomerAuthentication: associationDelegatedAuthenticationData,\\n  ids: [\\&quot;PI00000000000000000000001\\&quot;, \\&quot;PI00000000000000000000002\\&quot;, \\&quot;PI00000000000000000000003\\&quot;, \\&quot;PI00000000000000000000004\\&quot;, \\&quot;PI00000000000000000000005\\&quot;],\\n  type: Types.balancePlatform.AssociationFinaliseRequest.TypeEnum.PaymentInstrument\\n};\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nconst response = balancePlatformAPI.ManageScaDevicesApi.completeAssociationBetweenScaDeviceAndResource(\\&quot;deviceId\\&quot;, associationFinaliseRequest);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>If the association is successful, the API responds with a list of payment instrument IDs. To verify the association, <a href=\"#get-registered-devices\">get a list of registered devices<\/a> for each of the payment instruments.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'PATCH \/association response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"deviceId\\\":\\\"BSDR4294N223223N5M6J9T2BP46HVK\\\",\\n    \\\"type\\\":\\\"PaymentInstrument\\\",\\n    \\\"ids\\\":[\\n        \\\"PI00000000000000000000001\\\",\\n        \\\"PI00000000000000000000002\\\",\\n        \\\"PI00000000000000000000003\\\",\\n        \\\"PI00000000000000000000004\\\",\\n        \\\"PI00000000000000000000005\\\"\\n    ]\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Troubleshooting device association<\/h2>\n<p>The following examples show some common issues you may encounter during the association process.<\/p>\n<div class=\"accordion-shortcode adl-accordion adl-accordion--max-height-transition\" data-expand=\"true\" data-ignore=\"anchorjs-link\">\n    \n    <div class=\"adl-accordion__item\" style=\"\">\n        <div tabindex=\"0\" role=\"item\" aria-expanded=\"false\" class=\"adl-accordion__header\">\n            <i class=\"adl-accordion__toggle adl-icon-chevron-down\"><\/i>\n            <div class=\"adl-accordion__title-wrapper\" data-accordion=\"#device-limit-reached\">\n                                    <h3 class=\"adl-accordion__title\">Device limit reached<\/h3>\n                            <\/div>\n        <\/div>\n        <div role=\"region\" class=\"adl-accordion__content\">\n            \n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'POST \/associations response'\" :id=\"'device-limit-reached'\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"type\\\": \\\"https:\\\/\\\/docs.adyen.com\\\/errors\\\/unprocessable-entity\\\",\\n    \\\"errorCode\\\": \\\"00_422\\\",\\n    \\\"title\\\": \\\"Unprocessable entity\\\",\\n    \\\"detail\\\": \\\"Device limit reached, please delete a device and try again\\\",\\n    \\\"requestId\\\": \\\"5ffa18b720392054047e8b33cc271d98\\\",\\n    \\\"status\\\": 422\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>The \"Device limit reached, please delete a device and try again\" error detail means that one or more of the payment instrument IDs in the POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> call is already linked to a device.<\/p>\n<h4>Solution<\/h4>\n<p>To avoid this error, all payment instrument IDs passed in the POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> call need to be deregistered.<\/p>\n<ol>\n<li><a href=\"#get-registered-devices\">Get a list of registered devices<\/a>.<\/li>\n<li>If the payment instrument has a device in its <code>data<\/code> array, <a href=\"#deregister-device\">deregister the device<\/a>.<\/li>\n<\/ol>\n<p>After you have deregistered all of the payment instruments, retry the POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request.<\/p>\n\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"accordion-shortcode adl-accordion adl-accordion--max-height-transition\" data-expand=\"true\" data-ignore=\"anchorjs-link\">\n    \n    <div class=\"adl-accordion__item\" style=\"\">\n        <div tabindex=\"0\" role=\"item\" aria-expanded=\"false\" class=\"adl-accordion__header\">\n            <i class=\"adl-accordion__toggle adl-icon-chevron-down\"><\/i>\n            <div class=\"adl-accordion__title-wrapper\" data-accordion=\"#challenge-not-found\">\n                                    <h3 class=\"adl-accordion__title\">Challenge not found<\/h3>\n                            <\/div>\n        <\/div>\n        <div role=\"region\" class=\"adl-accordion__content\">\n            \n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'PATCH \/associations response'\" :id=\"'device-limit-reached'\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"type\\\": \\\"https:\\\/\\\/docs.adyen.com\\\/errors\\\/unprocessable-entity\\\",\\n    \\\"errorCode\\\": \\\"00_422\\\",\\n    \\\"title\\\": \\\"Unprocessable entity\\\",\\n    \\\"detail\\\": \\\"Challenge not found\\\",\\n    \\\"requestId\\\": \\\"de2c4f16b79a883ad1989122bad98d15\\\",\\n    \\\"status\\\": 422\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>The 422 \"Challenge not found\" error usually occurs when the client device ID for the challenge does not match the device ID in the PATCH  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/patch\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request.<\/p>\n<p>When a client authenticates using the Adyen SCA library, the library produces an <code>sdkOuput<\/code> that is specific to the client device. If you send an sdkOutput that does not correspond to the device that you want to associate, then you get a \"Challenge not found\" error.<\/p>\n<h4>Solution<\/h4>\n<p>Ensure that the device ID used in the initial POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/post\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request matches the one used in the PATCH  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/patch\/registeredDevices\/(deviceId)\/associations\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{deviceId}\/associations<\/a> request. As long as the IDs match between the POST and the PATCH, the \"Challenge not found\" error will be prevented.<\/p>\n\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"accordion-shortcode adl-accordion adl-accordion--max-height-transition\" data-expand=\"true\" data-ignore=\"anchorjs-link\">\n    \n    <div class=\"adl-accordion__item\" style=\"\">\n        <div tabindex=\"0\" role=\"item\" aria-expanded=\"false\" class=\"adl-accordion__header\">\n            <i class=\"adl-accordion__toggle adl-icon-chevron-down\"><\/i>\n            <div class=\"adl-accordion__title-wrapper\" data-accordion=\"#not-allowed-error-the-operation-either-timed-out-or-was-not-allowed\">\n                                    <h3 class=\"adl-accordion__title\">NotAllowedError: The operation either timed out or was not allowed.<\/h3>\n                            <\/div>\n        <\/div>\n        <div role=\"region\" class=\"adl-accordion__content\">\n            \n<p>The client-side <code>authenticate()<\/code> method failed because the user canceled the challenge. This is similar to other client-side errors that can occur. These are standard errors for <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Web_Authentication_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">WebAuthn<\/a>. Go to <a href=\"https:\/\/webidl.spec.whatwg.org\/#idl-DOMException-error-names\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Web IDL standard<\/a> for a list of possible exception error names.<\/p>\n<h4>Solution<\/h4>\n<p>To avoid this error, tell your user before the authentication process begins that they are about to be asked to authenticate.<\/p>\n<p>To handle this error, return the user to the previous step and ask them to retry. You can reuse the same <code>sdkInput<\/code> when you retry <code>authenticate()<\/code> in the same session.<\/p>\n\n        <\/div>\n    <\/div>\n<\/div>\n\n<h2 id=\"deregister-device\">Deregister a device from a card<\/h2>\n<p>You can deregister an SCA device from a card by making a DELETE&nbsp; <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/delete\/registeredDevices\/(id)\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{id}<\/a> request. You can do this when, for example:<\/p>\n<ul>\n<li>Your user will no longer use a registered device.<\/li>\n<li>A registered device has been compromised.<\/li>\n<\/ul>\n<p>If the SCA device is associated with multiple cards, you must make a request for each card.<\/p>\n<p>To deregister an SCA device from a card: <\/p>\n<ol>\n<li>\n<p><a href=\"#get-registered-devices\">Get the ID of the device<\/a> that you want to deregister.<\/p>\n<\/li>\n<li>\n<p>Make a DELETE&nbsp; <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/delete\/registeredDevices\/(id)\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/registeredDevices\/{id}<\/a> request and include the following parameters:<\/p>\n<div class=\"sticky-table-container\">\n    \n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th style=\"text-align: center;\">Type<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/delete\/registeredDevices\/(id)#path-id\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">id<\/a><\/td>\n<td style=\"text-align: center;\">Path<\/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 of the SCA device that you want to deregister.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/delete\/registeredDevices\/(id)#query-paymentInstrumentId\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">paymentInstrumentId<\/a><\/td>\n<td style=\"text-align: center;\">Query<\/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 of the card from which you want to deregister the device.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<\/div>\n\n<p>The following example shows a request to deregister an SCA device with <code>id<\/code> <strong>BSDR00000000000000000000000001<\/strong> from the <code>paymentInstrumentId<\/code> <strong>PI00000000000000000000001<\/strong>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Example DELETE \/registeredDevices\/{id} request'\" :id=\"'delete-device'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl --request DELETE 'https:\\\/\\\/balanceplatform-api-test.adyen.com\\\/bcl\\\/v2\\\/registeredDevices\\\/BSDR00000000000000000000000001?paymentInstrumentId=PI00000000000000000000001' \\\\\\n--header 'X-API-Key;'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v26.2.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.service.balancePlatform.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\\/\\\/ Send the request\\nManageScaDevicesApi service = new ManageScaDevicesApi(client);\\nservice.deleteRegistrationOfScaDevice(\\&quot;id\\&quot;, \\&quot;String\\&quot;, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v18.2.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Service\\\\BalancePlatform\\\\ManageScaDevicesApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n$requestOptions['queryParams'] = array('paymentInstrumentId' =&gt; 'string');\\n\\n\\\/\\\/ Send the request\\n$service = new ManageScaDevicesApi($client);\\n$service-&gt;deleteRegistrationOfScaDevice('id', $requestOptions);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v16.1.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Service.BalancePlatform;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Send the request\\nvar service = new ManageScaDevicesService(client);\\nservice.DeleteRegistrationOfScaDevice(\\&quot;id\\&quot;, paymentInstrumentId: \\&quot;string\\&quot;);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v17.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, BalancePlatformAPI } = require('@adyen\\\/api-library');\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nbalancePlatformAPI.ManageScaDevicesApi.deleteRegistrationOfScaDevice(\\&quot;id\\&quot;, \\&quot;string\\&quot;);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v10.2.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/balancePlatform\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Send the request\\nservice := client.BalancePlatform()\\nreq := service.ManageScaDevicesApi.DeleteRegistrationOfScaDeviceInput(\\&quot;id\\&quot;)\\nreq = req.PaymentInstrumentId(\\&quot;string\\&quot;)\\nservice.ManageScaDevicesApi.DeleteRegistrationOfScaDevice(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v12.5.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\nquery_parameters = {\\n  \\&quot;paymentInstrumentId\\&quot; : \\&quot;string\\&quot;\\n}\\n\\n# Send the request\\nadyen.balancePlatform.manage_sca_devices_api.delete_registration_of_sca_device(id=\\&quot;id\\&quot;, query_parameters=query_parameters)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.5.0\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nquery_params = {\\n  :paymentInstrumentId =&gt; 'string'\\n}\\n\\n# Send the request\\nadyen.balancePlatform.manage_sca_devices_api.delete_registration_of_sca_device('id', query_params: query_params)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v17.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, BalancePlatformAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Send the request\\nconst balancePlatformAPI = new BalancePlatformAPI(client);\\nbalancePlatformAPI.ManageScaDevicesApi.deleteRegistrationOfScaDevice(\\&quot;id\\&quot;, \\&quot;string\\&quot;);&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 you receive a <strong>204<\/strong> HTTP response with no content. This indicates that the request succeeded.<\/p>\n<\/li>\n<\/ol>","url":"https:\/\/docs.adyen.com\/pt\/issuing\/3d-secure\/oob-auth-sdk\/manage-devices","articleFields":{"description":"Learn how to manage devices registered for Strong Customer Authentication (SCA).","feedback_component":true,"type":"page","_expandable":{"operations":""},"status":"current","parameters":{"directoryPath":"\/issuing","integrationType":"issuing"},"last_edit_on":"30-11-2022 17:52"},"algolia":{"url":"https:\/\/docs.adyen.com\/pt\/issuing\/3d-secure\/oob-auth-sdk\/manage-devices","title":"Manage mobile devices registered for SCA","content":"After you registered devices for Strong Customer Authentication (SCA), you can use our API to:\n\nGet the device registered for a card\nAssociate payment instruments to a registered device \nDeregister a device from a specific card\n\nRequirements\nEnsure that your API credential has the following role:\n\nBank SCA Webservice Role\n\nGet the device registered for a card\nAfter the device is registered, you use the API to get information about the SCA device connected to a specific card such as the device ID, the name of the device, and the type of the device. You can use this information to build user interfaces or to check the payment instrument's devices before associating more. \nTo get the SCA device registered for a specific card:\n\n\nMake a GET  \/registeredDevices request. Include the following query parameter:\n\n    \n\n\n\nQuery parameter\nRequired\nDescription\n\n\n\n\n paymentInstrumentId\n\nLimits the returned list to SCA devices registered for this card.\n\n\n\n\n\n\n\nThe following example shows a GET  \/registeredDevices request for the paymentInstrumentId PI00000000000000000000001.\n\n\n\n\n\nIn the response, note the following parameters:\n\n    \n\n\n\nResponse parameter\nDescription\n\n\n\n\n data\nContains data about the device registered for SCA.\n\n\n data.id\nThe unique identifier of the registered SCA device.\n\n\n data.name\nThe name of the SCA device. You can show this name to your user to help them identify the device.\n\n\n data.paymentInstrumentId\nThe unique identifier of the card for which the SCA device is registered.\n\n\n data.type\nios, android\n\n\n\n\n\n\n\n\n\n\n\nAssociate cards to a registered device\nAfter you register a device, you can connect additional payment instruments to the device using the  Configuration API. This enables a single device to handle authentication for multiple payment instruments. You can associate up to five payment instruments to a device per  \/registeredDevices\/{deviceId}\/associations API request. Each payment instrument can only be linked to one device.\nTo add payment instruments to a registered device:\n\n\nFrom your server, initiate the association by making a POST  \/registeredDevices\/{deviceId}\/associations request with the user's device ID as a path parameter. In the request body, specify up to five payment instrument IDs in the  ids array.\n\n\n\nThe response contains a Base64-encoded string, which our Authentication SDKs uses to authenticate the requested association. You do not need to decode or validate this string.\n\n\n\n\n\nPass the resulting sdkInput to your client.\n\n\nOn your client, initialize the SDK and call the authenticate() method using the sdkInput from your server as an argument.\nThe authenticate() method prompts the user to respond to a challenge, for example, Touch ID, Face ID, or the device password.\n\n\n    \n        \n        \n    \n\n\n\n\nPass the authentication result to your server.\n\n\nOn your server, finalize the association by making a PATCH  \/registeredDevices\/{deviceId}\/associations request using the device ID as a path parameter. In the request body, specify the following:\n\n    \n\n\n\nParameter\nRequired\nDescription\n\n\n\n\n ids\n\nAn array of the payment instrument IDs that you want to associate. These IDs must be the same that you sent in the POST request in step 1.\n\n\n strongCustomerAuthentication.sdkOutput\n\nThe data returned from the client-side authenticate() method.\n\n\n type\n\nThe type of resource that you are associating with the SCA device.  Possible value: PaymentInstrument\n\n\n\n\n\n\n\n\n\nIf the association is successful, the API responds with a list of payment instrument IDs. To verify the association, get a list of registered devices for each of the payment instruments.\n\n\n\n\n\nTroubleshooting device association\nThe following examples show some common issues you may encounter during the association process.\n\n    \n    \n        \n            \n            \n                                    Device limit reached\n                            \n        \n        \n            \n\n    \n\nThe \"Device limit reached, please delete a device and try again\" error detail means that one or more of the payment instrument IDs in the POST  \/registeredDevices\/{deviceId}\/associations call is already linked to a device.\nSolution\nTo avoid this error, all payment instrument IDs passed in the POST  \/registeredDevices\/{deviceId}\/associations call need to be deregistered.\n\nGet a list of registered devices.\nIf the payment instrument has a device in its data array, deregister the device.\n\nAfter you have deregistered all of the payment instruments, retry the POST  \/registeredDevices\/{deviceId}\/associations request.\n\n        \n    \n\n\n\n    \n    \n        \n            \n            \n                                    Challenge not found\n                            \n        \n        \n            \n\n    \n\nThe 422 \"Challenge not found\" error usually occurs when the client device ID for the challenge does not match the device ID in the PATCH  \/registeredDevices\/{deviceId}\/associations request.\nWhen a client authenticates using the Adyen SCA library, the library produces an sdkOuput that is specific to the client device. If you send an sdkOutput that does not correspond to the device that you want to associate, then you get a \"Challenge not found\" error.\nSolution\nEnsure that the device ID used in the initial POST  \/registeredDevices\/{deviceId}\/associations request matches the one used in the PATCH  \/registeredDevices\/{deviceId}\/associations request. As long as the IDs match between the POST and the PATCH, the \"Challenge not found\" error will be prevented.\n\n        \n    \n\n\n\n    \n    \n        \n            \n            \n                                    NotAllowedError: The operation either timed out or was not allowed.\n                            \n        \n        \n            \nThe client-side authenticate() method failed because the user canceled the challenge. This is similar to other client-side errors that can occur. These are standard errors for WebAuthn. Go to Web IDL standard for a list of possible exception error names.\nSolution\nTo avoid this error, tell your user before the authentication process begins that they are about to be asked to authenticate.\nTo handle this error, return the user to the previous step and ask them to retry. You can reuse the same sdkInput when you retry authenticate() in the same session.\n\n        \n    \n\n\nDeregister a device from a card\nYou can deregister an SCA device from a card by making a DELETE&nbsp; \/registeredDevices\/{id} request. You can do this when, for example:\n\nYour user will no longer use a registered device.\nA registered device has been compromised.\n\nIf the SCA device is associated with multiple cards, you must make a request for each card.\nTo deregister an SCA device from a card: \n\n\nGet the ID of the device that you want to deregister.\n\n\nMake a DELETE&nbsp; \/registeredDevices\/{id} request and include the following parameters:\n\n    \n\n\n\nParameter\nType\nRequired\nDescription\n\n\n\n\n id\nPath\n\nThe unique identifier of the SCA device that you want to deregister.\n\n\n paymentInstrumentId\nQuery\n\nThe unique identifier of the card from which you want to deregister the device.\n\n\n\n\n\n\nThe following example shows a request to deregister an SCA device with id BSDR00000000000000000000000001 from the paymentInstrumentId PI00000000000000000000001.\n\n\n\n\n\nVerify that you receive a 204 HTTP response with no content. This indicates that the request succeeded.\n\n","type":"page","locale":"pt","boost":16,"hierarchy":{"lvl0":"Home","lvl1":"Adyen Issuing","lvl2":"Enroll cards in 3D Secure","lvl3":"Using the out-of-band authentication SDK","lvl4":"Manage mobile devices registered for SCA"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/pt","lvl1":"https:\/\/docs.adyen.com\/pt\/issuing","lvl2":"https:\/\/docs.adyen.com\/pt\/issuing\/3d-secure","lvl3":"https:\/\/docs.adyen.com\/pt\/issuing\/3d-secure\/oob-auth-sdk","lvl4":"\/pt\/issuing\/3d-secure\/oob-auth-sdk\/manage-devices"},"levels":5,"category":"Issuing","category_color":"green","tags":["Manage","mobile","devices","registered"]}}
