{"title":"Verify transaction status","category":"default","creationDate":1779533779,"content":"<p>When you make a transaction, a communication or technical issue can prevent your POS app from receiving a response. Without this response it is unclear to your staff if the transaction has been processed. They may try to cancel or refund the transaction, or repeat the transaction.<\/p>\n<p>Instead, your integration should <a href=\"#request-status\">request the transaction's status<\/a> to verify whether the transaction is:<\/p>\n<ul>\n<li><a href=\"#success\">Processed<\/a><\/li>\n<li><a href=\"#transaction-in-progress\">In progress<\/a><\/li>\n<li><a href=\"#transaction-not-found\">Not found<\/a><\/li>\n<\/ul>\n<p>If the transaction has been processed you also receive the original transaction response, indicating the result.<\/p>\n<div class=\"notices blue\">\n<p>If you  are making frequent transaction status requests then you may have a network connectivity issue. Make sure that your <a href=\"\/point-of-sale\/pos-troubleshooting\/terminal-turns-on\/not-connected\/\">terminal is connected to the internet<\/a>, and see our <a href=\"\/point-of-sale\/design-your-integration\/network-and-connectivity\/network-configuration#handling-loss-of-internet-connectivity\">network recommendations<\/a>.<\/p>\n<\/div>\n<h2>Requirements<\/h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">A <a href=\"\/point-of-sale\/basic-tapi-integration\/\">Terminal API integration<\/a> with payment terminals or an iOS <a href=\"\/point-of-sale\/mobile-ios\/\">Mobile SDK<\/a> solution for Tap to Pay or card reader.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">For an iOS Mobile solution: <ul><li markdown=\"1\"><code>ReceiptReprintFlag<\/code> is not supported.<\/li><li markdown=\"1\">In-progress transactions do not include <code>tenderReference<\/code> and <code>detailedStatus<\/code> in the response.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">Before you begin: <ul><li markdown=\"1\">For an iOS Mobile solution, this feature is in beta. Contact your Adyen account manager for more information.<\/li><li markdown=\"1\">If you normally use asynchronous cloud communications, you need to use a <code>\/sync<\/code> endpoint to <a href=\"#request-status\">check the transaction status<\/a>. Otherwise, you need to wait for an event notification with the response.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"request-status\">Check the transaction status<\/h2>\n<p>We recommend that your integration automatically checks the status of a transaction any time it fails to receive a transaction response.<\/p>\n<p>Payment requests time out after a while. If you do not receive a payment response (or you receive a response indicating a time-out) after 120 seconds (local integration) or 150 seconds (cloud integration), and the internet connection hasn't dropped, your integration should automatically check the transaction status.<\/p>\n<p>To get the status of a transaction:<\/p>\n<ol>\n<li>\n<p>Make a <a href=\"\/point-of-sale\/design-your-integration\/terminal-api\">Terminal API<\/a> transaction status 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>TransactionStatus<\/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>TransactionStatus<\/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>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>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>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<li>\n<p>The  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/transactionstatus\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TransactionStatusRequest<\/a> object with:<\/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>ReceiptReprintFlag<\/code><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Set to <span translate=\"no\"><strong>true<\/strong><\/span> if you want to reprint the receipt(s). <div class=\"notices yellow\">`ReceiptReprintFlag` is not supported in an iOS Mobile SDK solution.<\/div><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>DocumentQualifier<\/code><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">The receipt data you want to receive in the response. Can be one or both of: <ul><li markdown=\"1\"><span translate=\"no\"><strong>CashierReceipt<\/strong><\/span>: cashier receipt, including signature data.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>CustomerReceipt<\/strong><\/span>: shopper receipt.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageReference<\/code><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: left;\">Object that identifies the message header of the message request to abort or request the status. Contains: <ul><li markdown=\"1\"><code>SaleID<\/code>: The <code>SaleID<\/code> of the POS system component that made the original transaction.<\/li> <li markdown=\"1\"><code>ServiceID<\/code>: The <code>ServiceID<\/code> of the original transaction.<\/li> <li markdown=\"1\"><code>MessageCategory<\/code>: The original transaction type, either: <ul><li markdown=\"1\"><span translate=\"no\"><strong>Payment<\/strong><\/span>: A payment request.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>Reversal<\/strong><\/span>: A refund request.<\/li> <li markdown=\"1\"><span translate=\"no\"><strong>StoredValue<\/strong><\/span>: A request to activate or load balance on a gift card.<\/li><\/ul> <br> <div class=\"sc-notice info\"><div> If you do not include the <code>MessageReference<\/code> object, you receive a failure response with <code>ErrorCondition<\/code> <span translate=\"no\"><strong>NotFound<\/strong><\/span>. Use the <code>AdditionalResponse<\/code> to find the <code>SaleID<\/code> and <code>ServiceID<\/code> of the most recent transaction made by the terminal.<\/div><\/div><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<p>The following example shows how to check the status of a payment with the <code>ServiceID<\/code> <strong>29235<\/strong>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'TransactionStatusRequest'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n   \\\"SaleToPOIRequest\\\": {\\n      \\\"MessageHeader\\\": {\\n         \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n         \\\"MessageClass\\\": \\\"Service\\\",\\n         \\\"MessageCategory\\\": \\\"TransactionStatus\\\",\\n         \\\"MessageType\\\": \\\"Request\\\",\\n         \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n         \\\"ServiceID\\\": \\\"29245\\\",\\n         \\\"POIID\\\": \\\"V400m-324688179\\\"\\n      },\\n      \\\"TransactionStatusRequest\\\":{\\n         \\\"ReceiptReprintFlag\\\": true,\\n         \\\"DocumentQualifier\\\": [\\n            \\\"CashierReceipt\\\",\\n            \\\"CustomerReceipt\\\"\\n         ],\\n         \\\"MessageReference\\\": {\\n            \\\"SaleID\\\":\\\" POSSystemID12345\\\",\\n            \\\"ServiceID\\\": \\\"29235\\\",\\n            \\\"MessageCategory\\\": \\\"Payment\\\"\\n         }\\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  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/transactionstatus#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TransactionStatusResponse.Response<\/a>, check the <code>Result<\/code>. This indicates whether the transaction has been processed:<\/p>\n<ul>\n<li><a href=\"#success\">\n  <code>Success<\/code>\n<\/a>: The transaction has been processed. The original transaction response is also provided.<\/li>\n<li>\n<p><code>Failure<\/code>: The transaction has not been processed. The reason is indicated by the <code>ErrorCondition<\/code>:<\/p>\n<ul>\n<li><a href=\"#transaction-in-progress\">\n  <code>InProgress<\/code>\n<\/a>: The transaction is still being processed.<\/li>\n<li><a href=\"#transaction-not-found\">\n  <code>NotFound<\/code>\n<\/a>: We were not able to find the transaction.<\/li>\n<\/ul>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<p>For an example of each result, see the next sections.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"success\">Transaction processed<\/h2>\n<p>A  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/transactionstatus#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TransactionStatusResponse.Response<\/a> with a <code>Result<\/code> of <span translate=\"no\"><strong>Success<\/strong><\/span> indicates that the transaction reached an end state: approved, cancelled, or declined.<\/p>\n<p>To determine the result of the transaction, use the original transaction response, provided in the <code>RepeatedResponseMessageBody<\/code>. For example:<\/p>\n<ul>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PaymentResponse.Response<\/a> has <code>Result<\/code> <span translate=\"no\"><strong>Success<\/strong><\/span>: the payment succeeded.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PaymentResponse.Response<\/a> has <code>Result<\/code> <span translate=\"no\"><strong>Failure<\/strong><\/span> and <code>ErrorCondition<\/code> <span translate=\"no\"><strong>Aborted<\/strong><\/span>: the payment was cancelled from the POS app.<\/li>\n<li> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PaymentResponse.Response<\/a> has <code>Result<\/code> <span translate=\"no\"><strong>Failure<\/strong><\/span> and <code>ErrorCondition<\/code> <span translate=\"no\"><strong>Cancel<\/strong><\/span>: the payment was cancelled from the terminal.<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'TransactionStatusResponse for a successful payment'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"MessageHeader\\\": {\\n            \\\"MessageCategory\\\": \\\"TransactionStatus\\\",\\n            \\\"MessageClass\\\": \\\"Service\\\",\\n            \\\"MessageType\\\": \\\"Response\\\",\\n            \\\"POIID\\\": \\\"e280-324688179\\\",\\n            \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n            \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n            \\\"ServiceID\\\": \\\"987\\\"\\n        },\\n        \\\"TransactionStatusResponse\\\": {\\n            \\\"RepeatedMessageResponse\\\": {\\n                \\\"MessageHeader\\\": {\\n                    \\\"MessageCategory\\\": \\\"Payment\\\",\\n                    \\\"MessageClass\\\": \\\"Service\\\",\\n                    \\\"MessageType\\\": \\\"Response\\\",\\n                    \\\"POIID\\\": \\\"e280-324688179\\\",\\n                    \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n                    \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n                    \\\"ServiceID\\\": \\\"816\\\"\\n                },\\n                \\\"RepeatedResponseMessageBody\\\": {\\n                    \\\"PaymentResponse\\\": {\\n                        \\\"POIData\\\": {\\n                            \\\"POIReconciliationID\\\": \\\"1000\\\",\\n                            \\\"POITransactionID\\\": {\\n                                \\\"TimeStamp\\\": \\\"2021-01-21T09:47:32.000Z\\\",\\n                                \\\"TransactionID\\\": \\\"BV0q001611222452000.NC6HT9CRT65ZGN82\\\"\\n                            }\\n                        },\\n                        \\\"PaymentReceipt\\\": [...],\\n                        \\\"PaymentResult\\\": {\\n                            \\\"AmountsResp\\\": {\\n                                \\\"AuthorizedAmount\\\": 19.30,\\n                                \\\"Currency\\\": \\\"EUR\\\"\\n                            },\\n                            \\\"OnlineFlag\\\": true,\\n                            \\\"PaymentAcquirerData\\\": {...},\\n                            \\\"PaymentInstrumentData\\\": {...}\\n                        },\\n                        \\\"Response\\\": {\\n                            \\\"AdditionalResponse\\\": \\\"...pspReference=NC6HT9CRT65ZGN82...\\\",\\n                            \\\"Result\\\": \\\"Success\\\"\\n                        },\\n                        \\\"SaleData\\\": {\\n                            \\\"SaleTransactionID\\\": {\\n                                \\\"TimeStamp\\\": \\\"2021-01-21T09:47:21.092Z\\\",\\n                                \\\"TransactionID\\\": \\\"280\\\"\\n                            }\\n                        }\\n                    }\\n                }\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\"\\n            }\\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=\"'TransactionStatusResponse for a payment cancelled from the POS app'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"MessageHeader\\\": {\\n            \\\"MessageCategory\\\": \\\"TransactionStatus\\\",\\n            \\\"MessageClass\\\": \\\"Service\\\",\\n            \\\"MessageType\\\": \\\"Response\\\",\\n            \\\"POIID\\\": \\\"V400m-324688179\\\",\\n            \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n            \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n            \\\"ServiceID\\\": \\\"800\\\"\\n        },\\n        \\\"TransactionStatusResponse\\\": {\\n            \\\"MessageReference\\\": {\\n                \\\"MessageCategory\\\": \\\"Payment\\\",\\n                \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n                \\\"ServiceID\\\": \\\"172218\\\"\\n            },\\n            \\\"RepeatedMessageResponse\\\": {\\n                \\\"MessageHeader\\\": {\\n                    \\\"MessageCategory\\\": \\\"Payment\\\",\\n                    \\\"MessageClass\\\": \\\"Service\\\",\\n                    \\\"MessageType\\\": \\\"Response\\\",\\n                    \\\"POIID\\\": \\\"V400m-324688179\\\",\\n                    \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n                    \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n                    \\\"ServiceID\\\": \\\"172218\\\"\\n                },\\n                \\\"RepeatedResponseMessageBody\\\": {\\n                    \\\"PaymentResponse\\\": {\\n                        \\\"POIData\\\": {\\n                            \\\"POIReconciliationID\\\": \\\"1000\\\",\\n                            \\\"POITransactionID\\\": {\\n                                \\\"TimeStamp\\\": \\\"2021-02-17T08:57:37.000Z\\\",\\n                                \\\"TransactionID\\\": \\\"8ha5001613552257008\\\"\\n                            }\\n                        },\\n                        \\\"PaymentResult\\\": {\\n                            \\\"PaymentAcquirerData\\\": {\\n                                \\\"AcquirerPOIID\\\": \\\"V400m-324688179\\\",\\n                                \\\"MerchantID\\\": \\\"ADYEN_MERCHANT_ACCOUNT\\\"\\n                            },\\n                            \\\"PaymentInstrumentData\\\": {\\n                                \\\"CardData\\\": {},\\n                                \\\"PaymentInstrumentType\\\": \\\"Card\\\"\\n                            }\\n                        },\\n                        \\\"Response\\\": {\\n                            \\\"AdditionalResponse\\\": \\\"refusalReason=104%20Merchant%20cancelled%20tx&amp;tid=46403161&amp;transactionType=GOODS_SERVICES&amp;backendGiftcardIndicator=false&amp;posadditionalamounts.originalAmountValue=1553&amp;posAmountGratuityValue=0&amp;giftcardIndicator=false&amp;batteryLevel=85%25&amp;store=StoreOne&amp;txtime=09%3a57%3a37&amp;iso8601TxDate=2021-02-17T08%3a57%3a37.0000000%2b0000&amp;posOriginalAmountValue=1553&amp;txdate=17-02-2021&amp;merchantReference=569&amp;posadditionalamounts.originalAmountCurrency=EUR&amp;posAuthAmountCurrency=EUR&amp;message=104%20Merchant%20cancelled%20tx&amp;posAmountCashbackValue=0&amp;posAuthAmountValue=1553\\\",\\n                            \\\"ErrorCondition\\\": \\\"Aborted\\\",\\n                            \\\"Result\\\": \\\"Failure\\\"\\n                        },\\n                        \\\"SaleData\\\": {\\n                            \\\"SaleTransactionID\\\": {\\n                                \\\"TimeStamp\\\": \\\"2021-02-17T08:57:32.850Z\\\",\\n                                \\\"TransactionID\\\": \\\"569\\\"\\n                            }\\n                        }\\n                    }\\n                }\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\"\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2 id=\"transaction-in-progress\">Transaction in progress<\/h2>\n<p>A  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/transactionstatus#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TransactionStatusResponse.Response<\/a> with an <code>ErrorCondition<\/code> of <span translate=\"no\"><strong>InProgress<\/strong><\/span> indicates the transaction is still being processed. This is usually due to the terminal waiting for input from the shopper. For example, the shopper is entering their PIN, adding a tip, or selecting currency conversion.<\/p>\n<p>When you receive an <span translate=\"no\"><strong>InProgress<\/strong><\/span> response, you can submit repeated transaction status requests in a loop until you receive a response that indicates the <a href=\"#success\">transaction reached an end state<\/a>. There is no need to apply a polling delay, because the terminal will handle that for you.<\/p>\n<p>In the <code>TransactionStatusResponse.Response<\/code>, the <code>AdditionalResponse<\/code> field includes:<\/p>\n<ul>\n<li><code>tenderReference<\/code>: The transaction reference provided by the terminal. This is important for reporting purposes.<\/li>\n<li><code>detailedStatus<\/code>: The <a href=\"\/point-of-sale\/design-your-integration\/notifications\/display-notifications\/tender-state-reference-sheet\">tender state<\/a>, for example, <strong>TENDER_CREATED<\/strong>. You can use this to inform the POS system. It is the same information that is provided in the <code>event<\/code> field in <a href=\"\/point-of-sale\/design-your-integration\/notifications\/display-notifications\">display notifications<\/a>. This means you can use transaction status requests as an alternative to implementing display notifications.<\/li>\n<\/ul>\n<div class=\"notices green\">\n<p>For an iOS Mobile SDK solution, <code>tenderReference<\/code> and <code>detailedStatus<\/code> are not included in the response.<\/p>\n<\/div>\n<p>The example response below indicates that this transaction is still in-progress.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'TransactionStatusResponse for an in-progress transaction'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n   \\\"SaleToPOIResponse\\\":{\\n      \\\"MessageHeader\\\":{\\n         \\\"MessageCategory\\\":\\\"TransactionStatus\\\",\\n         \\\"MessageClass\\\":\\\"Service\\\",\\n         \\\"MessageType\\\":\\\"Response\\\",\\n         \\\"POIID\\\":\\\"V400m-347448439\\\",\\n         \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n         \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n         \\\"ServiceID\\\":\\\"051348511\\\"\\n      },\\n      \\\"TransactionStatusResponse\\\":{\\n         \\\"MessageReference\\\":{\\n            \\\"MessageCategory\\\":\\\"Payment\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"ServiceID\\\":\\\"051348402\\\"\\n         },\\n         \\\"Response\\\":{\\n            \\\"AdditionalResponse\\\":\\\"detailedStatus=TENDER_CREATED&amp;status=Uncompleted transaction&amp;tenderReference=D5VP001701780521022\\\",\\n            \\\"ErrorCondition\\\":\\\"InProgress\\\",\\n            \\\"Result\\\":\\\"Failure\\\"\\n         }\\n      }\\n   }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2 id=\"transaction-not-found\">Transaction not found<\/h2>\n<p>A  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/transactionstatus#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TransactionStatusResponse.Response<\/a> with an <code>ErrorCondition<\/code> of <span translate=\"no\"><strong>NotFound<\/strong><\/span> indicates that we were not able to find the transaction with the <code>SaleID<\/code> and <code>ServiceID<\/code> you specified. The <code>AdditionalResponse<\/code> has <span translate=\"no\"><strong>Message not found<\/strong><\/span> and echoes the category of the transaction (such as Payment), the <code>SaleID<\/code>, and the <code>ServiceID<\/code> you specified in the request.<\/p>\n<p>When the transaction is not found, this means that either:<\/p>\n<ul>\n<li>The <code>POIID<\/code>, <code>SaleID<\/code> or <code>ServiceID<\/code> you specified in the <a href=\"#request-status\">transaction status request<\/a> are incorrect. Check that you provided the <code>POIID<\/code>, <code>SaleID<\/code>, and <code>ServiceID<\/code> from the <em>original<\/em> transaction in the <code>TransactionStatusRequest.MessageReference<\/code>.<\/li>\n<li>We did not receive the original transaction request. The cause can be a dropped internet connection or an unexpected power loss. You can retry the <em>original<\/em> transaction.<\/li>\n<\/ul>\n<p>The example response below indicates that this transaction was not found.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'TransactionStatusResponse for a transaction that is not found'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"SaleToPOIResponse\\\":{\\n    \\\"MessageHeader\\\":{\\n      \\\"MessageCategory\\\":\\\"TransactionStatus\\\",\\n      \\\"MessageClass\\\":\\\"Service\\\",\\n      \\\"MessageType\\\":\\\"Response\\\",\\n      \\\"POIID\\\":\\\"V400m-324688179\\\",\\n      \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n      \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n      \\\"ServiceID\\\":\\\"29235-status\\\"\\n    },\\n    \\\"TransactionStatusResponse\\\":{\\n      \\\"Response\\\":{\\n        \\\"ErrorCondition\\\":\\\"NotFound\\\",\\n        \\\"Result\\\":\\\"Failure\\\",\\n        \\\"AdditionalResponse\\\":\\\"message=Message%20not%20found.%20Category%3dPayment%2c%20last%20such%20Request%20has%20SaleID%3dPOSSystemID12345%20ServiceID%3d29235\\\",\\n      }\\n    }\\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\/donate\"\n                        target=\"_self\"\n                        >\n                    Check the status of a donation\n                <\/a><\/li><li><a href=\"\/point-of-sale\/error-scenarios\"\n                        target=\"_self\"\n                        >\n                    Handle responses\n                <\/a><\/li><li><a href=\"\/point-of-sale\/error-scenarios\/pos-timeouts\"\n                        target=\"_self\"\n                        >\n                    Time-outs\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/point-of-sale\/basic-tapi-integration\/verify-transaction-status","articleFields":{"description":"Learn how to verify the status of a transaction when you don't receive a response.","id":"28874910","type":"page","_expandable":{"operations":""},"status":"current","last_edit_on":"27-01-2021 10:23","page_id":"f8b5be08-2aea-4713-a91d-25246c4eabc6","feedback_component":true,"filters_component":false,"decision_tree":"[]"},"algolia":{"url":"https:\/\/docs.adyen.com\/point-of-sale\/basic-tapi-integration\/verify-transaction-status","title":"Verify transaction status","content":"When you make a transaction, a communication or technical issue can prevent your POS app from receiving a response. Without this response it is unclear to your staff if the transaction has been processed. They may try to cancel or refund the transaction, or repeat the transaction.\nInstead, your integration should request the transaction's status to verify whether the transaction is:\n\nProcessed\nIn progress\nNot found\n\nIf the transaction has been processed you also receive the original transaction response, indicating the result.\n\nIf you  are making frequent transaction status requests then you may have a network connectivity issue. Make sure that your terminal is connected to the internet, and see our network recommendations.\n\nRequirements\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nA Terminal API integration with payment terminals or an iOS Mobile SDK solution for Tap to Pay or card reader.\n\n\nLimitations\nFor an iOS Mobile solution: ReceiptReprintFlag is not supported.In-progress transactions do not include tenderReference and detailedStatus in the response.\n\n\nSetup steps\nBefore you begin: For an iOS Mobile solution, this feature is in beta. Contact your Adyen account manager for more information.If you normally use asynchronous cloud communications, you need to use a \/sync endpoint to check the transaction status. Otherwise, you need to wait for an event notification with the response.\n\n\n\nCheck the transaction status\nWe recommend that your integration automatically checks the status of a transaction any time it fails to receive a transaction response.\nPayment requests time out after a while. If you do not receive a payment response (or you receive a response indicating a time-out) after 120 seconds (local integration) or 150 seconds (cloud integration), and the internet connection hasn't dropped, your integration should automatically check the transaction status.\nTo get the status of a transaction:\n\n\nMake a Terminal API transaction status request, specifying:\n\n\nThe standard \n  SaleToPOIRequest.MessageHeader\n object, with MessageClass set to Service and MessageCategory set to TransactionStatus.\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nProtocolVersion\n\n3.0\n\n\nMessageClass\n\nService\n\n\nMessageCategory\n\nTransactionStatus\n\n\nMessageType\n\nRequest\n\n\nSaleID\n\nYour unique ID for the POS system component to send this request from.\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\nPOIID\n\nThe unique ID of the terminal to send this request to. Format: [device model]-[serial number].\n\n\n\n\n\nThe  TransactionStatusRequest object with:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nReceiptReprintFlag\n\nSet to true if you want to reprint the receipt(s). `ReceiptReprintFlag` is not supported in an iOS Mobile SDK solution.\n\n\nDocumentQualifier\n\nThe receipt data you want to receive in the response. Can be one or both of: CashierReceipt: cashier receipt, including signature data. CustomerReceipt: shopper receipt.\n\n\nMessageReference\n\nObject that identifies the message header of the message request to abort or request the status. Contains: SaleID: The SaleID of the POS system component that made the original transaction. ServiceID: The ServiceID of the original transaction. MessageCategory: The original transaction type, either: Payment: A payment request. Reversal: A refund request. StoredValue: A request to activate or load balance on a gift card.   If you do not include the MessageReference object, you receive a failure response with ErrorCondition NotFound. Use the AdditionalResponse to find the SaleID and ServiceID of the most recent transaction made by the terminal.\n\n\n\n\n\nThe following example shows how to check the status of a payment with the ServiceID 29235.\n\n\n\n\n\nIn the  TransactionStatusResponse.Response, check the Result. This indicates whether the transaction has been processed:\n\n\n  Success\n: The transaction has been processed. The original transaction response is also provided.\n\nFailure: The transaction has not been processed. The reason is indicated by the ErrorCondition:\n\n\n  InProgress\n: The transaction is still being processed.\n\n  NotFound\n: We were not able to find the transaction.\n\n\n\n\nFor an example of each result, see the next sections.\n\n\nTransaction processed\nA  TransactionStatusResponse.Response with a Result of Success indicates that the transaction reached an end state: approved, cancelled, or declined.\nTo determine the result of the transaction, use the original transaction response, provided in the RepeatedResponseMessageBody. For example:\n\n PaymentResponse.Response has Result Success: the payment succeeded.\n PaymentResponse.Response has Result Failure and ErrorCondition Aborted: the payment was cancelled from the POS app.\n PaymentResponse.Response has Result Failure and ErrorCondition Cancel: the payment was cancelled from the terminal.\n\n\n    \n\n\n    \n\nTransaction in progress\nA  TransactionStatusResponse.Response with an ErrorCondition of InProgress indicates the transaction is still being processed. This is usually due to the terminal waiting for input from the shopper. For example, the shopper is entering their PIN, adding a tip, or selecting currency conversion.\nWhen you receive an InProgress response, you can submit repeated transaction status requests in a loop until you receive a response that indicates the transaction reached an end state. There is no need to apply a polling delay, because the terminal will handle that for you.\nIn the TransactionStatusResponse.Response, the AdditionalResponse field includes:\n\ntenderReference: The transaction reference provided by the terminal. This is important for reporting purposes.\ndetailedStatus: The tender state, for example, TENDER_CREATED. You can use this to inform the POS system. It is the same information that is provided in the event field in display notifications. This means you can use transaction status requests as an alternative to implementing display notifications.\n\n\nFor an iOS Mobile SDK solution, tenderReference and detailedStatus are not included in the response.\n\nThe example response below indicates that this transaction is still in-progress.\n\n    \n\nTransaction not found\nA  TransactionStatusResponse.Response with an ErrorCondition of NotFound indicates that we were not able to find the transaction with the SaleID and ServiceID you specified. The AdditionalResponse has Message not found and echoes the category of the transaction (such as Payment), the SaleID, and the ServiceID you specified in the request.\nWhen the transaction is not found, this means that either:\n\nThe POIID, SaleID or ServiceID you specified in the transaction status request are incorrect. Check that you provided the POIID, SaleID, and ServiceID from the original transaction in the TransactionStatusRequest.MessageReference.\nWe did not receive the original transaction request. The cause can be a dropped internet connection or an unexpected power loss. You can retry the original transaction.\n\nThe example response below indicates that this transaction was not found.\n\n    \n\nSee also\n\n\n                    Check the status of a donation\n                \n                    Handle responses\n                \n                    Time-outs\n                \n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"In-person payments","lvl2":"Implement the payment flow","lvl3":"Verify transaction status"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/point-of-sale\/basic-tapi-integration","lvl3":"\/point-of-sale\/basic-tapi-integration\/verify-transaction-status"},"levels":4,"category":"In-person payments","category_color":"green","tags":["Verify","transaction","status"]},"articleFiles":{"tsresponse_processed_transaction.json":"<p alt=\"\">tsresponse_processed_transaction.json<\/p>"}}
