{"title":"Schedule terminal actions to deploy apps","category":"default","creationDate":1712145540,"content":"<p>Terminal actions are operations that need to be carried out on payment terminals, and that can be planned for a certain date and time. Most of those actions are planned by Adyen, like updating to a release, or obtaining logs. Some actions can be planned by you.<\/p>\n<p>Here we describe how you can use our <strong>Management API<\/strong> to automate terminal actions to deploy apps and certificates on Android payment terminals.<\/p>\n<h2>Requirements<\/h2>\n<p>Before you begin, take into account the following requirements and limitations.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">A <a href=\"\/pt\/point-of-sale\/design-your-integration\/terminal-api\">Terminal API integration<\/a> with payment terminals or a <a href=\"\/pt\/point-of-sale\/standalone\">standalone solution<\/a>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><a href=\"\/pt\/development-resources\/api-credentials\">API credentials<\/a><\/strong><\/td>\n<td style=\"text-align: left;\">You must have an API credential with an API key and the following <a href=\"\/pt\/development-resources\/api-credentials#api-permissions\">roles<\/a>: <ul><li markdown=\"1\">Management API\u2014Terminal actions read<\/li> <li markdown=\"1\">Management API\u2014Terminal actions read and write<\/li> <li markdown=\"1\">Management API\u2014Terminal settings read<\/li><\/ul> <br>If you have a Terminal API integration with <a href=\"\/pt\/point-of-sale\/design-your-integration\/choose-your-architecture#cloud-communications\">cloud-based communications<\/a>, you can use the existing API key that you use for Terminal API requests.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Hardware<\/strong><\/td>\n<td style=\"text-align: left;\">Android payment terminals.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">Requests to live Management API endpoints related to scheduling terminal actions are subject to <a href=\"\/pt\/point-of-sale\/automating-terminal-management#rate-limits-in-the-live-environment\">rate limits<\/a>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"when-actions-take-effect\">When planned actions take effect<\/h2>\n<p>Terminal actions are changes in the configuration of the terminal. The terminal receives configuration changes when it makes a <a href=\"\/pt\/point-of-sale\/managing-terminals\/maintain-performance\">maintenance call<\/a> and implements the changes when it reboots at the <a href=\"\/pt\/point-of-sale\/managing-terminals\/maintain-performance#rebooting-at-the-restart-hour\">restart hour<\/a> (at 06:00 AM by default).<br \/>\nTo ensure this process succeeds, we recommend that you keep your terminals turned on and connected to the network overnight.<\/p>\n<p>In the case of <a href=\"#android-actions\">Android terminal actions<\/a>, the terminal does not wait until the restart hour.<\/p>\n<ul>\n<li>If you planned the Android action without a date and time, the action is implemented with the next maintenance call. If WebSockets are enabled, the action is implemented immediately.<\/li>\n<li>If you planned the Android action for a specific date and time, the action is implemented with the first maintenance call after that date\/time in the time zone of the terminal. If WebSockets are enabled, the action is implemented at the exact date and time that you specified.<\/li>\n<\/ul>\n<p>If the action involves an Android app that is already installed on the terminal and that happens to be open at the time of the action, the app closes.<\/p>\n<h2 id=\"android-actions\">Android terminal actions<\/h2>\n<p><em>Android terminal actions<\/em> are related to the deployment of apps that you want to run on your Android terminals. For example, a POS app. To run such an app, you need to install it on the terminal. Maybe you also need to remove an old version that you no longer want to use.<\/p>\n<p>Some apps need a digital certificate. For example, a certificate to protect network communications between a POS app and the back end of that app. Such a certificate needs to be installed on the terminal, and replaced with a new one before the validity period of the certificate expires.<\/p>\n<p>To sum up, Android terminal actions you can plan are:<\/p>\n<ul>\n<li>Install a new app or app version.<\/li>\n<li>Uninstall an old app or app version.<\/li>\n<li>Install a new certificate.<\/li>\n<li>Uninstall an expired certificate.<\/li>\n<\/ul>\n<p>These actions are part of a larger process where you:<\/p>\n<ol>\n<li>Make sure that the app meets the <a href=\"\/pt\/point-of-sale\/android-terminals\/app-requirements\">requirements<\/a>.<\/li>\n<li><a href=\"\/pt\/point-of-sale\/android-terminals\/deploy-apps\/upload#upload-your-app\">Upload the app<\/a> in your Customer Area. We then sign the app and convert it so that the terminal can handle the app.<\/li>\n<li>If the app requires a certificate, <a href=\"\/pt\/point-of-sale\/android-terminals\/deploy-apps\/upload#upload-cert\">upload the certificate<\/a> as well, so that we can sign it.<\/li>\n<li>Plan terminal actions to install or uninstall apps and certificates. You can plan actions <a href=\"\/pt\/point-of-sale\/android-terminals\/deploy-apps\/schedule\">in your Customer Area<\/a>, but here we describe how to plan actions by making API calls to:\n<ol>\n<li><a href=\"#get-android-apps-and-certs\">Get the IDs of the apps or certificates<\/a> that have been uploaded.<\/li>\n<li><a href=\"#get-terminal-ids\">Get the IDs of the terminals<\/a> that you want to apply the action to.<\/li>\n<li><a href=\"#plan-android-action\">Plan an Android terminal action<\/a>.<\/li>\n<\/ol><\/li>\n<\/ol>\n<h2 id=\"get-android-apps-and-certs\">1. Get Android app and certificate IDs<\/h2>\n<p>When planning an Android terminal action, you need to provide the ID of the Android app or certificate you want to install or uninstall. To get those IDs, check which apps and certificates have been uploaded:<\/p>\n<ol>\n<li>\n<p>Make sure that you know the ID of your company. If you do not know this ID, make a GET  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/companies<\/a> request.<\/p>\n<\/li>\n<li>\n<p>Check what Android apps and optionally what Android certificates are available.<\/p>\n\n<div id=\"tab8ZwPC\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Get Android apps&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Get a list of Android apps that have been uploaded, by making a GET  &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;\\\/companies\\\/{companyId}\\\/androidApps&lt;\\\/a&gt; request.&lt;br \\\/&gt;\\nThese are the query parameters to filter the paginated response:&lt;\\\/p&gt;\\n&lt;ul&gt;\\n&lt;li&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#query-pageNumber\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;pageNumber&lt;\\\/a&gt;&amp;#58; returns the apps shown on the specified page.&lt;\\\/li&gt;\\n&lt;li&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#query-pageSize\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;pageSize&lt;\\\/a&gt;&amp;#58; the number of apps to have on a page. The default is 20, the maximum is 100.&lt;\\\/li&gt;\\n&lt;\\\/ul&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Get list of uploaded apps&#039;\\&quot; :id=\\&quot;&#039;get-list-of-uploaded-apps-1966459878&#039;\\&quot; :code-data=\\&quot;[{&amp;quot;language&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;curl https:\\\\\\\/\\\\\\\/management-test.adyen.com\\\\\\\/v3\\\\\\\/companies\\\\\\\/COMPANY_ID\\\\\\\/androidApps \\\\\\\\\\\\n-H &#039;x-API-key: ADYEN_API_KEY&#039; \\\\\\\\\\\\n-X GET&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;java&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Java&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Java API Library v25.0.0\\\\nimport com.adyen.Client;\\\\nimport com.adyen.enums.Environment;\\\\nimport com.adyen.service.management.*;\\\\n\\\\nClient client = new Client(\\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, Environment.TEST);\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nAndroidFilesCompanyLevelApi service = new AndroidFilesCompanyLevelApi(client);\\\\nAndroidAppsResponse response = service.listAndroidApps(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;String\\\\&amp;quot;, 1, null);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;php&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;PHP&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen PHP API Library v17.4.0\\\\nuse Adyen\\\\\\\\Client;\\\\nuse Adyen\\\\\\\\Environment;\\\\nuse Adyen\\\\\\\\Service\\\\\\\\Management\\\\\\\\AndroidFilesCompanyLevelApi;\\\\n\\\\n$client = new Client();\\\\n$client-&amp;gt;setXApiKey(\\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;);\\\\n$client-&amp;gt;setEnvironment(Environment::TEST);\\\\n\\\\n$requestOptions[&#039;queryParams&#039;] = array(&#039;pageNumber&#039; =&amp;gt; &#039;integer&#039;, &#039;pageSize&#039; =&amp;gt; &#039;integer&#039;, &#039;packageName&#039; =&amp;gt; &#039;string&#039;, &#039;versionCode&#039; =&amp;gt; &#039;integer&#039;);\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\n$service = new AndroidFilesCompanyLevelApi($client);\\\\n$response = $service-&amp;gt;listAndroidApps(&#039;companyId&#039;, $requestOptions);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;cs&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;C#&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen .net API Library v14.3.0\\\\nusing Adyen;\\\\nusing Environment = Adyen.Model.Environment;\\\\nusing Adyen.Service.Management;\\\\n\\\\nvar config = new Config()\\\\n{\\\\n    XApiKey = \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;,\\\\n    Environment = Environment.Test\\\\n};\\\\nvar client = new Client(config);\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nvar service = new AndroidFilesCompanyLevelService(client);\\\\nvar response = service.ListAndroidApps(\\\\&amp;quot;companyId\\\\&amp;quot;, pageNumber: 1, pageSize: 1, packageName: \\\\&amp;quot;string\\\\&amp;quot;, versionCode: 1);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;js&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;NodeJS (JavaScript)&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Node API Library v16.2.0\\\\n\\\\\\\/\\\\\\\/ Require the parts of the module you want to use\\\\nconst { Client, ManagementAPI } = require(&#039;@adyen\\\\\\\/api-library&#039;);\\\\n\\\\n\\\\\\\/\\\\\\\/ Initialize the client object\\\\nconst client = new Client({apiKey: \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, environment: \\\\&amp;quot;TEST\\\\&amp;quot;});\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nconst managementAPI = new ManagementAPI(client);\\\\nconst response = managementAPI.AndroidFilesCompanyLevelApi.listAndroidApps(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;string\\\\&amp;quot;, 1);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;go&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Go&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Go API Library v9.2.0\\\\nimport (\\\\n\\\\t\\\\&amp;quot;context\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/common\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/adyen\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/management\\\\&amp;quot;\\\\n)\\\\n\\\\nclient := adyen.NewClient(&amp;amp;common.Config{\\\\n    ApiKey:      \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;,\\\\n    Environment: common.TestEnv,\\\\n})\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nservice := client.Management()\\\\nreq := service.AndroidFilesCompanyLevelApi.ListAndroidAppsInput(\\\\&amp;quot;companyId\\\\&amp;quot;)\\\\nreq = req.PageNumber(1).PageSize(1).PackageName(\\\\&amp;quot;string\\\\&amp;quot;).VersionCode(1)res, httpRes, err := service.AndroidFilesCompanyLevelApi.ListAndroidApps(context.Background(), req)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;py&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Python&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;# Adyen Python API Library v12.2.0\\\\nimport Adyen\\\\n\\\\nadyen = Adyen.Adyen()\\\\nadyen.client.xapikey = \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;\\\\nadyen.client.platform = \\\\&amp;quot;test\\\\&amp;quot; # The environment to use library in.\\\\n\\\\nquery_parameters = {\\\\n  \\\\&amp;quot;pageNumber\\\\&amp;quot; : \\\\&amp;quot;integer\\\\&amp;quot;,\\\\n  \\\\&amp;quot;pageSize\\\\&amp;quot; : \\\\&amp;quot;integer\\\\&amp;quot;,\\\\n  \\\\&amp;quot;packageName\\\\&amp;quot; : \\\\&amp;quot;string\\\\&amp;quot;,\\\\n  \\\\&amp;quot;versionCode\\\\&amp;quot; : \\\\&amp;quot;integer\\\\&amp;quot;\\\\n}\\\\n\\\\nresult = adyen.management.android_files_company_level_api.list_android_apps(companyId=\\\\&amp;quot;companyId\\\\&amp;quot;, query_parameters=query_parameters)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;rb&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Ruby&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;# Adyen Ruby API Library v9.2.0\\\\nrequire \\\\&amp;quot;adyen-ruby-api-library\\\\&amp;quot;\\\\n\\\\nadyen = Adyen::Client.new\\\\nadyen.api_key = &#039;ADYEN_API_KEY&#039;\\\\nadyen.env = :test # Set to \\\\&amp;quot;live\\\\&amp;quot; for live environment\\\\n\\\\nquery_params = {\\\\n  :pageNumber =&amp;gt; &#039;integer&#039;,\\\\n  :pageSize =&amp;gt; &#039;integer&#039;,\\\\n  :packageName =&amp;gt; &#039;string&#039;,\\\\n  :versionCode =&amp;gt; &#039;integer&#039;\\\\n}\\\\n\\\\nresult = adyen.management.android_files_company_level_api.list_android_apps(&#039;companyId&#039;, query_params: query_params)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;ts&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;NodeJS (TypeScript)&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Node API Library v16.2.0\\\\n\\\\\\\/\\\\\\\/ Require the parts of the module you want to use\\\\nimport { Client, ManagementAPI, Types } from \\\\&amp;quot;@adyen\\\\\\\/api-library\\\\&amp;quot;;\\\\n\\\\n\\\\\\\/\\\\\\\/ Initialize the client object\\\\nconst client = new Client({apiKey: \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, environment: \\\\&amp;quot;TEST\\\\&amp;quot;});\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nconst managementAPI = new ManagementAPI(client);\\\\nconst response = managementAPI.AndroidFilesCompanyLevelApi.listAndroidApps(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;string\\\\&amp;quot;, 1);&amp;quot;}]\\&quot; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;The response returns the following details of all apps that have been &lt;a href=\\&quot;\\\/pt\\\/point-of-sale\\\/android-terminals\\\/deploy-apps\\\/upload#upload-your-app\\&quot;&gt;uploaded&lt;\\\/a&gt; to Adyen and are in the &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ready&lt;\\\/strong&gt;&lt;\\\/span&gt; status:&lt;\\\/p&gt;\\n&lt;table&gt;\\n&lt;thead&gt;\\n&lt;tr&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Response parameter&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Description&lt;\\\/th&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/thead&gt;\\n&lt;tbody&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-id\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;id&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The unique, Adyen-generated identifier of the app. Starts with &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ANDA&lt;\\\/strong&gt;&lt;\\\/span&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-packageName\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;packageName&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The package name of the app. For example, &lt;strong&gt;com.your_company.posapp&lt;\\\/strong&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-versionCode\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;versionCode&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The internal version number of the app.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-description\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;description&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The description that was entered in the Customer Area when uploading the app. The description is not shown on the terminal.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-label\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;label&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The app name that is shown on the terminal.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-versionName\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;versionName&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The app version number that is shown on the terminal.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidApps#responses-200-data-status\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;status&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The status of the app: &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ready&lt;\\\/strong&gt;&lt;\\\/span&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/tbody&gt;\\n&lt;\\\/table&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Response&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;json\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;{\\\\n    \\\\\\&quot;androidApps\\\\\\&quot;: [\\\\n        {\\\\n            \\\\\\&quot;id\\\\\\&quot;: \\\\\\&quot;ANDA422LZ223223K5F694GCCF732K8\\\\\\&quot;,\\\\n            \\\\\\&quot;packageName\\\\\\&quot;: \\\\\\&quot;com.your_company.posapp\\\\\\&quot;,\\\\n            \\\\\\&quot;versionCode\\\\\\&quot;: 7700203,\\\\n            \\\\\\&quot;description\\\\\\&quot;: \\\\\\&quot;POS2\\\\\\&quot;,\\\\n            \\\\\\&quot;label\\\\\\&quot;: \\\\\\&quot;POS app\\\\\\&quot;,\\\\n            \\\\\\&quot;versionName\\\\\\&quot;: \\\\\\&quot;7.7\\\\\\&quot;,\\\\n            \\\\\\&quot;status\\\\\\&quot;: \\\\\\&quot;ready\\\\\\&quot;\\\\n        },\\\\n        {\\\\n            \\\\\\&quot;id\\\\\\&quot;: \\\\\\&quot;ANDA422LZ223223K5F694FWCF738PL\\\\\\&quot;,\\\\n            \\\\\\&quot;packageName\\\\\\&quot;: \\\\\\&quot;com.your_company.posapp\\\\\\&quot;,\\\\n            \\\\\\&quot;versionCode\\\\\\&quot;: 7602003,\\\\n            \\\\\\&quot;description\\\\\\&quot;: \\\\\\&quot;POS1\\\\\\&quot;,\\\\n            \\\\\\&quot;label\\\\\\&quot;: \\\\\\&quot;POS app\\\\\\&quot;,\\\\n            \\\\\\&quot;versionName\\\\\\&quot;: \\\\\\&quot;7.6\\\\\\&quot;,\\\\n            \\\\\\&quot;status\\\\\\&quot;: \\\\\\&quot;ready\\\\\\&quot;\\\\n        }\\\\n    ]\\\\n}\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;get_android_apps_0_1&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Get Android certificates&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Get a list of Android certificates that have been uploaded, by making a GET  &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;\\\/companies\\\/{companyId}\\\/androidCertificates&lt;\\\/a&gt; request.&lt;br \\\/&gt;\\nThese are the query parameters to filter the paginated response:&lt;\\\/p&gt;\\n&lt;ul&gt;\\n&lt;li&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#query-pageNumber\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;pageNumber&lt;\\\/a&gt;&amp;#58; returns the certificates shown on the specified page.&lt;\\\/li&gt;\\n&lt;li&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#query-pageSize\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;pageSize&lt;\\\/a&gt;&amp;#58; the number of certificates to have on a page. The default is 20, the maximum is 100.&lt;\\\/li&gt;\\n&lt;\\\/ul&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Get list of uploaded certificates&#039;\\&quot; :id=\\&quot;&#039;get-list-of-uploaded-certificates-3800609220&#039;\\&quot; :code-data=\\&quot;[{&amp;quot;language&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;curl https:\\\\\\\/\\\\\\\/management-test.adyen.com\\\\\\\/v3\\\\\\\/companies\\\\\\\/COMPANY_ID\\\\\\\/androidCertificates \\\\\\\\\\\\n-H &#039;x-API-key: ADYEN_API_KEY&#039; \\\\\\\\\\\\n-X GET&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;java&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Java&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Java API Library v25.0.0\\\\nimport com.adyen.Client;\\\\nimport com.adyen.enums.Environment;\\\\nimport com.adyen.service.management.*;\\\\n\\\\nClient client = new Client(\\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, Environment.TEST);\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nAndroidFilesCompanyLevelApi service = new AndroidFilesCompanyLevelApi(client);\\\\nAndroidCertificatesResponse response = service.listAndroidCertificates(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;String\\\\&amp;quot;, null);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;php&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;PHP&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen PHP API Library v17.4.0\\\\nuse Adyen\\\\\\\\Client;\\\\nuse Adyen\\\\\\\\Environment;\\\\nuse Adyen\\\\\\\\Service\\\\\\\\Management\\\\\\\\AndroidFilesCompanyLevelApi;\\\\n\\\\n$client = new Client();\\\\n$client-&amp;gt;setXApiKey(\\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;);\\\\n$client-&amp;gt;setEnvironment(Environment::TEST);\\\\n\\\\n$requestOptions[&#039;queryParams&#039;] = array(&#039;pageNumber&#039; =&amp;gt; &#039;integer&#039;, &#039;pageSize&#039; =&amp;gt; &#039;integer&#039;, &#039;certificateName&#039; =&amp;gt; &#039;string&#039;);\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\n$service = new AndroidFilesCompanyLevelApi($client);\\\\n$response = $service-&amp;gt;listAndroidCertificates(&#039;companyId&#039;, $requestOptions);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;cs&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;C#&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen .net API Library v14.3.0\\\\nusing Adyen;\\\\nusing Environment = Adyen.Model.Environment;\\\\nusing Adyen.Service.Management;\\\\n\\\\nvar config = new Config()\\\\n{\\\\n    XApiKey = \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;,\\\\n    Environment = Environment.Test\\\\n};\\\\nvar client = new Client(config);\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nvar service = new AndroidFilesCompanyLevelService(client);\\\\nvar response = service.ListAndroidCertificates(\\\\&amp;quot;companyId\\\\&amp;quot;, pageNumber: 1, pageSize: 1, certificateName: \\\\&amp;quot;string\\\\&amp;quot;);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;js&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;NodeJS (JavaScript)&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Node API Library v16.2.0\\\\n\\\\\\\/\\\\\\\/ Require the parts of the module you want to use\\\\nconst { Client, ManagementAPI } = require(&#039;@adyen\\\\\\\/api-library&#039;);\\\\n\\\\n\\\\\\\/\\\\\\\/ Initialize the client object\\\\nconst client = new Client({apiKey: \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, environment: \\\\&amp;quot;TEST\\\\&amp;quot;});\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nconst managementAPI = new ManagementAPI(client);\\\\nconst response = managementAPI.AndroidFilesCompanyLevelApi.listAndroidCertificates(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;string\\\\&amp;quot;);&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;go&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Go&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Go API Library v9.2.0\\\\nimport (\\\\n\\\\t\\\\&amp;quot;context\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/common\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/adyen\\\\&amp;quot;\\\\n\\\\t\\\\&amp;quot;github.com\\\\\\\/adyen\\\\\\\/adyen-go-api-library\\\\\\\/v9\\\\\\\/src\\\\\\\/management\\\\&amp;quot;\\\\n)\\\\n\\\\nclient := adyen.NewClient(&amp;amp;common.Config{\\\\n    ApiKey:      \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;,\\\\n    Environment: common.TestEnv,\\\\n})\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nservice := client.Management()\\\\nreq := service.AndroidFilesCompanyLevelApi.ListAndroidCertificatesInput(\\\\&amp;quot;companyId\\\\&amp;quot;)\\\\nreq = req.PageNumber(1).PageSize(1).CertificateName(\\\\&amp;quot;string\\\\&amp;quot;)res, httpRes, err := service.AndroidFilesCompanyLevelApi.ListAndroidCertificates(context.Background(), req)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;py&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Python&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;# Adyen Python API Library v12.2.0\\\\nimport Adyen\\\\n\\\\nadyen = Adyen.Adyen()\\\\nadyen.client.xapikey = \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;\\\\nadyen.client.platform = \\\\&amp;quot;test\\\\&amp;quot; # The environment to use library in.\\\\n\\\\nquery_parameters = {\\\\n  \\\\&amp;quot;pageNumber\\\\&amp;quot; : \\\\&amp;quot;integer\\\\&amp;quot;,\\\\n  \\\\&amp;quot;pageSize\\\\&amp;quot; : \\\\&amp;quot;integer\\\\&amp;quot;,\\\\n  \\\\&amp;quot;certificateName\\\\&amp;quot; : \\\\&amp;quot;string\\\\&amp;quot;\\\\n}\\\\n\\\\nresult = adyen.management.android_files_company_level_api.list_android_certificates(companyId=\\\\&amp;quot;companyId\\\\&amp;quot;, query_parameters=query_parameters)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;rb&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;Ruby&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;# Adyen Ruby API Library v9.2.0\\\\nrequire \\\\&amp;quot;adyen-ruby-api-library\\\\&amp;quot;\\\\n\\\\nadyen = Adyen::Client.new\\\\nadyen.api_key = &#039;ADYEN_API_KEY&#039;\\\\nadyen.env = :test # Set to \\\\&amp;quot;live\\\\&amp;quot; for live environment\\\\n\\\\nquery_params = {\\\\n  :pageNumber =&amp;gt; &#039;integer&#039;,\\\\n  :pageSize =&amp;gt; &#039;integer&#039;,\\\\n  :certificateName =&amp;gt; &#039;string&#039;\\\\n}\\\\n\\\\nresult = adyen.management.android_files_company_level_api.list_android_certificates(&#039;companyId&#039;, query_params: query_params)&amp;quot;},{&amp;quot;language&amp;quot;:&amp;quot;ts&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;NodeJS (TypeScript)&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;\\\\\\\/\\\\\\\/ Adyen Node API Library v16.2.0\\\\n\\\\\\\/\\\\\\\/ Require the parts of the module you want to use\\\\nimport { Client, ManagementAPI, Types } from \\\\&amp;quot;@adyen\\\\\\\/api-library\\\\&amp;quot;;\\\\n\\\\n\\\\\\\/\\\\\\\/ Initialize the client object\\\\nconst client = new Client({apiKey: \\\\&amp;quot;ADYEN_API_KEY\\\\&amp;quot;, environment: \\\\&amp;quot;TEST\\\\&amp;quot;});\\\\n\\\\n\\\\\\\/\\\\\\\/ Make the request\\\\nconst managementAPI = new ManagementAPI(client);\\\\nconst response = managementAPI.AndroidFilesCompanyLevelApi.listAndroidCertificates(\\\\&amp;quot;companyId\\\\&amp;quot;, 1, 1, \\\\&amp;quot;string\\\\&amp;quot;);&amp;quot;}]\\&quot; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;The response returns the following details of all certificates that have been &lt;a href=\\&quot;\\\/pt\\\/point-of-sale\\\/android-terminals\\\/deploy-apps\\\/upload#upload-cert\\&quot;&gt;uploaded&lt;\\\/a&gt; to Adyen and are in the &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ready&lt;\\\/strong&gt;&lt;\\\/span&gt; status:&lt;\\\/p&gt;\\n&lt;table&gt;\\n&lt;thead&gt;\\n&lt;tr&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Response parameter&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Description&lt;\\\/th&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/thead&gt;\\n&lt;tbody&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-id\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;id&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The unique, Adyen-generated identifier of the certificate. Starts with &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ANDC&lt;\\\/strong&gt;&lt;\\\/span&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-name\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;name&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The file name of the certificate. For example, &lt;strong&gt;mycert&lt;\\\/strong&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-extension\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;extension&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The file format of the certificate, as indicated by the file extension. For example, &lt;strong&gt;.crt&lt;\\\/strong&gt; or &lt;strong&gt;.pem&lt;\\\/strong&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-description\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;description&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The description that was entered in the Customer Area when uploading the certificate.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-status\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;status&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The status of the certificate: &lt;span translate=\\&quot;no\\&quot;&gt;&lt;strong&gt;ready&lt;\\\/strong&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-notBefore\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;notBefore&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The date when this certificate starts to be valid.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt; &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Management\\\/latest\\\/get\\\/companies\\\/(companyId)\\\/androidCertificates#responses-200-data-notAfter\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;notAfter&lt;\\\/a&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The date when this certificate stops to be valid.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/tbody&gt;\\n&lt;\\\/table&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Response&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;json\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;{\\\\n    \\\\\\&quot;androidCertificates\\\\\\&quot;: [\\\\n        {\\\\n            \\\\\\&quot;id\\\\\\&quot;: \\\\\\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\\\\\&quot;,\\\\n            \\\\\\&quot;name\\\\\\&quot;: \\\\\\&quot;mycert\\\\\\&quot;,\\\\n            \\\\\\&quot;extension\\\\\\&quot;: \\\\\\&quot;.crt\\\\\\&quot;,\\\\n            \\\\\\&quot;description\\\\\\&quot;: \\\\\\&quot;\\\\\\&quot;,\\\\n            \\\\\\&quot;status\\\\\\&quot;: \\\\\\&quot;ready\\\\\\&quot;,\\\\n            \\\\\\&quot;notBefore\\\\\\&quot;: \\\\\\&quot;2008-04-20T00:00:00+02:00\\\\\\&quot;,\\\\n            \\\\\\&quot;notAfter\\\\\\&quot;: \\\\\\&quot;2038-04-12T00:00:00+02:00\\\\\\&quot;\\\\n        },\\\\n        {\\\\n            \\\\\\&quot;id\\\\\\&quot;: \\\\\\&quot;ANDC533MA33433L689OWO0TM5WQI\\\\\\&quot;,\\\\n            \\\\\\&quot;name\\\\\\&quot;: \\\\\\&quot;mynewcert\\\\\\&quot;,\\\\n            \\\\\\&quot;extension\\\\\\&quot;: \\\\\\&quot;.pem\\\\\\&quot;,\\\\n            \\\\\\&quot;description\\\\\\&quot;: \\\\\\&quot;\\\\\\&quot;,\\\\n            \\\\\\&quot;status\\\\\\&quot;: \\\\\\&quot;ready\\\\\\&quot;,\\\\n            \\\\\\&quot;notBefore\\\\\\&quot;: \\\\\\&quot;20018-04-20T00:00:00+02:00\\\\\\&quot;,\\\\n            \\\\\\&quot;notAfter\\\\\\&quot;: \\\\\\&quot;2048-04-12T00:00:00+02:00\\\\\\&quot;\\\\n        }\\\\n    ]\\\\n}\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;get_android_certificates_1_2&quot;,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='false'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<\/li>\n<li>\n<p>From the response, save the <code>id<\/code> of the Android app or certificate that you want to install or uninstall.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"get-terminal-ids\">2. Get terminal IDs<\/h2>\n<p>When planning an Android terminal action, you need to provide the IDs of the terminals that you want to apply an action to. To create a list of terminals:<\/p>\n<ol>\n<li>\n<p>Make a GET  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/terminals<\/a> request using query parameters to restrict the list to terminals that match specific conditions. You can specify multiple values for a single query parameter like this: <code>\/terminals?countryCodes=NL,FR<\/code>.<\/p>\n<p>These are the query parameters to filter the paginated response:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Query parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#query-searchQuery\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">searchQuery<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Returns terminals with an ID that contains the specified string. <div class=\"notices green\">If you use this query parameter, other query parameters are ignored.<\/div><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#query-countries\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">countries<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Returns terminals located in the specified countries\/regions. <br>Format: the two-letter <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1_alpha-2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">ISO-3166-1 alpha-2<\/a> country code. Exception: <strong>QZ<\/strong> (Kosovo).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#query-merchantIds\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">merchantIds<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Returns terminals that belong to the merchant accounts specified by their unique ID. <br> For a list of merchant account IDs, make a GET request to  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/merchants\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/companies\/{companyId}\/merchants<\/a>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#query-storeIds\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">storeIds<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Returns terminals that are assigned to the stores specified by their unique store ID. <br> For a list of store IDs, make a <a href=\"\/pt\/point-of-sale\/design-your-integration\/determine-account-structure\/automate-store-management#get-all-stores\">GET <code>\/stores<\/code><\/a> request.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#query-brandModels\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">brandModels<\/a><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Returns terminals of the specified models in the format <em>brand.model<\/em>. For example, <span translate=\"no\"><strong>Castles.S1F2<\/strong><\/span>. <br> For a list of brand models, make a <a href=\"\/pt\/point-of-sale\/automating-terminal-management\/order-terminals-api#get-product-id\">GET <code>\/terminalModels<\/code><\/a> request and use the <code>id<\/code> from the response.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#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 style=\"text-align: left;\">Returns the terminals shown on the specified page.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#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 style=\"text-align: left;\">The number of terminals to have on a page. The default is 20, the maximum is 100.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The following example shows how to create a list of all <span translate=\"no\"><strong>S1E<\/strong><\/span> and <span translate=\"no\"><strong>S1F2<\/strong><\/span> Android terminals for a specific merchant account.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Get terminals'\" :id=\"'get-terminals-1464943596'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/management-test.adyen.com\\\/v3\\\/terminals?brandmodel=Castles.S1E,Castles.S1F2&amp;merchantId=ADYEN_MERCHANT_ACCOUNT \\\\\\n-H 'x-API-key: ADYEN_API_KEY' \\\\\\n-X GET&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v25.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.service.management.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\\/\\\/ Make the request\\nTerminalsTerminalLevelApi service = new TerminalsTerminalLevelApi(client);\\nListTerminalsResponse response = service.listTerminals(\\&quot;String\\&quot;, \\&quot;String\\&quot;, \\&quot;String\\&quot;, \\&quot;String\\&quot;, \\&quot;String\\&quot;, \\&quot;String\\&quot;, 1, 1, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v17.4.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Service\\\\Management\\\\TerminalsTerminalLevelApi;\\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('searchQuery' =&gt; 'string', 'otpQuery' =&gt; 'string', 'countries' =&gt; 'string', 'merchantIds' =&gt; 'string', 'storeIds' =&gt; 'string', 'brandModels' =&gt; 'string', 'pageNumber' =&gt; 'integer', 'pageSize' =&gt; 'integer');\\n\\n\\\/\\\/ Make the request\\n$service = new TerminalsTerminalLevelApi($client);\\n$response = $service-&gt;listTerminals($requestOptions);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v14.3.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Service.Management;\\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\\\/\\\/ Make the request\\nvar service = new TerminalsTerminalLevelService(client);\\nvar response = service.ListTerminals(searchQuery: \\&quot;string\\&quot;, otpQuery: \\&quot;string\\&quot;, countries: \\&quot;string\\&quot;, merchantIds: \\&quot;string\\&quot;, storeIds: \\&quot;string\\&quot;, brandModels: \\&quot;string\\&quot;, pageNumber: 1, pageSize: 1);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, ManagementAPI } = require('@adyen\\\/api-library');\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalsTerminalLevelApi.listTerminals(\\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, 1, 1);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v9.2.0\\nimport (\\n\\t\\&quot;context\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/management\\&quot;\\n)\\n\\nclient := adyen.NewClient(&amp;common.Config{\\n    ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Make the request\\nservice := client.Management()\\nreq := service.TerminalsTerminalLevelApi.ListTerminalsInput()\\nreq = req.SearchQuery(\\&quot;string\\&quot;).OtpQuery(\\&quot;string\\&quot;).Countries(\\&quot;string\\&quot;).MerchantIds(\\&quot;string\\&quot;).StoreIds(\\&quot;string\\&quot;).BrandModels(\\&quot;string\\&quot;).PageNumber(1).PageSize(1)res, httpRes, err := service.TerminalsTerminalLevelApi.ListTerminals(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.2.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;searchQuery\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;otpQuery\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;countries\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;merchantIds\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;storeIds\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;brandModels\\&quot; : \\&quot;string\\&quot;,\\n  \\&quot;pageNumber\\&quot; : \\&quot;integer\\&quot;,\\n  \\&quot;pageSize\\&quot; : \\&quot;integer\\&quot;\\n}\\n\\nresult = adyen.management.terminals_terminal_level_api.list_terminals(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.2.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\\nquery_params = {\\n  :searchQuery =&gt; 'string',\\n  :otpQuery =&gt; 'string',\\n  :countries =&gt; 'string',\\n  :merchantIds =&gt; 'string',\\n  :storeIds =&gt; 'string',\\n  :brandModels =&gt; 'string',\\n  :pageNumber =&gt; 'integer',\\n  :pageSize =&gt; 'integer'\\n}\\n\\nresult = adyen.management.terminals_terminal_level_api.list_terminals(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 v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, ManagementAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalsTerminalLevelApi.listTerminals(\\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, \\&quot;string\\&quot;, 1, 1);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>For each terminal, notice in the response:<\/p>\n<ul>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#responses-200-data-id\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">id<\/a>&#58; the unique terminal ID.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#responses-200-data\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">status<\/a>&#58; indicates when the terminal was last online, whether the terminal is being reassigned, or whether the terminal is turned off. If the terminal was last online more that a week ago, it is also shown as turned off.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/terminals#responses-200-data-assigned\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">assigned<\/a>&#58; <span translate=\"no\"><strong>true<\/strong><\/span> indicates the terminal is assigned to a store, or to a merchant account representing a store. <span translate=\"no\"><strong>false<\/strong><\/span> indicates the terminal is in <a href=\"\/pt\/point-of-sale\/automating-terminal-management\/assign-terminals-api#inventory-and-in-store\">inventory<\/a>.<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"terminals\\\": [\\n        {\\n            \\\"id\\\": \\\"S1E-000150183300032\\\",\\n            \\\"status\\\": \\\"SwitchedOff\\\",\\n            \\\"assigned\\\": true,\\n            \\\"bluetoothMac\\\": \\\"a4:60:11:83:0e:00\\\",\\n            \\\"companyAccount\\\": \\\"TestCompany\\\",\\n            \\\"deviceModel\\\": \\\"S1E\\\",\\n            \\\"ethernetMac\\\": \\\"64:5a:ed:f5:68:55\\\",\\n            \\\"firmwareVersion\\\": \\\"Castles_Android 1.79.4\\\",\\n            \\\"iccid\\\": \\\"6006491286999921374\\\",\\n            \\\"lastActivityDateTime\\\": \\\"2022-08-05T14:48:10+02:00\\\",\\n            \\\"lastTransactionDateTime\\\": \\\"2022-08-05T14:32:10+02:00\\\",\\n            \\\"serialNumber\\\": \\\"000150183300032\\\",\\n            \\\"city\\\": \\\"Amsterdam\\\",\\n            \\\"countryCode\\\": \\\"NL\\\",\\n            \\\"storeStatus\\\": \\\"Active\\\",\\n            \\\"wifiIp\\\": \\\"198.51.100.1\\\",\\n            \\\"wifiMac\\\": \\\"C4:6E:00:16:A1:01\\\",\\n            \\\"wifiSsid\\\": \\\"GUEST\\\"\\n        },\\n        {\\n            \\\"id\\\": \\\"S1E-000150183300033\\\",\\n            \\\"status\\\": \\\"OnlineToday\\\",\\n            \\\"assigned\\\": true,\\n            \\\"bluetoothMac\\\": \\\"a4:60:11:83:0e:00\\\",\\n            \\\"companyAccount\\\": \\\"TestCompany\\\",\\n            \\\"deviceModel\\\": \\\"S1E\\\",\\n            \\\"ethernetMac\\\": \\\"64:5a:ed:f5:68:55\\\",\\n            \\\"firmwareVersion\\\": \\\"Castles_Android 1.79.4\\\",\\n            \\\"iccid\\\": \\\"6006491286999921374\\\",\\n            \\\"lastActivityDateTime\\\": \\\"2022-08-09T12:44:11+02:00\\\",\\n            \\\"lastTransactionDateTime\\\": \\\"2022-07-27T11:35:44+02:00\\\",\\n            \\\"serialNumber\\\": \\\"000150183300033\\\",\\n            \\\"city\\\": \\\"Amsterdam\\\",\\n            \\\"countryCode\\\": \\\"NL\\\",\\n            \\\"storeStatus\\\": \\\"Active\\\",\\n            \\\"wifiIp\\\": \\\"198.51.100.1\\\",\\n            \\\"wifiMac\\\": \\\"C4:6E:00:16:A1:01\\\",\\n            \\\"wifiSsid\\\": \\\"GUEST\\\"\\n        },\\n        {\\n            \\\"id\\\": \\\"S1F2-000150183300034\\\",\\n            \\\"status\\\": \\\"onlineLast1Day\\\",\\n            \\\"assigned\\\": true,\\n            \\\"bluetoothMac\\\": \\\"a4:60:11:83:0e:00\\\",\\n            \\\"companyAccount\\\": \\\"TestCompany\\\",\\n            \\\"deviceModel\\\": \\\"S1F2\\\",\\n            \\\"ethernetMac\\\": \\\"64:5a:ed:f5:68:55\\\",\\n            \\\"firmwareVersion\\\": \\\"Castles_Android 1.79.4\\\",\\n            \\\"iccid\\\": \\\"6006491286999921374\\\",\\n            \\\"lastActivityDateTime\\\": \\\"2022-08-08T14:48:10+02:00\\\",\\n            \\\"lastTransactionDateTime\\\": \\\"2022-07-27T11:56:59+02:00\\\",\\n            \\\"serialNumber\\\": \\\"000150183300034\\\",\\n            \\\"city\\\": \\\"Amsterdam\\\",\\n            \\\"countryCode\\\": \\\"NL\\\",\\n            \\\"storeStatus\\\": \\\"Active\\\",\\n            \\\"wifiIp\\\": \\\"198.51.100.1\\\",\\n            \\\"wifiMac\\\": \\\"C4:6E:00:16:A1:01\\\",\\n            \\\"wifiSsid\\\": \\\"GUEST\\\"\\n        }\\n    ]\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Extract the unique terminal IDs from the response.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"plan-android-action\">3. Schedule an Android terminal action<\/h2>\n<p>When planning terminal actions, be aware of the following restrictions:<\/p>\n<ul>\n<li>You can schedule one action at a time. For example, to install two different apps you have to make two API requests.<\/li>\n<li>The maximum number of terminals in a request is <strong>100<\/strong>. For example, to apply an action to 250 terminals, you have to divide the terminals over three API requests.<\/li>\n<li>If there is an error with one or more terminal IDs in the request, the action is scheduled for none of the terminals. You need to fix the error and try again.<\/li>\n<\/ul>\n<p>To plan an Android terminal action:<\/p>\n<ol>\n<li>\n<p>Make a POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/terminals\/scheduleActions<\/a> request, specifying:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Type<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#request-terminalIds\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">terminalIds<\/a><\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">String array<\/td>\n<td style=\"text-align: left;\">A list of unique IDs of the terminals to apply the action to. See <a href=\"#get-terminal-ids\">2. Get terminal IDs<\/a>. <br> Maximum length: 100 IDs.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#request-storeId\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">storeId<\/a><\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\">The unique ID of the store that the terminals are assigned to. If you do not know this ID, make a GET request to  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/stores\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/stores<\/a>. <br> The request fails if the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#request-terminalIds\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">terminalIds<\/a> do not belong to this store.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#request-scheduledAt\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">scheduledAt<\/a><\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">String<\/td>\n<td style=\"text-align: left;\">The date and time when the action should happen. <br> Format: <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc3339\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">RFC 3339<\/a>, but without the <strong>Z<\/strong> before the time offset. For example, <span translate=\"no\"><strong>2021-11-15T12:16:21+0100<\/strong><\/span> <br>The terminal installs or removes the app with the first <a href=\"#when-actions-take-effect\">maintenance call<\/a> after the specified date and time in the time zone of the terminal. An empty value causes the action to happen as soon as possible: at the next maintenance call.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#request-actionDetails\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">actionDetails<\/a><\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">String object<\/td>\n<td style=\"text-align: left;\">This is where you specify the action and the app or certificate ID. See <a href=\"#get-android-apps-and-certs\">1. Get Android app and certificate IDs<\/a> . <br> For an Android app action, this object must contain: <ul><li markdown=\"1\"><code>appId<\/code>: The unique identifier of the app.<\/li> <li markdown=\"1\"><code>type<\/code>: The type of action. Possible values: <span translate=\"no\"><strong>InstallAndroidApp<\/strong><\/span> or <span translate=\"no\"><strong>UninstallAndroidApp<\/strong><\/span>.<\/li><\/ul> <br> For an Android certificate action, this object must contain: <ul><li markdown=\"1\"><code>certificateId<\/code>: The unique identifier of the certificate.<\/li> <li markdown=\"1\"><code>type<\/code>: The type of action. Allowed values: <span translate=\"no\"><strong>InstallAndroidCertificate<\/strong><\/span> or <span translate=\"no\"><strong>UninstallAndroidCertificate<\/strong><\/span><\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The following examples show how to install an app, and how to uninstall a certificate.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Install an app'\" :id=\"'install-an-app-6357108618'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/management-test.adyen.com\\\/v3\\\/terminals\\\/scheduleActions \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-H 'x-API-key: ADYEN_API_KEY' \\\\\\n-X POST \\\\\\n-d '{\\n    \\&quot;terminalIds\\&quot;: [\\n        \\&quot;S1E-000150183300032\\&quot;,\\n        \\&quot;S1E-000150183300033\\&quot;,\\n        \\&quot;S1F2-000150183300034\\&quot;\\n    ],\\n    \\&quot;storeId\\&quot;: \\&quot;\\&quot;,\\n    \\&quot;scheduledAt\\&quot;: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n    \\&quot;actionDetails\\&quot; : {\\n        \\&quot;type\\&quot; : \\&quot;InstallAndroidApp\\&quot;,\\n        \\&quot;appId\\&quot; : \\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;\\n    }\\n}'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v25.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.management.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.management.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Request objects\\nInstallAndroidAppDetails installAndroidAppDetails = new InstallAndroidAppDetails()\\n\\t.appId(\\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;)\\n\\t.type(InstallAndroidAppDetails.TypeEnum.INSTALLANDROIDAPP);\\n\\nScheduleTerminalActionsRequest scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest()\\n\\t.actionDetails(new ScheduleTerminalActionsRequestActionDetails(installAndroidAppDetails))\\n\\t.terminalIds(Arrays.asList(\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;))\\n\\t.storeId(\\&quot;\\&quot;)\\n\\t.scheduledAt(\\&quot;2021-12-12T20:21:22-0100\\&quot;);\\n\\n\\\/\\\/ Make the request\\nTerminalActionsTerminalLevelApi service = new TerminalActionsTerminalLevelApi(client);\\nScheduleTerminalActionsResponse response = service.createTerminalAction(scheduleTerminalActionsRequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v17.4.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\Management\\\\ScheduleTerminalActionsRequestActionDetails;\\nuse Adyen\\\\Model\\\\Management\\\\ScheduleTerminalActionsRequest;\\nuse Adyen\\\\Service\\\\Management\\\\TerminalActionsTerminalLevelApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Request objects\\n$scheduleTerminalActionsRequestActionDetails = new ScheduleTerminalActionsRequestActionDetails();\\n$scheduleTerminalActionsRequestActionDetails\\n\\t-&gt;setAppId(\\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;)\\n\\t-&gt;setType(\\&quot;InstallAndroidApp\\&quot;);\\n\\n$scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest();\\n$scheduleTerminalActionsRequest\\n\\t-&gt;setActionDetails($scheduleTerminalActionsRequestActionDetails)\\n\\t-&gt;setTerminalIds(array(\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;))\\n\\t-&gt;setStoreId(\\&quot;\\&quot;)\\n\\t-&gt;setScheduledAt(\\&quot;2021-12-12T20:21:22-0100\\&quot;);\\n\\n\\\/\\\/ Make the request\\n$service = new TerminalActionsTerminalLevelApi($client);\\n$response = $service-&gt;createTerminalAction($scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v14.3.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.Management;\\nusing Adyen.Service.Management;\\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\\\/\\\/ Fill in your request objects\\nInstallAndroidAppDetails installAndroidAppDetails = new InstallAndroidAppDetails\\n{\\n\\tAppId = \\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;,\\n\\tType = InstallAndroidAppDetails.TypeEnum.InstallAndroidApp\\n};\\n\\nScheduleTerminalActionsRequest scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest\\n{\\n\\tActionDetails = new ScheduleTerminalActionsRequestActionDetails(installAndroidAppDetails),\\n\\tTerminalIds = { \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; },\\n\\tStoreId = \\&quot;\\&quot;,\\n\\tScheduledAt = \\&quot;2021-12-12T20:21:22-0100\\&quot;\\n};\\n\\n\\\/\\\/ Make the request\\nvar service = new TerminalActionsTerminalLevelService(client);\\nvar response = service.CreateTerminalAction(scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, ManagementAPI } = require('@adyen\\\/api-library');\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object\\nconst scheduleTerminalActionsRequest = {\\n  terminalIds: [ \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; ],\\n  storeId: \\&quot;\\&quot;,\\n  scheduledAt: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n  actionDetails: {\\n    type: \\&quot;InstallAndroidApp\\&quot;,\\n    appId: \\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;\\n  }\\n}\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalActionsTerminalLevelApi.createTerminalAction(scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v9.2.0\\nimport (\\n\\t\\&quot;context\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/management\\&quot;\\n)\\n\\nclient := adyen.NewClient(&amp;common.Config{\\n    ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Fill in your request objects\\ninstallAndroidAppDetails := management.InstallAndroidAppDetails{\\n\\tAppId: common.PtrString(\\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;),\\n\\tType: common.PtrString(\\&quot;InstallAndroidApp\\&quot;),\\n}\\n\\nscheduleTerminalActionsRequest := management.ScheduleTerminalActionsRequest{\\n\\tActionDetails: management.InstallAndroidAppDetailsAsScheduleTerminalActionsRequestActionDetails(&amp;installAndroidAppDetails),\\n\\tTerminalIds: []string{\\n\\t\\t\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;,\\n\\t},\\n\\tStoreId: common.PtrString(\\&quot;\\&quot;),\\n\\tScheduledAt: common.PtrString(\\&quot;2021-12-12T20:21:22-0100\\&quot;),\\n}\\n\\n\\\/\\\/ Make the request\\nservice := client.Management()\\nreq := service.TerminalActionsTerminalLevelApi.CreateTerminalActionInput().ScheduleTerminalActionsRequest(scheduleTerminalActionsRequest)\\nres, httpRes, err := service.TerminalActionsTerminalLevelApi.CreateTerminalAction(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.2.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\\njson_request = {\\n  \\&quot;terminalIds\\&quot;: [ \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; ],\\n  \\&quot;storeId\\&quot;: \\&quot;\\&quot;,\\n  \\&quot;scheduledAt\\&quot;: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n  \\&quot;actionDetails\\&quot;: {\\n    \\&quot;type\\&quot;: \\&quot;InstallAndroidApp\\&quot;,\\n    \\&quot;appId\\&quot;: \\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;\\n  }\\n}\\n\\nresult = adyen.management.terminal_actions_terminal_level_api.create_terminal_action(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.2.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\\nrequest_body = {\\n  :terminalIds =&gt; [ 'S1E-000150183300032', 'S1E-000150183300033', 'S1F2-000150183300034' ],\\n  :storeId =&gt; '',\\n  :scheduledAt =&gt; '2021-12-12T20:21:22-0100',\\n  :actionDetails =&gt; {\\n    :type =&gt; 'InstallAndroidApp',\\n    :appId =&gt; 'ANDA422LZ223223K5F694GCCF732K8'\\n  }\\n}\\n\\nresult = adyen.management.terminal_actions_terminal_level_api.create_terminal_action(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, ManagementAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request objects\\nconst installAndroidAppDetails: Types.management.InstallAndroidAppDetails = {\\n\\tappId: \\&quot;ANDA422LZ223223K5F694GCCF732K8\\&quot;,\\n\\ttype: Types.management.InstallAndroidAppDetails.TypeEnum.InstallAndroidApp\\n};\\n\\nconst scheduleTerminalActionsRequest: Types.management.ScheduleTerminalActionsRequest = {\\n\\tactionDetails: installAndroidAppDetails,\\n\\tterminalIds: [\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;],\\n\\tstoreId: \\&quot;\\&quot;,\\n\\tscheduledAt: \\&quot;2021-12-12T20:21:22-0100\\&quot;\\n};\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalActionsTerminalLevelApi.createTerminalAction(scheduleTerminalActionsRequest);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Uninstall a certificate'\" :id=\"'uninstall-a-certificate-7496268471'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/management-test.adyen.com\\\/v3\\\/terminals\\\/scheduleActions \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-H 'x-API-key: ADYEN_API_KEY' \\\\\\n-X POST \\\\\\n-d '{\\n    \\&quot;terminalIds\\&quot;: [\\n        \\&quot;S1E-000150183300032\\&quot;,\\n        \\&quot;S1E-000150183300033\\&quot;,\\n        \\&quot;S1F2-000150183300034\\&quot;\\n    ],\\n    \\&quot;storeId\\&quot;: \\&quot;\\&quot;,\\n    \\&quot;scheduledAt\\&quot;: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n    \\&quot;actionDetails\\&quot; : {\\n        \\&quot;type\\&quot; : \\&quot;UninstallAndroidCertificate\\&quot;,\\n        \\&quot;certificateId\\&quot; : \\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;\\n    }\\n}'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v25.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.management.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.management.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Request objects\\nUninstallAndroidCertificateDetails uninstallAndroidCertificateDetails = new UninstallAndroidCertificateDetails()\\n\\t.certificateId(\\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;)\\n\\t.type(UninstallAndroidCertificateDetails.TypeEnum.UNINSTALLANDROIDCERTIFICATE);\\n\\nScheduleTerminalActionsRequest scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest()\\n\\t.actionDetails(new ScheduleTerminalActionsRequestActionDetails(uninstallAndroidCertificateDetails))\\n\\t.terminalIds(Arrays.asList(\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;))\\n\\t.storeId(\\&quot;\\&quot;)\\n\\t.scheduledAt(\\&quot;2021-12-12T20:21:22-0100\\&quot;);\\n\\n\\\/\\\/ Make the request\\nTerminalActionsTerminalLevelApi service = new TerminalActionsTerminalLevelApi(client);\\nScheduleTerminalActionsResponse response = service.createTerminalAction(scheduleTerminalActionsRequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v17.4.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\Management\\\\ScheduleTerminalActionsRequestActionDetails;\\nuse Adyen\\\\Model\\\\Management\\\\ScheduleTerminalActionsRequest;\\nuse Adyen\\\\Service\\\\Management\\\\TerminalActionsTerminalLevelApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Request objects\\n$scheduleTerminalActionsRequestActionDetails = new ScheduleTerminalActionsRequestActionDetails();\\n$scheduleTerminalActionsRequestActionDetails\\n\\t-&gt;setCertificateId(\\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;)\\n\\t-&gt;setType(\\&quot;UninstallAndroidCertificate\\&quot;);\\n\\n$scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest();\\n$scheduleTerminalActionsRequest\\n\\t-&gt;setActionDetails($scheduleTerminalActionsRequestActionDetails)\\n\\t-&gt;setTerminalIds(array(\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;))\\n\\t-&gt;setStoreId(\\&quot;\\&quot;)\\n\\t-&gt;setScheduledAt(\\&quot;2021-12-12T20:21:22-0100\\&quot;);\\n\\n\\\/\\\/ Make the request\\n$service = new TerminalActionsTerminalLevelApi($client);\\n$response = $service-&gt;createTerminalAction($scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v14.3.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.Management;\\nusing Adyen.Service.Management;\\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\\\/\\\/ Fill in your request objects\\nUninstallAndroidCertificateDetails uninstallAndroidCertificateDetails = new UninstallAndroidCertificateDetails\\n{\\n\\tCertificateId = \\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;,\\n\\tType = UninstallAndroidCertificateDetails.TypeEnum.UninstallAndroidCertificate\\n};\\n\\nScheduleTerminalActionsRequest scheduleTerminalActionsRequest = new ScheduleTerminalActionsRequest\\n{\\n\\tActionDetails = new ScheduleTerminalActionsRequestActionDetails(uninstallAndroidCertificateDetails),\\n\\tTerminalIds = { \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; },\\n\\tStoreId = \\&quot;\\&quot;,\\n\\tScheduledAt = \\&quot;2021-12-12T20:21:22-0100\\&quot;\\n};\\n\\n\\\/\\\/ Make the request\\nvar service = new TerminalActionsTerminalLevelService(client);\\nvar response = service.CreateTerminalAction(scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, ManagementAPI } = require('@adyen\\\/api-library');\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object\\nconst scheduleTerminalActionsRequest = {\\n  terminalIds: [ \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; ],\\n  storeId: \\&quot;\\&quot;,\\n  scheduledAt: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n  actionDetails: {\\n    type: \\&quot;UninstallAndroidCertificate\\&quot;,\\n    certificateId: \\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;\\n  }\\n}\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalActionsTerminalLevelApi.createTerminalAction(scheduleTerminalActionsRequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v9.2.0\\nimport (\\n\\t\\&quot;context\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n\\t\\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/management\\&quot;\\n)\\n\\nclient := adyen.NewClient(&amp;common.Config{\\n    ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Fill in your request objects\\nuninstallAndroidCertificateDetails := management.UninstallAndroidCertificateDetails{\\n\\tCertificateId: common.PtrString(\\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;),\\n\\tType: common.PtrString(\\&quot;UninstallAndroidCertificate\\&quot;),\\n}\\n\\nscheduleTerminalActionsRequest := management.ScheduleTerminalActionsRequest{\\n\\tActionDetails: management.UninstallAndroidCertificateDetailsAsScheduleTerminalActionsRequestActionDetails(&amp;uninstallAndroidCertificateDetails),\\n\\tTerminalIds: []string{\\n\\t\\t\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;,\\n\\t},\\n\\tStoreId: common.PtrString(\\&quot;\\&quot;),\\n\\tScheduledAt: common.PtrString(\\&quot;2021-12-12T20:21:22-0100\\&quot;),\\n}\\n\\n\\\/\\\/ Make the request\\nservice := client.Management()\\nreq := service.TerminalActionsTerminalLevelApi.CreateTerminalActionInput().ScheduleTerminalActionsRequest(scheduleTerminalActionsRequest)\\nres, httpRes, err := service.TerminalActionsTerminalLevelApi.CreateTerminalAction(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.2.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\\njson_request = {\\n  \\&quot;terminalIds\\&quot;: [ \\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot; ],\\n  \\&quot;storeId\\&quot;: \\&quot;\\&quot;,\\n  \\&quot;scheduledAt\\&quot;: \\&quot;2021-12-12T20:21:22-0100\\&quot;,\\n  \\&quot;actionDetails\\&quot;: {\\n    \\&quot;type\\&quot;: \\&quot;UninstallAndroidCertificate\\&quot;,\\n    \\&quot;certificateId\\&quot;: \\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;\\n  }\\n}\\n\\nresult = adyen.management.terminal_actions_terminal_level_api.create_terminal_action(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.2.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\\nrequest_body = {\\n  :terminalIds =&gt; [ 'S1E-000150183300032', 'S1E-000150183300033', 'S1F2-000150183300034' ],\\n  :storeId =&gt; '',\\n  :scheduledAt =&gt; '2021-12-12T20:21:22-0100',\\n  :actionDetails =&gt; {\\n    :type =&gt; 'UninstallAndroidCertificate',\\n    :certificateId =&gt; 'ANDC422LZ223223K5F78NVN9SL4VPH'\\n  }\\n}\\n\\nresult = adyen.management.terminal_actions_terminal_level_api.create_terminal_action(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, ManagementAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request objects\\nconst uninstallAndroidCertificateDetails: Types.management.UninstallAndroidCertificateDetails = {\\n\\tcertificateId: \\&quot;ANDC422LZ223223K5F78NVN9SL4VPH\\&quot;,\\n\\ttype: Types.management.UninstallAndroidCertificateDetails.TypeEnum.UninstallAndroidCertificate\\n};\\n\\nconst scheduleTerminalActionsRequest: Types.management.ScheduleTerminalActionsRequest = {\\n\\tactionDetails: uninstallAndroidCertificateDetails,\\n\\tterminalIds: [\\&quot;S1E-000150183300032\\&quot;, \\&quot;S1E-000150183300033\\&quot;, \\&quot;S1F2-000150183300034\\&quot;],\\n\\tstoreId: \\&quot;\\&quot;,\\n\\tscheduledAt: \\&quot;2021-12-12T20:21:22-0100\\&quot;\\n};\\n\\n\\\/\\\/ Make the request\\nconst managementAPI = new ManagementAPI(client);\\nconst response = managementAPI.TerminalActionsTerminalLevelApi.createTerminalAction(scheduleTerminalActionsRequest);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>We first validate the list of terminals. If the list is correct, we try to send the action details to the terminals.<\/p>\n<\/li>\n<li>\n<p>If you receive a <strong>422<\/strong> validation <a href=\"\/pt\/errors\">error response<\/a>, check the <code>invalidFields<\/code> array for the details, fix the errors, and send the planning request again.<\/p>\n<p>For each error, the <code>InvalidField.message<\/code> explains what is wrong:<\/p>\n<ul>\n<li><code>InvalidTerminal<\/code>: The terminal ID is incorrect.<\/li>\n<li><code>CompanyHasNoPermissionToThisTerminal<\/code>: The terminal belongs to a company that the API credential that was used for the request doesn't have access to.<\/li>\n<li><code>TerminalIsNotFromStore<\/code>: The terminal is not assigned to the store that was specified in the request.<\/li>\n<\/ul>\n<p>The following example shows validating the list of terminals failed because two of the three terminal IDs are incorrect.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response\u2014Errors in list of terminals'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"type\\\": \\\"https:\\\/\\\/docs.adyen.com\\\/errors\\\/validation\\\",\\n    \\\"title\\\": \\\"Invalid parameters\\\",\\n    \\\"status\\\": 422,\\n    \\\"invalidFields\\\": [\\n        {\\n            \\\"InvalidField\\\": {\\n                \\\"name\\\": \\\"terminalIds\\\",\\n                \\\"value\\\": \\\"S1E-000150183300030\\\",\\n                \\\"message\\\": \\\"InvalidTerminal\\\"\\n            }\\n        },\\n        {\\n            \\\"InvalidField\\\": {\\n                \\\"name\\\": \\\"terminalIds\\\",\\n                \\\"value\\\": \\\"S1E-000150183300031\\\",\\n                \\\"message\\\": \\\"InvalidTerminal\\\"\\n            }\\n        }\\n    ],\\n    \\\"errorCode\\\": \\\"33_008\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>If there are no errors with the validation of the terminal IDs, check whether the action was planned:<\/p>\n<ul>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#responses-200-totalScheduled\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">totalScheduled<\/a>&#58; The number of terminals for which planning the action succeeded. This doesn't mean the action has happened yet.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#responses-200-totalErrors\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">totalErrors<\/a>&#58; The number of terminals for which planning the action failed. For example, due to connection problems.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions#responses-200-items\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">items<\/a>&#58; A list with the unique <code>terminalId<\/code> and the unique action <code>id<\/code> for each terminal that the action was scheduled for. The action <code>id<\/code> starts with <strong>TRAC<\/strong>. You can use it to <a href=\"#terminal-action-details\">retrieve the details<\/a> of an action. For example, whether the action was carried out successfully.<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response\u2014no errors'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"actionDetails\\\":{\\n        \\\"type\\\":\\\"InstallAndroidApp\\\",\\n        \\\"appId\\\":\\\"ANDA422LZ223223K5F694GCCF732K8\\\"\\n    },\\n    \\\"scheduledAt\\\":\\\"2021-12-12T20:21:22-0100\\\",\\n    \\\"storeId\\\":\\\"\\\",\\n    \\\"items\\\":[\\n        {\\n            \\\"id\\\":\\\"TRAC422T2223223K5GFMQHM6WQ4KB6\\\",\\n            \\\"terminalId\\\":\\\"S1E-000150183300032\\\"\\n        },\\n        {\\n            \\\"id\\\":\\\"TRAC4224X22338VQ5GD4CQJCQT5PC2\\\",\\n            \\\"terminalId\\\":\\\"S1E-000150183300033\\\"\\n        },\\n        {\\n            \\\"id\\\":\\\"TRAC4224Z223223K5GD89RLBWQ6CWT\\\",\\n            \\\"terminalId\\\":\\\"S1F2-000150183300034\\\"\\n        }\\n    ],\\n    \\\"terminalIds\\\":[\\n        \\\"S1E-000150183300032\\\",\\n        \\\"S1E-000150183300033\\\",\\n        \\\"S1F2-000150183300034\\\"\\n    ],\\n    \\\"terminalsWithErrors\\\": {},\\n    \\\"totalScheduled\\\":3,\\n    \\\"totalErrors\\\":0\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2 id=\"terminal-action-details\">Get terminal action details<\/h2>\n<p>After the terminal action is planned, you can retrieve the details of that action to check if the action has been carried out. This is only possible for terminal actions that you planned, not for actions that were planned by us.<\/p>\n<p>To get details of a terminal action:<\/p>\n<ol>\n<li>\n<p>Make a GET  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/companies\/{companyId}\/terminalActions\/{actionId}<\/a> request specifying the <code>id<\/code> of the planned terminal action from the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/post\/terminals\/scheduleActions\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/terminals\/scheduleActions<\/a> response.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Get action details by ID'\" :id=\"'get-action-details-by-id-8104604017'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/management-test.adyen.com\\\/v3\\\/companies\\\/terminalActions\\\/TRAC4224Z223223K5GD89RLBWQ6CWT \\\\\\n-H 'x-API-key: ADYEN_API_KEY' \\\\\\n-X GET&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, see the <code>status<\/code> to learn if the action has been carried out. These are the full response details:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Response parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-actionType\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">actionType<\/a><\/td>\n<td style=\"text-align: left;\">The type of terminal action: <span translate=\"no\"><strong>InstallAndroidApp<\/strong><\/span>, <span translate=\"no\"><strong>UninstallAndroidApp<\/strong><\/span>, <span translate=\"no\"><strong>InstallAndroidCertificate<\/strong><\/span>, or <span translate=\"no\"><strong>UninstallAndroidCertificate<\/strong><\/span>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-config\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">config<\/a><\/td>\n<td style=\"text-align: left;\">Technical information about the terminal action.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-confirmedAt\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">confirmedAt<\/a><\/td>\n<td style=\"text-align: left;\">The date and time when the terminal returns the status of the action. For example, whether the action succeeded, failed, or was cancelled.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-id\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">id<\/a><\/td>\n<td style=\"text-align: left;\">The unique identifier of the terminal action.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-result\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">result<\/a><\/td>\n<td style=\"text-align: left;\">The result message in case the <code>status<\/code> of the action is <span translate=\"no\"><strong>successful<\/strong><\/span>, <span translate=\"no\"><strong>failed<\/strong><\/span>, or <span translate=\"no\"><strong>cancelled<\/strong><\/span>. For example, <span translate=\"no\"><strong>Version apk0 installed<\/strong><\/span> or <span translate=\"no\"><strong>Failed<\/strong><\/span>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-scheduledAt\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">scheduledAt<\/a><\/td>\n<td style=\"text-align: left;\">The date and time when you scheduled the action to happen.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-status\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">status<\/a><\/td>\n<td style=\"text-align: left;\">The status of the terminal action: <span translate=\"no\"><strong>pending<\/strong><\/span>, <span translate=\"no\"><strong>successful<\/strong><\/span>, <span translate=\"no\"><strong>failed<\/strong><\/span>, or <span translate=\"no\"><strong>cancelled<\/strong><\/span>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Management\/latest\/get\/companies\/(companyId)\/terminalActions\/(actionId)#responses-200-terminalId\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">terminalId<\/a><\/td>\n<td style=\"text-align: left;\">The unique identifier of the terminal that the action applies to.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response \u2014 Android certificate is installed'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n \\\"actionType\\\":\\\"InstallAndroidCertificate\\\",\\n \\\"config\\\":\\\"{\\\\\\\"certificates\\\\\\\":\\\\\\\"5dff6b...\\\\\\\"}\\\",\\n \\\"id\\\": \\\"TRAC4224Z221223K4GD5855BJZ24M5\\\",\\n \\\"confirmedAt\\\":\\\"2022-06-27T17:44:54+0200\\\",\\n \\\"result\\\":\\\"Ok\\\",\\n \\\"scheduledAt\\\":\\\"2022-06-27T15:44:07+0200\\\",\\n \\\"status\\\":\\\"successful\\\",\\n \\\"terminalId\\\":\\\"S1F2-000150183300034\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response \u2014 Install Android app is pending'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n \\\"actionType\\\": \\\"InstallAndroidApp\\\",\\n \\\"config\\\": \\\"{\\\\\\\"apps\\\\\\\":\\\\\\\"5dff6...\\\\\\\"}\\\",\\n \\\"id\\\": \\\"TRAC4224Z223223K5GD89RLBWQ6CWT\\\",\\n \\\"scheduledAt\\\": \\\"2022-07-21T16:08:55+02:00\\\",\\n \\\"status\\\": \\\"pending\\\",\\n \\\"terminalId\\\": \\\"S1E-000150183300033\\\"\\n }\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/point-of-sale\/android-terminals\/app-requirements\"\n                        target=\"_self\"\n                        >\n                    Specifications and testing of apps for Android terminals\n                <\/a><\/li><li><a href=\"\/point-of-sale\/android-terminals\/deploy-apps\/upload\"\n                        target=\"_self\"\n                        >\n                    Upload apps and certificates\n                <\/a><\/li><li><a href=\"\/point-of-sale\/android-terminals\/deploy-apps\/profiles\"\n                        target=\"_self\"\n                        >\n                    Deploy apps based on profiles\n                <\/a><\/li><li><a href=\"\/point-of-sale\/android-terminals\/deploy-apps\/schedule\"\n                        target=\"_self\"\n                        >\n                    Manage app deployment using the Customer Area\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/pt\/point-of-sale\/android-terminals\/deploy-apps\/terminal-actions-api","articleFields":{"description":"Use the Management API to schedule actions on terminals, specifically installing and uninstalling Android apps and certificates.","robots":"noindex,nofollow","process":{"markdown":true,"twig":false},"twig_first":true,"never_cache_twig":true,"feedback_component":true,"filters_component":false,"decision_tree":"[]","page_id":"82b3f236-bb36-48d6-9717-5b67afa17a50","last_edit_on":"03-04-2024 13:59"},"algolia":{"url":"https:\/\/docs.adyen.com\/pt\/point-of-sale\/android-terminals\/deploy-apps\/terminal-actions-api","title":"Schedule terminal actions to deploy apps","content":"Terminal actions are operations that need to be carried out on payment terminals, and that can be planned for a certain date and time. Most of those actions are planned by Adyen, like updating to a release, or obtaining logs. Some actions can be planned by you.\nHere we describe how you can use our Management API to automate terminal actions to deploy apps and certificates on Android payment terminals.\nRequirements\nBefore you begin, take into account the following requirements and limitations.\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nA Terminal API integration with payment terminals or a standalone solution.\n\n\nAPI credentials\nYou must have an API credential with an API key and the following roles: Management API\u2014Terminal actions read Management API\u2014Terminal actions read and write Management API\u2014Terminal settings read If you have a Terminal API integration with cloud-based communications, you can use the existing API key that you use for Terminal API requests.\n\n\nHardware\nAndroid payment terminals.\n\n\nLimitations\nRequests to live Management API endpoints related to scheduling terminal actions are subject to rate limits.\n\n\n\nWhen planned actions take effect\nTerminal actions are changes in the configuration of the terminal. The terminal receives configuration changes when it makes a maintenance call and implements the changes when it reboots at the restart hour (at 06:00 AM by default).\nTo ensure this process succeeds, we recommend that you keep your terminals turned on and connected to the network overnight.\nIn the case of Android terminal actions, the terminal does not wait until the restart hour.\n\nIf you planned the Android action without a date and time, the action is implemented with the next maintenance call. If WebSockets are enabled, the action is implemented immediately.\nIf you planned the Android action for a specific date and time, the action is implemented with the first maintenance call after that date\/time in the time zone of the terminal. If WebSockets are enabled, the action is implemented at the exact date and time that you specified.\n\nIf the action involves an Android app that is already installed on the terminal and that happens to be open at the time of the action, the app closes.\nAndroid terminal actions\nAndroid terminal actions are related to the deployment of apps that you want to run on your Android terminals. For example, a POS app. To run such an app, you need to install it on the terminal. Maybe you also need to remove an old version that you no longer want to use.\nSome apps need a digital certificate. For example, a certificate to protect network communications between a POS app and the back end of that app. Such a certificate needs to be installed on the terminal, and replaced with a new one before the validity period of the certificate expires.\nTo sum up, Android terminal actions you can plan are:\n\nInstall a new app or app version.\nUninstall an old app or app version.\nInstall a new certificate.\nUninstall an expired certificate.\n\nThese actions are part of a larger process where you:\n\nMake sure that the app meets the requirements.\nUpload the app in your Customer Area. We then sign the app and convert it so that the terminal can handle the app.\nIf the app requires a certificate, upload the certificate as well, so that we can sign it.\nPlan terminal actions to install or uninstall apps and certificates. You can plan actions in your Customer Area, but here we describe how to plan actions by making API calls to:\n\nGet the IDs of the apps or certificates that have been uploaded.\nGet the IDs of the terminals that you want to apply the action to.\nPlan an Android terminal action.\n\n\n1. Get Android app and certificate IDs\nWhen planning an Android terminal action, you need to provide the ID of the Android app or certificate you want to install or uninstall. To get those IDs, check which apps and certificates have been uploaded:\n\n\nMake sure that you know the ID of your company. If you do not know this ID, make a GET  \/companies request.\n\n\nCheck what Android apps and optionally what Android certificates are available.\n\n\n    \n        \n        \n    \n\n\n\n\nFrom the response, save the id of the Android app or certificate that you want to install or uninstall.\n\n\n2. Get terminal IDs\nWhen planning an Android terminal action, you need to provide the IDs of the terminals that you want to apply an action to. To create a list of terminals:\n\n\nMake a GET  \/terminals request using query parameters to restrict the list to terminals that match specific conditions. You can specify multiple values for a single query parameter like this: \/terminals?countryCodes=NL,FR.\nThese are the query parameters to filter the paginated response:\n\n\n\nQuery parameter\nRequired\nDescription\n\n\n\n\n searchQuery\n\nReturns terminals with an ID that contains the specified string. If you use this query parameter, other query parameters are ignored.\n\n\n countries\n\nReturns terminals located in the specified countries\/regions. Format: the two-letter ISO-3166-1 alpha-2 country code. Exception: QZ (Kosovo).\n\n\n merchantIds\n\nReturns terminals that belong to the merchant accounts specified by their unique ID.  For a list of merchant account IDs, make a GET request to  \/companies\/{companyId}\/merchants.\n\n\n storeIds\n\nReturns terminals that are assigned to the stores specified by their unique store ID.  For a list of store IDs, make a GET \/stores request.\n\n\n brandModels\n\nReturns terminals of the specified models in the format brand.model. For example, Castles.S1F2.  For a list of brand models, make a GET \/terminalModels request and use the id from the response.\n\n\n pageNumber\n\nReturns the terminals shown on the specified page.\n\n\n pageSize\n\nThe number of terminals to have on a page. The default is 20, the maximum is 100.\n\n\n\nThe following example shows how to create a list of all S1E and S1F2 Android terminals for a specific merchant account.\n\n\n\nFor each terminal, notice in the response:\n\n id&#58; the unique terminal ID.\n status&#58; indicates when the terminal was last online, whether the terminal is being reassigned, or whether the terminal is turned off. If the terminal was last online more that a week ago, it is also shown as turned off.\n assigned&#58; true indicates the terminal is assigned to a store, or to a merchant account representing a store. false indicates the terminal is in inventory.\n\n\n\n\n\n\nExtract the unique terminal IDs from the response.\n\n\n3. Schedule an Android terminal action\nWhen planning terminal actions, be aware of the following restrictions:\n\nYou can schedule one action at a time. For example, to install two different apps you have to make two API requests.\nThe maximum number of terminals in a request is 100. For example, to apply an action to 250 terminals, you have to divide the terminals over three API requests.\nIf there is an error with one or more terminal IDs in the request, the action is scheduled for none of the terminals. You need to fix the error and try again.\n\nTo plan an Android terminal action:\n\n\nMake a POST  \/terminals\/scheduleActions request, specifying:\n\n\n\nParameter\nRequired\nType\nDescription\n\n\n\n\n terminalIds\n\nString array\nA list of unique IDs of the terminals to apply the action to. See 2. Get terminal IDs.  Maximum length: 100 IDs.\n\n\n storeId\n\nString\nThe unique ID of the store that the terminals are assigned to. If you do not know this ID, make a GET request to  \/stores.  The request fails if the  terminalIds do not belong to this store.\n\n\n scheduledAt\n\nString\nThe date and time when the action should happen.  Format: RFC 3339, but without the Z before the time offset. For example, 2021-11-15T12:16:21+0100 The terminal installs or removes the app with the first maintenance call after the specified date and time in the time zone of the terminal. An empty value causes the action to happen as soon as possible: at the next maintenance call.\n\n\n actionDetails\n\nString object\nThis is where you specify the action and the app or certificate ID. See 1. Get Android app and certificate IDs .  For an Android app action, this object must contain: appId: The unique identifier of the app. type: The type of action. Possible values: InstallAndroidApp or UninstallAndroidApp.  For an Android certificate action, this object must contain: certificateId: The unique identifier of the certificate. type: The type of action. Allowed values: InstallAndroidCertificate or UninstallAndroidCertificate\n\n\n\nThe following examples show how to install an app, and how to uninstall a certificate.\n\n\n\n\n\n\nWe first validate the list of terminals. If the list is correct, we try to send the action details to the terminals.\n\n\nIf you receive a 422 validation error response, check the invalidFields array for the details, fix the errors, and send the planning request again.\nFor each error, the InvalidField.message explains what is wrong:\n\nInvalidTerminal: The terminal ID is incorrect.\nCompanyHasNoPermissionToThisTerminal: The terminal belongs to a company that the API credential that was used for the request doesn't have access to.\nTerminalIsNotFromStore: The terminal is not assigned to the store that was specified in the request.\n\nThe following example shows validating the list of terminals failed because two of the three terminal IDs are incorrect.\n\n\n\n\n\nIf there are no errors with the validation of the terminal IDs, check whether the action was planned:\n\n totalScheduled&#58; The number of terminals for which planning the action succeeded. This doesn't mean the action has happened yet.\n totalErrors&#58; The number of terminals for which planning the action failed. For example, due to connection problems.\n items&#58; A list with the unique terminalId and the unique action id for each terminal that the action was scheduled for. The action id starts with TRAC. You can use it to retrieve the details of an action. For example, whether the action was carried out successfully.\n\n\n\n\n\n\nGet terminal action details\nAfter the terminal action is planned, you can retrieve the details of that action to check if the action has been carried out. This is only possible for terminal actions that you planned, not for actions that were planned by us.\nTo get details of a terminal action:\n\n\nMake a GET  \/companies\/{companyId}\/terminalActions\/{actionId} request specifying the id of the planned terminal action from the  \/terminals\/scheduleActions response.\n\n\n\n\n\nIn the response, see the status to learn if the action has been carried out. These are the full response details:\n\n\n\nResponse parameter\nDescription\n\n\n\n\n actionType\nThe type of terminal action: InstallAndroidApp, UninstallAndroidApp, InstallAndroidCertificate, or UninstallAndroidCertificate.\n\n\n config\nTechnical information about the terminal action.\n\n\n confirmedAt\nThe date and time when the terminal returns the status of the action. For example, whether the action succeeded, failed, or was cancelled.\n\n\n id\nThe unique identifier of the terminal action.\n\n\n result\nThe result message in case the status of the action is successful, failed, or cancelled. For example, Version apk0 installed or Failed.\n\n\n scheduledAt\nThe date and time when you scheduled the action to happen.\n\n\n status\nThe status of the terminal action: pending, successful, failed, or cancelled.\n\n\n terminalId\nThe unique identifier of the terminal that the action applies to.\n\n\n\n\n\n\n\n\n\n\n\nSee also\n\n\n                    Specifications and testing of apps for Android terminals\n                \n                    Upload apps and certificates\n                \n                    Deploy apps based on profiles\n                \n                    Manage app deployment using the Customer Area\n                \n","type":"page","locale":"pt","boost":16,"hierarchy":{"lvl0":"Home","lvl1":"Terminais","lvl2":"Android terminals","lvl3":"Deploy apps to your terminals","lvl4":"Schedule terminal actions to deploy apps"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/pt","lvl1":"https:\/\/docs.adyen.com\/pt\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/pt\/point-of-sale\/android-terminals","lvl3":"https:\/\/docs.adyen.com\/pt\/point-of-sale\/android-terminals\/deploy-apps","lvl4":"\/pt\/point-of-sale\/android-terminals\/deploy-apps\/terminal-actions-api"},"levels":5,"category":"In-person payments","category_color":"green","tags":["Schedule","terminal","actions","deploy"]},"articleFiles":{"get-list-of-uploaded-apps-1966459878.js":"<p alt=\"\">get-list-of-uploaded-apps-1966459878.js<\/p>","get-list-of-uploaded-certificates-3800609220.js":"<p alt=\"\">get-list-of-uploaded-certificates-3800609220.js<\/p>","get-terminals-1464943596.js":"<p alt=\"\">get-terminals-1464943596.js<\/p>","install-an-app-6357108618.js":"<p alt=\"\">install-an-app-6357108618.js<\/p>","uninstall-a-certificate-7496268471.js":"<p alt=\"\">uninstall-a-certificate-7496268471.js<\/p>"}}
