{"title":"Make a diagnosis request","category":"default","creationDate":1779706500,"content":"<p>A Terminal API diagnosis request lets you verify the condition of a payment terminal and its components such as the communication module, the battery, or the built-in printer.<\/p>\n<p>If you have a Mobile SDK solution using mobile devices instead of payment terminals, a diagnosis request lets you check the security of a device.<\/p>\n<p>In both cases a diagnosis request also gives information about any offline payments that have not been sent to Adyen yet.<\/p>\n<p>Depending on your integration, see:<\/p>\n<ul>\n<li><a href=\"#diagnosis-request\">Diagnose a payment terminal<\/a><\/li>\n<li><a href=\"#diagnosis-request-mobile\">Diagnose a Mobile SDK solution<\/a><\/li>\n<\/ul>\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;\">Supported with: <ul><li markdown=\"1\">A Terminal API integration with payment terminals.<\/li> <li markdown=\"1\">Android and iOS Mobile SDK solutions for Tap to Pay or card reader.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">Not supported with a Mobile Payments app solution.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"diagnosis-request\">Diagnose a payment terminal<\/h2>\n<p>The diagnosis request supports you in business critical processes, because the response includes:<\/p>\n<ul>\n<li><code>batteryLevel<\/code>: This parameter is included for battery-powered terminals, and shows the battery charge level. You can use this information to let your staff know they need to recharge the terminal soon. For guidelines regarding terminal battery usage, see <a href=\"\/point-of-sale\/managing-terminals\/battery-management\">Manage battery power<\/a>.<\/li>\n<li><code>unconfirmedBatchCount<\/code>: The number of payments that the terminal has not been able to send to the Adyen host for completion (capture and settlement). An <code>unconfirmedBatchCount<\/code> greater than <strong>0<\/strong> (zero) indicates there is possibly a problem with your network.<\/li>\n<\/ul>\n<p>Diagnosing a payment terminal is best done in two steps:<\/p>\n<ul>\n<li>First <a href=\"#verify-terminal\">check the condition of the terminal<\/a>.<\/li>\n<li>Then, if the <code>unconfirmedBatchCount<\/code>is greater than <strong>0<\/strong> (zero), <a href=\"#test-host-system-reachable\">check if the Adyen host system is reachable<\/a>.<\/li>\n<\/ul>\n<h3 id=\"verify-terminal\">1. Verify the condition of a terminal<\/h3>\n<p>To check the condition of a payment terminal:<\/p>\n<ol>\n<li>\n<p>Make a <a href=\"\/point-of-sale\/design-your-integration\/terminal-api\">Terminal API<\/a> diagnosis request, specifying:<\/p>\n<ul>\n<li>\n<p>The standard <a href=\"\/point-of-sale\/design-your-integration\/terminal-api#request-message-header\">\n  <code>SaleToPOIRequest.MessageHeader<\/code>\n<\/a> object, with <code>MessageClass<\/code> set to <span translate=\"no\"><strong>Service<\/strong><\/span> and <code>MessageCategory<\/code> set to <span translate=\"no\"><strong>Diagnosis<\/strong><\/span>.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">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;\"><code>ProtocolVersion<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><strong>3.0<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageClass<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Service<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageCategory<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Diagnosis<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageType<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Request<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>ServiceID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (<code>POIID<\/code>) being used.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>SaleID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for the POS system component to send this request from.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>POIID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">The unique ID of the terminal to send this request to. Format: <em>[device model]-[serial number]<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>The  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/diagnosis\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">DiagnosisRequest<\/a> body, including:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">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;\"><code>HostDiagnosisFlag<\/code><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Initially set the value to <span translate=\"no\"><strong>false<\/strong><\/span>. <br> You only need to set the value to <span translate=\"no\"><strong>true<\/strong><\/span> for <a href=\"#test-host-system-reachable\">further diagnosis<\/a> when the initial response includes an <code>unconfirmedBatchCount<\/code> greater than zero. This is explained in <a href=\"#test-host-system-reachable\">2. Verify that the Adyen host system is reachable<\/a>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"''\" :id=\"'diagnosis_0'\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"JSON\",\"content\":\"{\\n    \\\"SaleToPOIRequest\\\":{\\n        \\\"MessageHeader\\\":{\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n            \\\"MessageType\\\":\\\"Request\\\",\\n            \\\"ServiceID\\\":\\\"040\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"DiagnosisRequest\\\":{\\n            \\\"HostDiagnosisFlag\\\":false\\n        }\\n    }\\n}\"},{\"language\":\"java\",\"tabTitle\":\"Java\",\"content\":\"String serviceID = \\\"YOUR_UNIQUE_ATTEMPT_ID\\\";\\nString saleID = \\\"YOUR_CASH_REGISTER_ID\\\";\\nString POIID = \\\"YOUR_TERMINAL_ID\\\";\\n\\nSaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();\\nMessageHeader messageHeader = new MessageHeader();\\nmessageHeader.setProtocolVersion(\\\"3.0\\\");\\nmessageHeader.setMessageClass( MessageClassType.SERVICE );\\nmessageHeader.setMessageCategory( MessageCategoryType.DIAGNOSIS );\\nmessageHeader.setMessageType( MessageType.REQUEST );\\nmessageHeader.setServiceID(serviceID);\\nmessageHeader.setSaleID(saleID);\\nmessageHeader.setPOIID(POIID);\\nsaleToPOIRequest.setMessageHeader(messageHeader);\\n\\nDiagnosisRequest diagnosisRequest = new DiagnosisRequest();\\ndiagnosisRequest.setHostDiagnosisFlag( Boolean.FALSE );\\nsaleToPOIRequest.setDiagnosisRequest(diagnosisRequest);\\nterminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Use the following parts of the response to check the condition of the terminal:<\/p>\n<ul>\n<li>\n<p>The <code>POIStatus<\/code> object:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>GlobalStatus<\/code><\/td>\n<td style=\"text-align: left;\">The condition of the payment terminal.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>CommunicationOKFlag<\/code><\/td>\n<td style=\"text-align: left;\">A Boolean that indicates whether the general condition of the communication module is OK.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>PrinterStatus<\/code><\/td>\n<td style=\"text-align: left;\">This parameter is included when the payment terminal has a built-in printer, and indicates the condition of the printer module. <span translate=\"no\"><strong>NoPaper<\/strong><\/span> indicates the receipt paper roll is missing or the paper is not sticking out.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>\n<p>The <code>Response.AdditionalResponse<\/code> string of key-value pairs separated by <strong>&amp;<\/strong>:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>batteryLevel<\/code><\/td>\n<td style=\"text-align: left;\">This parameter is included for battery-powered terminals, and indicates the battery charge level as a percentage of fully charged.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>unconfirmedBatchCount<\/code><\/td>\n<td style=\"text-align: left;\">The number of payments that the terminal has not yet sent for completion to our platform, and thus cannot be settled.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>firmwareVersion<\/code><\/td>\n<td style=\"text-align: left;\">The software version that the terminal is on.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>networkProfile<\/code><\/td>\n<td style=\"text-align: left;\">A Base64 string that you can decode to see the IP address of the terminal and other network data.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>merchantAccount<\/code><\/td>\n<td style=\"text-align: left;\">The merchant account that the diagnosed payment terminal is assigned to.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>terminalId<\/code><\/td>\n<td style=\"text-align: left;\">The POIID of the diagnosed payment terminal, in the format <em>[device model]-[serial number]<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>storeId<\/code><\/td>\n<td style=\"text-align: left;\">The store that the diagnosed payment terminal is assigned to.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>tamperStatus<\/code><\/td>\n<td style=\"text-align: left;\">This parameter only applies to UX300 and UX410 terminals. The value <span translate=\"no\"><strong>ARS_TRIGGERED<\/strong><\/span> indicates that anti-removal switches (ARS) have been triggered. This means you must stop using the terminal immediately.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>\n<p>If the terminal uses <a href=\"\/development-resources\/e2ee-p2pe-comparison#what-is-p2pe\">Point-to-Point Encryption (P2PE)<\/a> instead of Adyen End-to-End Encryption (E2EE), <code>Response.AdditionalResponse<\/code> also includes the following parameters:<\/p>\n<div class=\"notices blue\">\n<p>The diagnosis response includes P2PE protocol, SRED, vault, and app manager versions as provided by the hardware manufacturer. You need to specify this data in your annual PCI assessment.<\/p>\n<\/div>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>p2peFirmwareVersionNumber<\/code><\/td>\n<td style=\"text-align: left;\">The version number of the P2PE software managed and used by Adyen.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>p2peOpenProtocolVersion<\/code><\/td>\n<td style=\"text-align: left;\">The version of the open protocol application.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>p2peSREDVersion<\/code><\/td>\n<td style=\"text-align: left;\">The version of the Secure Reading and Exchange of Data (SRED) functionality.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>p2peVaultVersion<\/code><\/td>\n<td style=\"text-align: left;\">The version of the vault.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>p2peAppManagerVersion<\/code><\/td>\n<td style=\"text-align: left;\">The version of the app manager.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Diagnosis response for a battery-powered terminal'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"DiagnosisResponse\\\": {\\n            \\\"POIStatus\\\": {\\n                \\\"CommunicationOKFlag\\\": true,\\n                \\\"PrinterStatus\\\": \\\"OK\\\",\\n                \\\"GlobalStatus\\\": \\\"OK\\\"\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\",\\n                \\\"AdditionalResponse\\\": \\\"batteryLevel=100%25&amp;firmwareVersion=adyen_v1_69p4&amp;networkProfile=WyB7ICJBZGRyZXNzIjogIjE5Mi4xNjguMi4yIiwgIklmYWNlIjogIndsYW4wIiB9IF0%3d&amp;merchantAccount=ADYEN_MERCHANT_ACCOUNT&amp;unconfirmedBatchCount=0&amp;terminalId=V400m-346403161&amp;storeId=YOUR_STORE\\\"\\n            }\\n        },\\n        \\\"MessageHeader\\\": {\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n            \\\"MessageType\\\":\\\"Response\\\",\\n            \\\"ServiceID\\\":\\\"040\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        }\\n    }\\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=\"'Diagnosis response for a P2PE terminal that is not battery-powered'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"SaleToPOIResponse\\\": {\\n    \\\"DiagnosisResponse\\\": {\\n      \\\"POIStatus\\\": {\\n        \\\"CommunicationOKFlag\\\": true,\\n        \\\"GlobalStatus\\\": \\\"OK\\\"\\n      },\\n      \\\"Response\\\": {\\n        \\\"AdditionalResponse\\\": \\\"p2peOpenProtocolVersion=2.0.0&amp;firmwareVersion=adyen_v1_69p4&amp;networkProfile=WyB7ICJBZGRyZXNzIjogIjE3Mi4xNy4xMjUuMzAiLCAiSWZhY2UiOiAiZXRoMCIgfSBd&amp;p2peSREDVersion=11.0.2.110&amp;merchantAccount=ADYEN_MERCHANT_ACCOUNT&amp;p2peVaultVersion=10.0.4.13405&amp;unconfirmedBatchCount=0&amp;p2peAppManagerVersion=14.0.13.13414&amp;p2peFirmwareVersion=1.1.1&amp;terminalId=P400Plus-275426191&amp;storeId=YOUR_STORE\\\",\\n        \\\"Result\\\": \\\"Success\\\"\\n      }\\n    },\\n    \\\"MessageHeader\\\": {\\n        \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n        \\\"MessageClass\\\":\\\"Service\\\",\\n        \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n        \\\"MessageType\\\":\\\"Response\\\",\\n        \\\"ServiceID\\\":\\\"040\\\",\\n        \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n        \\\"POIID\\\":\\\"V400m-346403161\\\"\\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>In the <code>AdditionalResponse<\/code> check the value of the <code>unconfirmedBatchCount<\/code>. This should be <strong>0<\/strong> (zero). If not, there may be a problem with your network.<br \/>\nIf the <code>unconfirmedBatchCount<\/code> is <strong>greater than 0<\/strong>, proceed to step 2: <a href=\"#test-host-system-reachable\">Verify that the Adyen host system is reachable<\/a>.<\/p>\n<\/li>\n<\/ol>\n<h3 id=\"test-host-system-reachable\">2. Verify that the Adyen host system is reachable<\/h3>\n<p>If the diagnosis response shows an <code>unconfirmedBatchCount<\/code> greater than 0 (zero), there may be a problem with your network. To check if this is the case:<\/p>\n<ol>\n<li>\n<p>Make another diagnosis request as described under <a href=\"#verify-terminal\">1. Verify the condition of a terminal<\/a>, but this time set<br \/>\n<code>DiagnosisRequest.HostDiagnosisFlag<\/code> to <span translate=\"no\"><strong>true<\/strong><\/span>. A communication test will try to reach the Adyen host system.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"''\" :id=\"'diagnosis_1'\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"JSON\",\"content\":\"{\\n    \\\"SaleToPOIRequest\\\":{\\n        \\\"MessageHeader\\\":{\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n            \\\"MessageType\\\":\\\"Request\\\",\\n            \\\"ServiceID\\\":\\\"282\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"DiagnosisRequest\\\":{\\n            \\\"HostDiagnosisFlag\\\":true\\n        }\\n    }\\n}\"},{\"language\":\"java\",\"tabTitle\":\"Java\",\"content\":\"String serviceID = \\\"YOUR_UNIQUE_ATTEMPT_ID\\\";\\nString saleID = \\\"YOUR_CASH_REGISTER_ID\\\";\\nString POIID = \\\"YOUR_TERMINAL_ID\\\";\\n\\nSaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();\\nMessageHeader messageHeader = new MessageHeader();\\nmessageHeader.setProtocolVersion(\\\"3.0\\\");\\nmessageHeader.setMessageClass( MessageClassType.SERVICE );\\nmessageHeader.setMessageCategory( MessageCategoryType.DIAGNOSIS );\\nmessageHeader.setMessageType( MessageType.REQUEST );\\nmessageHeader.setServiceID(serviceID);\\nmessageHeader.setSaleID(saleID);\\nmessageHeader.setPOIID(POIID);\\nsaleToPOIRequest.setMessageHeader(messageHeader);\\n\\nDiagnosisRequest diagnosisRequest = new DiagnosisRequest();\\ndiagnosisRequest.setHostDiagnosisFlag( Boolean.TRUE );\\nsaleToPOIRequest.setDiagnosisRequest(diagnosisRequest);\\nterminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);\"}]' :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, check the <code>HostStatus<\/code> array:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>IsReachableFlag<\/code><\/td>\n<td style=\"text-align: left;\">A Boolean that indicates if the Adyen host system was reached. If the Adyen host system could not be reached, you may need to adjust your firewall settings or other network aspects.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Diagnosis response when Adyen host is reached'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"MessageHeader\\\": {\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n            \\\"MessageType\\\":\\\"Response\\\",\\n            \\\"ServiceID\\\":\\\"040\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"DiagnosisResponse\\\": {\\n            \\\"POIStatus\\\": {\\n                \\\"CommunicationOKFlag\\\": true,\\n                \\\"PrinterStatus\\\": \\\"OK\\\",\\n                \\\"GlobalStatus\\\": \\\"OK\\\"\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\",\\n                \\\"AdditionalResponse\\\": \\\"batteryLevel=100%25&amp;firmwareVersion=adyen_v1_49p5&amp;networkProfile=WyB7ICJBZGRyZXNzIjogIjE5Mi4xNjguMi4yIiwgIklmYWNlIjogIndsYW4wIiB9IF0%3d&amp;merchantAccount=ADYEN_MERCHANT_ACCOUNT&amp;unconfirmedBatchCount=0&amp;terminalId=V400m-346403161&amp;storeId=YOUR_STORE\\\"\\n            },\\n            \\\"HostStatus\\\": [\\n                {\\n                    \\\"IsReachableFlag\\\": true,\\n                    \\\"AcquirerID\\\": \\\"0\\\"\\n                }\\n            ]\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2 id=\"diagnosis-request-mobile\">Diagnose a Mobile SDK solution<\/h2>\n<p>In a Mobile SDK solution, the Terminal API diagnosis request enables you to do the following:<\/p>\n<ul>\n<li>\n<p>Check if there are <strong>stored offline payments<\/strong> that have not been forwarded to Adyen yet. If the request has <code>hostDiagnosisFlag<\/code> set to <span translate=\"no\"><strong>true<\/strong><\/span>, the SDK will try to go online and forward these transactions.<\/p>\n<div class=\"notices green\">\n<p>Diagnosis of offline payments is only included if your Mobile SDK solution <a href=\"\/point-of-sale\/ipp-mobile\/#supported-functionality\">supports Store and Forward offline payments<\/a>.<\/p>\n<\/div>\n<\/li>\n<li>\n<p>Check for <strong>security threats<\/strong> that would block transactions. If threats are detected that an operator can solve, the response includes information about the cause and solution of the problem.<\/p>\n<\/li>\n<li>\n<p>Check the <strong>expiry date<\/strong> of the <a href=\"\/point-of-sale\/mobile-android\/manage\/#keep-the-mobile-sdk-up-to-date\">Android<\/a> or <a href=\"\/point-of-sale\/mobile-ios\/manage\/#keep-the-mobile-sdk-up-to-date\">iOS<\/a> SDK that is used on the mobile device. Transactions will be blocked if mandatory updates are not carried out.<\/p>\n<\/li>\n<li>\n<p>For an iOS Mobile SDK solution, check if there are <strong>failed captures<\/strong> that need to be retried.<\/p>\n<\/li>\n<\/ul>\n<p>Proceed as follows:<\/p>\n<ol>\n<li>\n<p>Make a Terminal API diagnosis request with:<\/p>\n<ul>\n<li>\n<p><a href=\"\/point-of-sale\/design-your-integration\/terminal-api#request-message-header\">\n  <code>SaleToPOIRequest.MessageHeader<\/code>\n<\/a>: The standard <code>MessageHeader<\/code> object, with the following parameters.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">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;\"><code>ProtocolVersion<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><strong>3.0<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageClass<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Service<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageCategory<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Diagnosis<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageType<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Request<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>ServiceID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (<code>POIID<\/code>) being used.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>SaleID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for the POS system component to send this request from.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>POIID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">The installation ID of the SDK, for example <strong>AC2ABBE8-EDD8-4E2B-AF45-8770FA2347DC.924<\/strong>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>\n<p>The  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/diagnosis\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">DiagnosisRequest<\/a> object with:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>HostDiagnosisFlag<\/code><\/td>\n<td style=\"text-align: left;\">Set the value to <span translate=\"no\"><strong>true<\/strong><\/span> so that the SDK will try to connect to Adyen for a security scan, to forward any stored offline transactions, and to retry sending any transactions that previously failed to capture (iOS mobile solution only). If you set this field to <span translate=\"no\"><strong>false<\/strong><\/span>, in a mobile solution, the SDK will not connect to Adyen.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Diagnosis request for a Mobile solution'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"SaleToPOIRequest\\\":{\\n      \\\"MessageHeader\\\":{\\n          \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n          \\\"MessageClass\\\":\\\"Service\\\",\\n          \\\"MessageCategory\\\":\\\"Diagnosis\\\",\\n          \\\"MessageType\\\":\\\"Request\\\",\\n          \\\"ServiceID\\\": \\\"YOUR_UNIQUE_REQUEST_ID\\\",\\n          \\\"SaleID\\\":\\\"YOUR_POS_SYSTEM_ID\\\",\\n          \\\"POIID\\\":\\\"SDK_INSTALLATION_ID\\\"\\n      },\\n      \\\"DiagnosisRequest\\\":{\\n          \\\"HostDiagnosisFlag\\\":true\\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>In the response, check the following:<\/p>\n<ul>\n<li>\n<p>The <code>HostStatus<\/code> array:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>IsReachableFlag<\/code><\/td>\n<td style=\"text-align: left;\">A Boolean that indicates if the Adyen host system was reached.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>\n<p>The <code>Response.AdditionalResponse<\/code> string of key-value pairs separated by <strong>&amp;<\/strong>:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>sdkExpiry<\/code><\/td>\n<td style=\"text-align: left;\">The date and time in UTC format when the installed Mobile SDK version expires.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>terminalId<\/code><\/td>\n<td style=\"text-align: left;\">The installation ID of the Mobile SDK.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>unconfirmedBatchCount<\/code><\/td>\n<td style=\"text-align: left;\">The number of stored transactions that have not been forwarded to the Adyen payments platform yet.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>storeAndForwardStatus<\/code><\/td>\n<td style=\"text-align: left;\">A Base64URL-encoded string that you can decode to get a JSON structure with information about offline transactions.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>asyncCaptureStatus<\/code><\/td>\n<td style=\"text-align: left;\">Only present in mobile iOS solution: The result of retried transactions that previously failed to capture. Possible values are: <span translate=\"no\"><strong>Success<\/strong><\/span>, <span translate=\"no\"><strong>Connectivity Failure<\/strong><\/span>, <span translate=\"no\"><strong>Other Failure<\/strong><\/span>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>attestationStatus<\/code><\/td>\n<td style=\"text-align: left;\">A Base64URL-encoded string that you can decode to get a JSON structure with information about any security issues.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<div class=\"notices green\">\n<p>For iOS, there is a 3-minute wait before completed transactions are included in the capture retry. If <code>unconfirmedBatchCount<\/code> shows remaining transactions, wait before making another diagnosis request.<\/p>\n<\/div>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Diagnosis response for a mobile solution'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n\\\"SaleToPOIResponse\\\" : {\\n\\\"DiagnosisResponse\\\" : {\\n  \\\"Response\\\" : {\\n    \\\"Result\\\" : \\\"Success\\\",\\n    \\\"AdditionalResponse\\\" : \\\"storeAndForwardStatus=eyJhY3RpdmUiOmZhbHNlLCJhdmFpbGFibGUiOnRydWUsImV4cGlyZXNBdCI6IjIwMjUtMDQtMDlUMTI6NTc6MDIuMDAwWiJ9&amp;sdkExpiry=2025-09-03T00:00:00.000Z&amp;attestationStatus=eyJzdGF0dXMiOiJ2YWxpZCJ9&amp;asyncCaptureStatus=Success&amp;terminalId=AC2ABBE8-EDD8-4E2B-AF45-8770FA2347DC.924&amp;unconfirmedBatchCount=0\\\"\\n  },\\n  \\\"HostStatus\\\" : [\\n    {\\n      \\\"AcquirerID\\\" : \\\"0\\\",\\n      \\\"IsReachableFlag\\\" : true\\n    }\\n  ],\\n  \\\"POIStatus\\\" : {\\n    \\\"GlobalStatus\\\" : \\\"OK\\\",\\n    \\\"CommunicationOKFlag\\\" : true\\n  }\\n},\\n\\\"MessageHeader\\\" : {\\n  \\\"SaleID\\\" : \\\"YOUR_POS_SYSTEM_ID\\\",\\n  \\\"ServiceID\\\" : \\\"YOUR_UNIQUE_REQUEST_ID\\\",\\n  \\\"MessageClass\\\" : \\\"Service\\\",\\n  \\\"ProtocolVersion\\\" : \\\"3.0\\\",\\n  \\\"MessageCategory\\\" : \\\"Diagnosis\\\",\\n  \\\"POIID\\\" : \\\"SDK_INSTALLATION_ID\\\",\\n  \\\"MessageType\\\" : \\\"Response\\\"\\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>If present, Base64URL-decode the <code>storeAndForwardStatus<\/code> value. The resulting JSON object can include:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/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;\"><code>available<\/code><\/td>\n<td style=\"text-align: left;\">Boolean<\/td>\n<td style=\"text-align: left;\">Indicates if transactions are accepted offline when the internet connectivity drops.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>active<\/code><\/td>\n<td style=\"text-align: left;\">Boolean<\/td>\n<td style=\"text-align: left;\">Indicates if the mobile device is currently offline.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>expiresAt<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\">The date and time in UTC format when offline payments are no longer possible if the mobile device cannot go online to let the Adyen payments platform attest the security of the device.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>forwardAttemptStatus<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\">Shows what happened when the SDK tried to forward stored offline transactions. Possible values: <span translate=\"no\"><strong>Success<\/strong><\/span>, <span translate=\"no\"><strong>Connectivity failure<\/strong><\/span>, <span translate=\"no\"><strong>Other failure<\/strong><\/span>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Decoded storeAndForwardStatus'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n   \\\"active\\\": false,\\n   \\\"available\\\": true,\\n   \\\"expiresAt\\\": \\\"2025-04-09T12:57:02.000Z\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Base64URL-decode the <code>attestationStatus<\/code> value. The resulting JSON object can include:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/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;\"><code>status<\/code><\/td>\n<td style=\"text-align: left;\">string<\/td>\n<td style=\"text-align: left;\">The overall result of checking the security of the mobile device. Possible values: <ul><li markdown=\"1\"><span translate=\"no\"><strong>Valid<\/strong><\/span>: the mobile device is secure.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>Rejected<\/strong><\/span>: a threat was detected.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>Failed<\/strong><\/span>: could not attest the security of the device. This can be caused by a loss of internet connectivity.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>Expired<\/strong><\/span>: an attestation token has expired. Retry the diagnosis request with <code>HostDiagnosisFlag<\/code> set to <span translate=\"no\"><strong>true<\/strong><\/span> when the internet connectivity is restored.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>selfResolvableIssues<\/code><\/td>\n<td style=\"text-align: left;\">Boolean<\/td>\n<td style=\"text-align: left;\">If <span translate=\"no\"><strong>true<\/strong><\/span>, one or more of the detected issues can be solved by the end user, and a <code>resolvableIssues<\/code> array is included with the details.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>resolvableIssues<\/code><\/td>\n<td style=\"text-align: left;\">array, string<\/td>\n<td style=\"text-align: left;\">A list of detected problems. Each array item consists of: <ul><li markdown=\"1\"><code>name<\/code>: a short description of the problem.<\/li> <li><code>message<\/code>: a more detailed description of the problem and what the user could do to solve the problem.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Decoded attestationStatus'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n   \\\"status\\\": \\\"valid\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Failed diagnosis request<\/h2>\n<p>When the payment terminal or mobile SDK is already processing another request, the diagnosis request fails. You receive a <code>DiagnosisResponse<\/code> object with:<\/p>\n<ul>\n<li><code>Response.Result<\/code>: <span translate=\"no\"><strong>Failure<\/strong><\/span><\/li>\n<li><code>Response.ErrorCondition<\/code>: <span translate=\"no\"><strong>Busy<\/strong><\/span><\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Diagnosis response when busy with other request'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"DiagnosisResponse\\\": {\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Failure\\\",\\n                \\\"AdditionalResponse\\\": \\\"message=TX_IN_PROGRESS\\\",\\n                \\\"ErrorCondition\\\": \\\"Busy\\\"\\n            }\\n        },\\n        \\\"MessageHeader\\\": {...}\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/point-of-sale\/pos-troubleshooting\/connection-tests\"\n                        target=\"_self\"\n                        >\n                    Run connection tests\n                <\/a><\/li><li><a href=\"\/point-of-sale\/design-your-integration\/network-and-connectivity\"\n                        target=\"_self\"\n                        >\n                    Network and connectivity\n                <\/a><\/li><li><a href=\"\/point-of-sale\/pos-troubleshooting\/hardware-tests\"\n                        target=\"_self\"\n                        >\n                    Run hardware tests\n                <\/a><\/li><li><a href=\"\/point-of-sale\/ipp-mobile\"\n                        target=\"_self\"\n                        >\n                    Mobile solutions\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/point-of-sale\/diagnostics\/request-diagnosis","articleFields":{"description":"Check the state of a payment terminal or mobile device, and any offline transactions.","page_id":"5d21d3ca-4019-4c72-8ee4-37eae2cff228","feedback_component":true,"filters_component":false,"decision_tree":"[]"},"algolia":{"url":"https:\/\/docs.adyen.com\/point-of-sale\/diagnostics\/request-diagnosis","title":"Make a diagnosis request","content":"A Terminal API diagnosis request lets you verify the condition of a payment terminal and its components such as the communication module, the battery, or the built-in printer.\nIf you have a Mobile SDK solution using mobile devices instead of payment terminals, a diagnosis request lets you check the security of a device.\nIn both cases a diagnosis request also gives information about any offline payments that have not been sent to Adyen yet.\nDepending on your integration, see:\n\nDiagnose a payment terminal\nDiagnose a Mobile SDK solution\n\nRequirements\nBefore you begin, take into account the following requirements and limitations.\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nSupported with: A Terminal API integration with payment terminals. Android and iOS Mobile SDK solutions for Tap to Pay or card reader.\n\n\nLimitations\nNot supported with a Mobile Payments app solution.\n\n\n\nDiagnose a payment terminal\nThe diagnosis request supports you in business critical processes, because the response includes:\n\nbatteryLevel: This parameter is included for battery-powered terminals, and shows the battery charge level. You can use this information to let your staff know they need to recharge the terminal soon. For guidelines regarding terminal battery usage, see Manage battery power.\nunconfirmedBatchCount: The number of payments that the terminal has not been able to send to the Adyen host for completion (capture and settlement). An unconfirmedBatchCount greater than 0 (zero) indicates there is possibly a problem with your network.\n\nDiagnosing a payment terminal is best done in two steps:\n\nFirst check the condition of the terminal.\nThen, if the unconfirmedBatchCountis greater than 0 (zero), check if the Adyen host system is reachable.\n\n1. Verify the condition of a terminal\nTo check the condition of a payment terminal:\n\n\nMake a Terminal API diagnosis request, specifying:\n\n\nThe standard \n  SaleToPOIRequest.MessageHeader\n object, with MessageClass set to Service and MessageCategory set to Diagnosis.\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nProtocolVersion\n\n3.0\n\n\nMessageClass\n\nService\n\n\nMessageCategory\n\nDiagnosis\n\n\nMessageType\n\nRequest\n\n\nServiceID\n\nYour unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.\n\n\nSaleID\n\nYour unique ID for the POS system component to send this request from.\n\n\nPOIID\n\nThe unique ID of the terminal to send this request to. Format: [device model]-[serial number].\n\n\n\n\n\n\n\nThe  DiagnosisRequest body, including:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nHostDiagnosisFlag\n\nInitially set the value to false.  You only need to set the value to true for further diagnosis when the initial response includes an unconfirmedBatchCount greater than zero. This is explained in 2. Verify that the Adyen host system is reachable.\n\n\n\n\n\n\n\n\n\n\nUse the following parts of the response to check the condition of the terminal:\n\n\nThe POIStatus object:\n\n\n\nParameter\nDescription\n\n\n\n\nGlobalStatus\nThe condition of the payment terminal.\n\n\nCommunicationOKFlag\nA Boolean that indicates whether the general condition of the communication module is OK.\n\n\nPrinterStatus\nThis parameter is included when the payment terminal has a built-in printer, and indicates the condition of the printer module. NoPaper indicates the receipt paper roll is missing or the paper is not sticking out.\n\n\n\n\n\nThe Response.AdditionalResponse string of key-value pairs separated by &amp;:\n\n\n\nParameter\nDescription\n\n\n\n\nbatteryLevel\nThis parameter is included for battery-powered terminals, and indicates the battery charge level as a percentage of fully charged.\n\n\nunconfirmedBatchCount\nThe number of payments that the terminal has not yet sent for completion to our platform, and thus cannot be settled.\n\n\nfirmwareVersion\nThe software version that the terminal is on.\n\n\nnetworkProfile\nA Base64 string that you can decode to see the IP address of the terminal and other network data.\n\n\nmerchantAccount\nThe merchant account that the diagnosed payment terminal is assigned to.\n\n\nterminalId\nThe POIID of the diagnosed payment terminal, in the format [device model]-[serial number].\n\n\nstoreId\nThe store that the diagnosed payment terminal is assigned to.\n\n\ntamperStatus\nThis parameter only applies to UX300 and UX410 terminals. The value ARS_TRIGGERED indicates that anti-removal switches (ARS) have been triggered. This means you must stop using the terminal immediately.\n\n\n\n\n\nIf the terminal uses Point-to-Point Encryption (P2PE) instead of Adyen End-to-End Encryption (E2EE), Response.AdditionalResponse also includes the following parameters:\n\nThe diagnosis response includes P2PE protocol, SRED, vault, and app manager versions as provided by the hardware manufacturer. You need to specify this data in your annual PCI assessment.\n\n\n\n\nParameter\nDescription\n\n\n\n\np2peFirmwareVersionNumber\nThe version number of the P2PE software managed and used by Adyen.\n\n\np2peOpenProtocolVersion\nThe version of the open protocol application.\n\n\np2peSREDVersion\nThe version of the Secure Reading and Exchange of Data (SRED) functionality.\n\n\np2peVaultVersion\nThe version of the vault.\n\n\np2peAppManagerVersion\nThe version of the app manager.\n\n\n\n\n\n\n\n\n\n\n\n\n\nIn the AdditionalResponse check the value of the unconfirmedBatchCount. This should be 0 (zero). If not, there may be a problem with your network.\nIf the unconfirmedBatchCount is greater than 0, proceed to step 2: Verify that the Adyen host system is reachable.\n\n\n2. Verify that the Adyen host system is reachable\nIf the diagnosis response shows an unconfirmedBatchCount greater than 0 (zero), there may be a problem with your network. To check if this is the case:\n\n\nMake another diagnosis request as described under 1. Verify the condition of a terminal, but this time set\nDiagnosisRequest.HostDiagnosisFlag to true. A communication test will try to reach the Adyen host system.\n\n\n\n\n\nIn the response, check the HostStatus array:\n\n\n\nParameter\nDescription\n\n\n\n\nIsReachableFlag\nA Boolean that indicates if the Adyen host system was reached. If the Adyen host system could not be reached, you may need to adjust your firewall settings or other network aspects.\n\n\n\n\n\n\n\n\nDiagnose a Mobile SDK solution\nIn a Mobile SDK solution, the Terminal API diagnosis request enables you to do the following:\n\n\nCheck if there are stored offline payments that have not been forwarded to Adyen yet. If the request has hostDiagnosisFlag set to true, the SDK will try to go online and forward these transactions.\n\nDiagnosis of offline payments is only included if your Mobile SDK solution supports Store and Forward offline payments.\n\n\n\nCheck for security threats that would block transactions. If threats are detected that an operator can solve, the response includes information about the cause and solution of the problem.\n\n\nCheck the expiry date of the Android or iOS SDK that is used on the mobile device. Transactions will be blocked if mandatory updates are not carried out.\n\n\nFor an iOS Mobile SDK solution, check if there are failed captures that need to be retried.\n\n\nProceed as follows:\n\n\nMake a Terminal API diagnosis request with:\n\n\n\n  SaleToPOIRequest.MessageHeader\n: The standard MessageHeader object, with the following parameters.\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nProtocolVersion\n\n3.0\n\n\nMessageClass\n\nService\n\n\nMessageCategory\n\nDiagnosis\n\n\nMessageType\n\nRequest\n\n\nServiceID\n\nYour unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.\n\n\nSaleID\n\nYour unique ID for the POS system component to send this request from.\n\n\nPOIID\n\nThe installation ID of the SDK, for example AC2ABBE8-EDD8-4E2B-AF45-8770FA2347DC.924.\n\n\n\n\n\nThe  DiagnosisRequest object with:\n\n\n\nParameter\nDescription\n\n\n\n\nHostDiagnosisFlag\nSet the value to true so that the SDK will try to connect to Adyen for a security scan, to forward any stored offline transactions, and to retry sending any transactions that previously failed to capture (iOS mobile solution only). If you set this field to false, in a mobile solution, the SDK will not connect to Adyen.\n\n\n\n\n\n\n\n\n\n\nIn the response, check the following:\n\n\nThe HostStatus array:\n\n\n\nParameter\nDescription\n\n\n\n\nIsReachableFlag\nA Boolean that indicates if the Adyen host system was reached.\n\n\n\n\n\nThe Response.AdditionalResponse string of key-value pairs separated by &amp;:\n\n\n\nParameter\nDescription\n\n\n\n\nsdkExpiry\nThe date and time in UTC format when the installed Mobile SDK version expires.\n\n\nterminalId\nThe installation ID of the Mobile SDK.\n\n\nunconfirmedBatchCount\nThe number of stored transactions that have not been forwarded to the Adyen payments platform yet.\n\n\nstoreAndForwardStatus\nA Base64URL-encoded string that you can decode to get a JSON structure with information about offline transactions.\n\n\nasyncCaptureStatus\nOnly present in mobile iOS solution: The result of retried transactions that previously failed to capture. Possible values are: Success, Connectivity Failure, Other Failure.\n\n\nattestationStatus\nA Base64URL-encoded string that you can decode to get a JSON structure with information about any security issues.\n\n\n\n\n\n\nFor iOS, there is a 3-minute wait before completed transactions are included in the capture retry. If unconfirmedBatchCount shows remaining transactions, wait before making another diagnosis request.\n\n\n\n\n\n\nIf present, Base64URL-decode the storeAndForwardStatus value. The resulting JSON object can include:\n\n\n\nParameter\nType\nDescription\n\n\n\n\navailable\nBoolean\nIndicates if transactions are accepted offline when the internet connectivity drops.\n\n\nactive\nBoolean\nIndicates if the mobile device is currently offline.\n\n\nexpiresAt\nstring\nThe date and time in UTC format when offline payments are no longer possible if the mobile device cannot go online to let the Adyen payments platform attest the security of the device.\n\n\nforwardAttemptStatus\nstring\nShows what happened when the SDK tried to forward stored offline transactions. Possible values: Success, Connectivity failure, Other failure.\n\n\n\n\n\n\n\n\nBase64URL-decode the attestationStatus value. The resulting JSON object can include:\n\n\n\nParameter\nType\nDescription\n\n\n\n\nstatus\nstring\nThe overall result of checking the security of the mobile device. Possible values: Valid: the mobile device is secure. Rejected: a threat was detected. Failed: could not attest the security of the device. This can be caused by a loss of internet connectivity. Expired: an attestation token has expired. Retry the diagnosis request with HostDiagnosisFlag set to true when the internet connectivity is restored.\n\n\nselfResolvableIssues\nBoolean\nIf true, one or more of the detected issues can be solved by the end user, and a resolvableIssues array is included with the details.\n\n\nresolvableIssues\narray, string\nA list of detected problems. Each array item consists of: name: a short description of the problem. message: a more detailed description of the problem and what the user could do to solve the problem.\n\n\n\n\n\n\n\n\nFailed diagnosis request\nWhen the payment terminal or mobile SDK is already processing another request, the diagnosis request fails. You receive a DiagnosisResponse object with:\n\nResponse.Result: Failure\nResponse.ErrorCondition: Busy\n\n\n    \n\nSee also\n\n\n                    Run connection tests\n                \n                    Network and connectivity\n                \n                    Run hardware tests\n                \n                    Mobile solutions\n                \n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"In-person payments","lvl2":"Run diagnostics","lvl3":"Make a diagnosis request"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/point-of-sale\/diagnostics","lvl3":"\/point-of-sale\/diagnostics\/request-diagnosis"},"levels":4,"category":"In-person payments","category_color":"green","tags":["diagnosis","request"]},"articleFiles":{"diagnosis_0.json":"<p alt=\"\">diagnosis_0.json<\/p>","diagnosis_0_response.json":"<p alt=\"\">diagnosis_0_response.json<\/p>","diagnosis_1.json":"<p alt=\"\">diagnosis_1.json<\/p>","diagnosis_1_response.json":"<p alt=\"\">diagnosis_1_response.json<\/p>"}}
