{"title":"Manage 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:<\/li>\n<li><a href=\"#get-registered-devices\">Get a list of registered devices<\/a><\/li>\n<li><a href=\"#associate-business-accounts-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 business account<\/a><\/li>\n<\/ul>\n<h2>Requirements<\/h2>\n<p>Ensure that your <a href=\"\/pt\/business-accounts\/manage-access#manage-api-credentials\">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 a list of registered devices<\/h2>\n<p>After the device is registered, you use the API to get information about the SCA device connected to a specific business account such as the device ID, the name of the device, and the type of the device. This information can be helpful for building user interfaces or for checking the payment instrument's devices before <a href=\"#associate-business-accounts-to-a-registered-device\">associating more<\/a>. <\/p>\n<p>To get a paginated list of the SCA devices registered for a specific business account:<\/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. You can limit the amount of returned data by including the following query parameters:<\/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 business account.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#query-pageSize\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pageSize<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td>The number of items on a page. Default: 20. Maximum: 100.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/balanceplatform\/latest\/get\/registeredDevices#query-pageNumber\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pageNumber<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td>The index of the page to retrieve. The index of the first page is 0 (zero). Default: 0.<\/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>An array that contains a list of registered SCA devices and their corresponding details.<\/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 business account 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>, <strong>browser<\/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 business accounts to a registered device<\/h2>\n<p>After you <a href=\"\/pt\/business-accounts\/register-sca-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\/business-accounts\/install-auth-sdk\/#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=\"tabewskx\">\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 business account<\/h2>\n<p>You can deregister an SCA device from a business account 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 business accounts, you must make a request for each business account.<\/p>\n<p>To deregister an SCA device from a business account: <\/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 business account 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\/business-accounts\/manage-sca-devices","articleFields":{"description":"View or deregister mobile devices used for Strong Customer Authentication (SCA).","feedback_component":true,"type":"page","_expandable":{"operations":""},"status":"current","parameters":{"directoryPath":"\/business-accounts","model":"balance platform"},"last_edit_on":"30-11-2022 17:52"},"algolia":{"url":"https:\/\/docs.adyen.com\/pt\/business-accounts\/manage-sca-devices","title":"Manage devices registered for SCA","content":"After you registered devices for Strong Customer Authentication (SCA), you can use our API to:\nGet a list of registered devices\nAssociate payment instruments to a registered device \nDeregister a device from a specific business account\n\nRequirements\nEnsure that your API credential has the following role:\n\nBank SCA Webservice Role\n\nGet a list of registered devices\nAfter the device is registered, you use the API to get information about the SCA device connected to a specific business account such as the device ID, the name of the device, and the type of the device. This information can be helpful for building user interfaces or for checking the payment instrument's devices before associating more. \nTo get a paginated list of the SCA devices registered for a specific business account:\n\n\nMake a GET  \/registeredDevices request. You can limit the amount of returned data by including the following query parameters:\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 business account.\n\n\n\n pageSize\n\nThe number of items on a page. Default: 20. Maximum: 100.\n\n\n pageNumber\n\nThe index of the page to retrieve. The index of the first page is 0 (zero). Default: 0.\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\nAn array that contains a list of registered SCA devices and their corresponding details.\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 business account for which the SCA device is registered.\n\n\n data.type\nios, android, browser\n\n\n\n\n\n\n\n\n\n\n\nAssociate business accounts 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 business account\nYou can deregister an SCA device from a business account 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 business accounts, you must make a request for each business account.\nTo deregister an SCA device from a business account: \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 business account 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":18,"hierarchy":{"lvl0":"Home","lvl1":"Business accounts","lvl2":"Manage devices registered for SCA"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/pt","lvl1":"https:\/\/docs.adyen.com\/pt\/business-accounts","lvl2":"\/pt\/business-accounts\/manage-sca-devices"},"levels":3,"category":"","category_color":"","tags":["Manage","devices","registered"]}}
