--- title: "Verify transaction status" description: "Learn how to verify the status of a transaction when you don't receive a response." url: "https://docs.adyen.com/point-of-sale/basic-tapi-integration/verify-transaction-status" source_url: "https://docs.adyen.com/point-of-sale/basic-tapi-integration/verify-transaction-status.md" canonical: "https://docs.adyen.com/point-of-sale/basic-tapi-integration/verify-transaction-status" last_modified: "2021-01-27T10:23:00+01:00" language: "en" --- # Verify transaction status Learn how to verify the status of a transaction when you don't receive a response. [View source](/point-of-sale/basic-tapi-integration/verify-transaction-status.md) 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. Instead, your integration should [request the transaction's status](#request-status) to verify whether the transaction is: * [Processed](#success) * [In progress](#transaction-in-progress) * [Not found](#transaction-not-found) If the transaction has been processed you also receive the original transaction response, indicating the result. If 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](/point-of-sale/pos-troubleshooting/terminal-turns-on/not-connected/), and see our [network recommendations](/point-of-sale/design-your-integration/network-and-connectivity/network-configuration#handling-loss-of-internet-connectivity). ## Requirements | Requirement | Description | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | A [Terminal API integration](/point-of-sale/basic-tapi-integration/) with payment terminals or an iOS [Mobile SDK](/point-of-sale/mobile-ios/) solution for Tap to Pay or card reader. | | **Limitations** | For an iOS Mobile solution:- `ReceiptReprintFlag` is not supported. - In-progress transactions do not include `tenderReference` and `detailedStatus` in the response. | | **Setup steps** | Before 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](#request-status). Otherwise, you need to wait for an event notification with the response. | ## Check the transaction status We recommend that your integration automatically checks the status of a transaction any time it fails to receive a transaction response. 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. To get the status of a transaction: 1. Make a [Terminal API](/point-of-sale/design-your-integration/terminal-api) transaction status request, specifying: * The standard [`SaleToPOIRequest.MessageHeader` ](/point-of-sale/design-your-integration/terminal-api#request-message-header)object, with `MessageClass` set to **Service** and `MessageCategory` set to **TransactionStatus**. | Parameter | Required | Description | | ----------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ProtocolVersion` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **3.0** | | `MessageClass` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Service** | | `MessageCategory` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **TransactionStatus** | | `MessageType` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Request** | | `SaleID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique ID for the POS system component to send this request from. | | `ServiceID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your 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. | | `POIID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique ID of the terminal to send this request to. Format: *\[device model]-\[serial number]*. | * The [TransactionStatusRequest](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus) object with: | Parameter | Required | Description | | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ReceiptReprintFlag` | | Set to **true** if you want to reprint the receipt(s).\`ReceiptReprintFlag\` is not supported in an iOS Mobile SDK solution. | | `DocumentQualifier` | | The receipt data you want to receive in the response. Can be one or both of:- **CashierReceipt**: cashier receipt, including signature data. - **CustomerReceipt**: shopper receipt. | | `MessageReference` | | Object 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. | The following example shows how to check the status of a payment with the `ServiceID` **29235**. **TransactionStatusRequest** ```json { "SaleToPOIRequest": { "MessageHeader": { "ProtocolVersion": "3.0", "MessageClass": "Service", "MessageCategory": "TransactionStatus", "MessageType": "Request", "SaleID": "POSSystemID12345", "ServiceID": "29245", "POIID": "V400m-324688179" }, "TransactionStatusRequest":{ "ReceiptReprintFlag": true, "DocumentQualifier": [ "CashierReceipt", "CustomerReceipt" ], "MessageReference": { "SaleID":" POSSystemID12345", "ServiceID": "29235", "MessageCategory": "Payment" } } } } ``` 2. In the [TransactionStatusResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus#responses-200-Response), check the `Result`. This indicates whether the transaction has been processed: * [`Success` ](#success): The transaction has been processed. The original transaction response is also provided. * `Failure`: The transaction has not been processed. The reason is indicated by the `ErrorCondition`: * [`InProgress` ](#transaction-in-progress): The transaction is still being processed. * [`NotFound` ](#transaction-not-found): We were not able to find the transaction. For an example of each result, see the next sections. ## Transaction processed A [TransactionStatusResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus#responses-200-Response) with a `Result` of **Success** indicates that the transaction reached an end state: approved, cancelled, or declined. To determine the result of the transaction, use the original transaction response, provided in the `RepeatedResponseMessageBody`. For example: * [PaymentResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment#responses-200-Response) has `Result` **Success**: the payment succeeded. * [PaymentResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment#responses-200-Response) has `Result` **Failure** and `ErrorCondition` **Aborted**: the payment was cancelled from the POS app. * [PaymentResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment#responses-200-Response) has `Result` **Failure** and `ErrorCondition` **Cancel**: the payment was cancelled from the terminal. **TransactionStatusResponse for a successful payment** ```json { "SaleToPOIResponse": { "MessageHeader": { "MessageCategory": "TransactionStatus", "MessageClass": "Service", "MessageType": "Response", "POIID": "e280-324688179", "ProtocolVersion": "3.0", "SaleID": "POSSystemID12345", "ServiceID": "987" }, "TransactionStatusResponse": { "RepeatedMessageResponse": { "MessageHeader": { "MessageCategory": "Payment", "MessageClass": "Service", "MessageType": "Response", "POIID": "e280-324688179", "ProtocolVersion": "3.0", "SaleID": "POSSystemID12345", "ServiceID": "816" }, "RepeatedResponseMessageBody": { "PaymentResponse": { "POIData": { "POIReconciliationID": "1000", "POITransactionID": { "TimeStamp": "2021-01-21T09:47:32.000Z", "TransactionID": "BV0q001611222452000.NC6HT9CRT65ZGN82" } }, "PaymentReceipt": [...], "PaymentResult": { "AmountsResp": { "AuthorizedAmount": 19.30, "Currency": "EUR" }, "OnlineFlag": true, "PaymentAcquirerData": {...}, "PaymentInstrumentData": {...} }, "Response": { "AdditionalResponse": "...pspReference=NC6HT9CRT65ZGN82...", "Result": "Success" }, "SaleData": { "SaleTransactionID": { "TimeStamp": "2021-01-21T09:47:21.092Z", "TransactionID": "280" } } } } }, "Response": { "Result": "Success" } } } } ``` **TransactionStatusResponse for a payment cancelled from the POS app** ```json { "SaleToPOIResponse": { "MessageHeader": { "MessageCategory": "TransactionStatus", "MessageClass": "Service", "MessageType": "Response", "POIID": "V400m-324688179", "ProtocolVersion": "3.0", "SaleID": "POSSystemID12345", "ServiceID": "800" }, "TransactionStatusResponse": { "MessageReference": { "MessageCategory": "Payment", "SaleID": "POSSystemID12345", "ServiceID": "172218" }, "RepeatedMessageResponse": { "MessageHeader": { "MessageCategory": "Payment", "MessageClass": "Service", "MessageType": "Response", "POIID": "V400m-324688179", "ProtocolVersion": "3.0", "SaleID": "POSSystemID12345", "ServiceID": "172218" }, "RepeatedResponseMessageBody": { "PaymentResponse": { "POIData": { "POIReconciliationID": "1000", "POITransactionID": { "TimeStamp": "2021-02-17T08:57:37.000Z", "TransactionID": "8ha5001613552257008" } }, "PaymentResult": { "PaymentAcquirerData": { "AcquirerPOIID": "V400m-324688179", "MerchantID": "ADYEN_MERCHANT_ACCOUNT" }, "PaymentInstrumentData": { "CardData": {}, "PaymentInstrumentType": "Card" } }, "Response": { "AdditionalResponse": "refusalReason=104%20Merchant%20cancelled%20tx&tid=46403161&transactionType=GOODS_SERVICES&backendGiftcardIndicator=false&posadditionalamounts.originalAmountValue=1553&posAmountGratuityValue=0&giftcardIndicator=false&batteryLevel=85%25&store=StoreOne&txtime=09%3a57%3a37&iso8601TxDate=2021-02-17T08%3a57%3a37.0000000%2b0000&posOriginalAmountValue=1553&txdate=17-02-2021&merchantReference=569&posadditionalamounts.originalAmountCurrency=EUR&posAuthAmountCurrency=EUR&message=104%20Merchant%20cancelled%20tx&posAmountCashbackValue=0&posAuthAmountValue=1553", "ErrorCondition": "Aborted", "Result": "Failure" }, "SaleData": { "SaleTransactionID": { "TimeStamp": "2021-02-17T08:57:32.850Z", "TransactionID": "569" } } } } }, "Response": { "Result": "Success" } } } } ``` ## Transaction in progress A [TransactionStatusResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus#responses-200-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. When 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](#success). There is no need to apply a polling delay, because the terminal will handle that for you. In the `TransactionStatusResponse.Response`, the `AdditionalResponse` field includes: * `tenderReference`: The transaction reference provided by the terminal. This is important for reporting purposes. * `detailedStatus`: The [tender state](/point-of-sale/design-your-integration/notifications/display-notifications/tender-state-reference-sheet), 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](/point-of-sale/design-your-integration/notifications/display-notifications). This means you can use transaction status requests as an alternative to implementing display notifications. For an iOS Mobile SDK solution, `tenderReference` and `detailedStatus` are not included in the response. The example response below indicates that this transaction is still in-progress. **TransactionStatusResponse for an in-progress transaction** ```json { "SaleToPOIResponse":{ "MessageHeader":{ "MessageCategory":"TransactionStatus", "MessageClass":"Service", "MessageType":"Response", "POIID":"V400m-347448439", "ProtocolVersion":"3.0", "SaleID":"POSSystemID12345", "ServiceID":"051348511" }, "TransactionStatusResponse":{ "MessageReference":{ "MessageCategory":"Payment", "SaleID":"POSSystemID12345", "ServiceID":"051348402" }, "Response":{ "AdditionalResponse":"detailedStatus=TENDER_CREATED&status=Uncompleted transaction&tenderReference=D5VP001701780521022", "ErrorCondition":"InProgress", "Result":"Failure" } } } } ``` ## Transaction not found A [TransactionStatusResponse.Response](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus#responses-200-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. When the transaction is not found, this means that either: * The `POIID`, `SaleID` or `ServiceID` you specified in the [transaction status request](#request-status) are incorrect. Check that you provided the `POIID`, `SaleID`, and `ServiceID` from the *original* transaction in the `TransactionStatusRequest.MessageReference`. * 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 *original* transaction. The example response below indicates that this transaction was not found. **TransactionStatusResponse for a transaction that is not found** ```json { "SaleToPOIResponse":{ "MessageHeader":{ "MessageCategory":"TransactionStatus", "MessageClass":"Service", "MessageType":"Response", "POIID":"V400m-324688179", "ProtocolVersion":"3.0", "SaleID":"POSSystemID12345", "ServiceID":"29235-status" }, "TransactionStatusResponse":{ "Response":{ "ErrorCondition":"NotFound", "Result":"Failure", "AdditionalResponse":"message=Message%20not%20found.%20Category%3dPayment%2c%20last%20such%20Request%20has%20SaleID%3dPOSSystemID12345%20ServiceID%3d29235", } } } } ``` ## See also * [Check the status of a donation](/point-of-sale/donate) * [Handle responses](/point-of-sale/error-scenarios) * [Time-outs](/point-of-sale/error-scenarios/pos-timeouts)