Search

Are you looking for test card numbers?

Would you like to contact support?

Point-of-sale icon

Card acquisition

Retrieve card and shopper details before making another request.

Card acquisition lets you retrieve card and shopper identifiers without making a payment. With these identifiers you can recognize the card used, and even the individual who is using the card. While you can get these same identifiers through a payment request, there are use cases where you need to acquire this data outside of a payment, or before you make a payment.

The card acquisition flow finishes either with a follow-up payment request, or with a cancellation after having received the card acquisition response. The cancellation tells the payment terminal it no longer needs to keep the acquired data.

Scenarios

To understand how you can apply card acquisition, have a look at some use cases:

  • Loyalty: Based on the card acquisition, you look up the shopper in your loyalty program. You can then interact with the shopper on the terminal, through input requests. For example, if the shopper isn't recognized, you ask them to enroll in your loyalty program. Or if the shopper is recognized, you ask whether they want to redeem loyalty points. To finish, you make a payment request for the final transaction amount.

  • Gift card usage: You use card acquisition to check whether the shopper is using a gift card. If you don't want to accept the gift card for this transaction, you cancel the card acquisition and ask for a different card. Or if you want to stimulate usage of your gift card, you give extra discounts in the subsequent payment.

  • Tax-free shopping: You use the issuer country and the card BIN returned in the card acquisition response to determine whether the transaction qualifies for a tax refund. Then you make a payment request.

  • Card-based shopper identification, for example, in a parking garage: Upon arrival, you identify the driver and record their time of arrival based on a card acquisition. Then you cancel the card acquisition. Upon departure, you identify the driver again through card acquisition, calculate the amount due, and make a payment for the calculated amount.

  • Card identification before refunding: Before issuing an unreferenced refund, you use card acquisition to verify whether the shopper is using the same card for the refund as for the initial payment.

For more information about these use cases, follow the links above.

How it works

Card acquisition triggers interaction with the shopper on the payment terminal. Here is how it works:

  1. You make a card acquisition request. Optionally this includes the payable amount.

  2. The terminal prompts the shopper to present their card by tapping, inserting into the card reader, or swiping.
    Note that:

    • QR code wallet details can't be obtained through card acquisition, so the scan QR code button isn't shown.
    • The shopper can present a credit or debit card, or a gift card.
    • If the card acquisition request includes an amount, the amount is shown on the terminal. If not, the terminal just shows the prompt to present a card.

  3. The shopper presents their card and you receive the card acquisition response. From the response you take certain data and process these in your own systems, depending on your use case.

  4. While this is going on, the terminal continually shows One moment. Or, if the shopper inserted their card into the card reader, the terminal shows Keep card inserted.

  5. Depending on your use case, you may want to communicate with the shopper through input requests.
    After such a request is completed, the terminal reverts to showing One moment, or Keep card inserted. The terminal is still holding the card acquisition details while it waits for you to finish the flow.

  6. To finish the flow, you either continue with a payment request, or continue with a cancellation.

    When you continue with a payment, note the following:

    • The payment request must include a reference to the card acquisition. Otherwise, the payment request will fail because the terminal is waiting to use the acquired card details.
    • The terminal shows the amount due.
    • If the shopper inserted or swiped their card for the card acquisition, the terminal now asks them for their PIN or signature.
    • If the amount is below the contactless CVM limit, a shopper using a contactless card doesn't need to tap their card again. But if the card acquisition didn't include an amount or if the card acquisition amount and the payment amount are different, the shopper does need to tap their contactless card again.

Make a card acquisition request

  1. Make a POST request to a Terminal API endpoint, specifying:

    • CardAcquisitionRequest: The request body with:

      Parameter Required Description
      SaleData.SaleTransactionID -white_check_mark- An object with:
      • TransactionID: Your unique reference for this request.
      • TimeStamp: Date and time of the request in UTC format.
      SaleData.TokenRequestedType Customer. This returns the card alias in the TokenValue field of the response. If you do not include the TokenRequestedType the card alias is returned only in the AdditionalResponse.
      CardAcquisitionTransaction -white_check_mark- This object is either empty, or contains:
      • TotalAmount: The transaction amount. You can omit TotalAmount when you don't know the amount yet. Or you can also change the transaction amount later, in the payment request.
      • PaymentType: If you intend to continue with a payment, either omit this parameter or specify Normal. If you intend to continue with an unreferenced refund, see Card check before refunding.
    {
        "SaleToPOIRequest":{
            "MessageHeader":{
                "ProtocolVersion":"3.0",
                "MessageClass":"Service",
                "MessageCategory":"CardAcquisition",
                "MessageType":"Request",
                "ServiceID":"282",
                "SaleID":"POSSystemID12345",
                "POIID":"V400m-346403161"
            },
            "CardAcquisitionRequest":{
                "SaleData":{
                    "SaleTransactionID":{
                        "TransactionID":"369",
                        "TimeStamp":"2021-03-05T12:22:57.449Z"
                    },
                    "{hint:Optional, returns the card alias in TokenValue}TokenRequestedType":"Customer{/hint}"
                },
                "CardAcquisitionTransaction":{
                    "{hint:Optional}TotalAmount{/hint}":16.98
                }
            }
        }
    }
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String saleID = "YOUR_CASH_REGISTER_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.CARD_ACQUISITION );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setServiceID(serviceID);
    messageHeader.setSaleID(saleID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    CardAcquisitionRequest cardAcquisitionRequest = new CardAcquisitionRequest();
    SaleData saleData = new SaleData();
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTransactionID(transactionID);
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleData.setSaleTransactionID(saleTransactionID);
    saleData.setTokenRequestedType( TokenRequestedType.CUSTOMER );
    cardAcquisitionRequest.setSaleData(saleData);
    
    CardAcquisitionTransaction cardAcquisitionTransaction = new CardAcquisitionTransaction();
    cardAcquisitionTransaction.setTotalAmount( BigDecimal.valueOf(16.98) );
    cardAcquisitionRequest.setCardAcquisitionTransaction(cardAcquisitionTransaction);
    saleToPOIRequest.setCardAcquisitionRequest(cardAcquisitionRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
  2. When the card acquisition is successful, you receive a CardAcquisitionResponse with a message of CARD_ACQ_COMPLETED in the AdditionalResponse.

    Card acquisition response
    {
        "SaleToPOIResponse": {
            "CardAcquisitionResponse": {
                "POIData": {
                    "POITransactionID": {
                        "{hint:For use in subsequent payment}TimeStamp{/hint}": "2021-03-05T12:22:59.000Z",
                        "{hint:For use in subsequent payment}TransactionID{/hint}": "8ha5001614946979000"
                },
                "SaleData": {...}
                },
                "PaymentInstrumentData": {
                    "CardData": {
                        "{hint:Included if you enabled receiving the issuer country}CardCountryCode{/hint}": "528",
                        "MaskedPan": "541333 **** 9999",
                        "PaymentBrand": "mc",
                        "PaymentToken": {
                            "TokenRequestedType": "Customer",
                            "TokenValue": "{hint:This is the card alias}M469509594859802{/hint}"
                        },
                        "SensitiveCardData": {
                            "ExpiryDate": "0228"
                        }
                    },
                    "PaymentInstrumentType": "Card"
                },
                "Response": {
                    "AdditionalResponse": "tid=46403161&transactionType=GOODS_SERVICES&backendGiftcardIndicator=false&posadditionalamounts.originalAmountValue=1698&expiryYear=2028&alias=M469509594859802&posAmountGratuityValue=0&giftcardIndicator=false&paymentMethodVariant=mc&txtime=13%3a22%3a59&iso8601TxDate=2021-03-05T12%3a22%3a59.0000000%2b0000&cardType=mc&posOriginalAmountValue=1698&aliasType=Default&txdate=05-03-2021&paymentMethod=mc&merchantReference=369&expiryMonth=02&cardSummary=9999&posadditionalamounts.originalAmountCurrency=EUR&posAuthAmountCurrency=EUR&message=CARD_ACQ_COMPLETED&cardIssuerCountryId=528&posAmountCashbackValue=0&posEntryMode=CLESS_CHIP&fundingSource=CREDIT&issuerCountry=NL&cardScheme=mc&cardBin=541333&posAuthAmountValue=1698",
                    "Result": "Success"
                }
            },
            "MessageHeader": {...}
        }
    }
  3. From the CardAcquisitionResponse, get the details that you need for your use case.

    Parameter Usage
    POIData.POITransactionID If you are going to continue with a payment, you need to keep the TimeStamp and TransactionID, because you need to specify these card acquisition details in your payment request.
    PaymentInstrumentData.CardData Includes:
    • CardCountryCode: The three-digit code of the issuer country. This parameter is included if you enabled receiving the issuer country.
    • PaymentToken.TokenValue: The card alias. You can use this to identify the shopper based on their card, but not to make payments. This parameter is included if you specified a TokenRequestedType of Customer in the request.
    Response.AdditionalResponse Additional transaction data that you may need in your use case. You'll receive either a string of form-encoded key-value pairs or a Base64 string that you need to decode to get a JSON object.
    Data that you may need:
    • alias: The card alias, to identify the shopper based on their card.
    • PaymentAccountReference: If the shopper used an NFC wallet, you can use this instead of the alias. (Not present for card payments.)
    • cardBin and issuerCountry: Data to determine eligibility for tax free shopping.
    • shopperReference and shopperEmail: For use in loyalty use cases.
    • giftcardIndicator: If true, indicates the shopper presented a gift card.

    If the AdditionalResponse doesn't include the details you were expecting, you may need to enable receiving those details. Refer to Card and shopper identifiers.

    As an example, the AdditionalResponse from the above CardAcquisitionResponse contains:

    tid=46403161
    transactionType=GOODS_SERVICES
    backendGiftcardIndicator=false
    posadditionalamounts.originalAmountValue=1698
    expiryYear=2028
    alias=M469509594859802
    posAmountGratuityValue=0
    giftcardIndicator=false
    paymentMethodVariant=mc
    txtime=13%3a22%3a59
    iso8601TxDate=2021-03-05T12%3a22%3a59.0000000%2b0000
    cardType=mc
    posOriginalAmountValue=1698
    aliasType=Default
    txdate=05-03-2021
    paymentMethod=mc
    merchantReference=369
    expiryMonth=02
    cardSummary=9999
    posadditionalamounts.originalAmountCurrency=EUR
    posAuthAmountCurrency=EUR
    message=CARD_ACQ_COMPLETED
    cardIssuerCountryId=528
    posAmountCashbackValue=0
    posEntryMode=CLESS_CHIP
    fundingSource=CREDIT
    issuerCountry=NL
    cardScheme=mc
    cardBin=541333
    posAuthAmountValue=1698

Continue with a payment

Depending on your use case, you may want to complete the card acquisition flow with a payment. To do so, the payment request must include a reference to the card acquisition.

  1. Make a POST request to a Terminal API endpoint, specifying:

    • PaymentRequest: The request body with:

      Parameter Required Description
      SaleData.SaleTransactionID -white_check_mark- An object with:
      • TransactionID: Your unique reference for this request.
      • TimeStamp: Date and time of the request in UTC format.
      SaleData.SaleToAcquirerData Depending on your use case, you may need to specify tender options or additional data here, or a flag for tax free shopping.
      PaymentTransaction.AmountsReq -white_check_mark- An object with:
      • Currency: The transaction currency.
      • RequestedAmount: The final transaction amount.
      PaymentData.CardAcquisitionReference -white_check_mark- An object referring to the card acquisition:
      • TimeStamp: The timestamp returned in the POIData.POITransactionID of the card acquisition response.
      • TransactionID: The transaction ID returned in the POIData.POITransactionID of the card acquisition response.

    Here is how you would make a payment referring to a card acquisition that had a TimeStamp of 2021-03-05T12:22:59.000Z and a TransactionID of 8ha5001614946979000.

    {
       "SaleToPOIRequest":{
          "MessageHeader":{
             "ProtocolVersion":"3.0",
             "MessageClass":"Service",
             "MessageCategory":"Payment",
             "MessageType":"Request",
             "SaleID":"POSSystemID12345",
             "ServiceID":"2020711110",
             "POIID":"V400m-346403161"
          },
          "PaymentRequest":{
             "SaleData":{
                "SaleTransactionID":{
                   "TransactionID":"899",
                   "TimeStamp":"2021-03-05T12:23:44.684Z"
                }
             },
             "PaymentTransaction":{
                "AmountsReq":{
                   "Currency":"EUR",
                   "RequestedAmount":16.98
                }
             },
             "PaymentData":{
                "CardAcquisitionReference":{
                   "{hint:From the POITransactionID of the card acquisition}TimeStamp{/hint}":"2021-03-05T12:22:59.000Z",
                   "{hint:From the POITransactionID of the card acquisition}TransactionID{/hint}":"8ha5001614946979000"
                }
             }
          }
       }
    }
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String saleID = "YOUR_CASH_REGISTER_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.PAYMENT );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setServiceID(serviceID);
    messageHeader.setSaleID(saleID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    PaymentRequest paymentRequest = new PaymentRequest();
    SaleData saleData = new SaleData();
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTransactionID(transactionID);
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleData.setSaleTransactionID(saleTransactionID);
    paymentRequest.setSaleData(saleData);
    
    PaymentTransaction paymentTransaction = new PaymentTransaction();
    AmountsReq amountsReq = new AmountsReq();
    amountsReq.setCurrency("EUR");
    amountsReq.setRequestedAmount( BigDecimal.valueOf(16.98) );
    paymentTransaction.setAmountsReq(amountsReq);
    paymentRequest.setPaymentTransaction(paymentTransaction);
    
    PaymentData paymentData = new PaymentData();
    TransactionIdentification cardAcquisitionReference = new TransactionIdentification();
    cardAcquisitionReference.setTransactionID(transactionID);
    cardAcquisitionReference.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    paymentData.setCardAcquisitionReference(cardAcquisitionReference);
    paymentRequest.setPaymentData(paymentData);
    saleToPOIRequest.setPaymentRequest(paymentRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
  2. In the PaymentResponse note the following:

    • PaymentInstrumentData.CardData: The same card details that you received in the card acquisition response.
    • Response.AdditionalResponse: Additional transaction data, including the same details that you received in the card acquisition response. You'll receive either a string of form-encoded key-value pairs or a Base64 string that you need to decode to get a JSON object.
    Payment response
    {
      "SaleToPOIResponse": {
        "PaymentResponse": {
          "POIData": {...},
          "SaleData": {...},
          "PaymentReceipt": [...],
          "PaymentResult": {
            "AmountsResp": {
              "AuthorizedAmount": 16.98,
               "Currency": "EUR"
            },
            ...
            "PaymentInstrumentData": {
              "CardData": {
                "CardCountryCode": "826",
                "EntryMode": [
                  "Contactless"
                ],
                "MaskedPan": "541333 **** 9999",
                "PaymentBrand": "mc",
                "SensitiveCardData": {
                  "CardSeqNumb": "33",
                  "ExpiryDate": "0228"
                }
              },
              "PaymentInstrumentType": "Card"
            }
          },
          "Response": {
            "AdditionalResponse": "tid=46403161&AID=A000000004101001&transactionType=GOODS_SERVICES&backendGiftcardIndicator=false&posadditionalamounts.originalAmountValue=1698&expiryYear=2028&alias=M469509594859802&posAmountGratuityValue=0&giftcardIndicator=false&pspReference=9914734158490050&paymentMethodVariant=mc&batteryLevel=100%25&applicationPreferredName=mc%20en%20gbr%20gbp&store=StoreOne&txtime=13%3a23%3a46&iso8601TxDate=2021-03-05T12%3a23%3a46.0000000%2b0000&cardType=mc&posOriginalAmountValue=1698&offline=false&aliasType=Default&txdate=05-03-2021&paymentMethod=mc&startYear=2017&tc=FA13E605EE521667&cardIssueNumber=33&mid=1000&merchantReference=899&transactionReferenceNumber=9914734158490050&expiryMonth=02&cardSummary=9999&posadditionalamounts.originalAmountCurrency=EUR&posAuthAmountCurrency=EUR&cardHolderVerificationMethodResults=1F0302&cardIssuerCountryId=826&adjustAuthorisationData=BQABAQAMGo8BEaAMaNcBTGTHMTvXOdf7UbVZeYkBUCArY2Kem%2fu4oaTz4nBLiHBOBxsHvhGkdMy6qPnoJPWQAu2qgn9VDfHqaLvszJ9niBI7%2bCcW1n7mc7WyUXqI%2bXddD4iH5SQzeydVNs72fqjoBDm7TFnYy6FyVMQcROqWdTdOqbInN7e279CYf3Bg4XlRUdtWgkGwQEn%2bmmCPljvpqNY1HhWae61CKujEIpJl%2bOHvKSdQ0EUPjhABf12Knyo74XorVCUKS2eCg44lodVmz%2bXiQMgeTwnpAYOniVrOmuks5UFim0OM9NzuzYG1J3s76UMuIk43U4V0wQgdgrH%2fJMzmW61gEK42LACWgN%2fNLjLEa360kI0AAD%2fLAxXIzw9f11GbftqiweIehsMmoYRHqPO5CQseMVtRrE7zCV2FQSDYwGIH9MUKh%2fyiGYpB34tlRYT3GLOOK3Bp3GQfHSaChyTQEXHpvwR8Wd1rEWQDTIsLQawvK3W05uQZpSU%2bXbzoJy3txW0f2nlo91j%2fVRQR%2fBkQhiqT05uVHBldzQA%2bamjAcsHlRjJKgsGFIA4hKdeHIk6s5W3kfidbXMJDtue54gnKGXN1yvoblE5NLmQXBAHKx2eFvYxufLvB3om6AJD5ISc4XQLqE1vY3J%2bh%2bViBvsLRERSB3tij7fd3G%2bH5WtE6L%2b1dzs1MpZgSEWGVAfshmZ456jBlTJ2kFL%2bmE%2fHb462q1wFeXKIo8Llhi1tx%2b%2b0is7Z34%2bFuAMxSioaPUsle3Y9a%2b2J1ZhribRKBcZlSUlWiuXmlo%2fUSmeERC%2fiztpYs3%2fjdlbdO6Mkq3GlphRIQFwcR8fDvlygb&posAmountCashbackValue=0&posEntryMode=CLESS_CHIP&startMonth=01&fundingSource=CREDIT&issuerCountry=GB&cardScheme=mc&cardBin=541333&posAuthAmountValue=1698",
            "Result": "Success"
          }
        },
        "MessageHeader": {...}
      }
    }

Continue with a cancellation

Depending on your use case, you may want to stop the card acquisition flow after you have received the response. For this, you make an EnableServiceRequest to abort the transaction. The terminal then discards the acquired card data.

  1. Make a POST request to a Terminal API endpoint, specifying:

    • EnableServiceRequest : The request body with:

      Parameter Required Description
      TransactionAction -white_check_mark- AbortTransaction.
      DisplayOutput Optional object to show your own message and an 'Approved' icon (green check mark) or a 'Declined' icon (red cross).

    The next example is the basic request, without DisplayOutput object, to end the card acquisition flow with a cancellation. The terminal will show Canceled, a red cross , and Transaction canceled.

    Basic request to cancel the card acquisition data
    {
       "SaleToPOIRequest":{
          "MessageHeader":{
             "ProtocolVersion":"3.0",
             "MessageClass":"Service",
             "MessageCategory":"EnableService",
             "MessageType":"Request",
             "ServiceID":"3020711110",
             "SaleID":"POSSystemID12345",
             "POIID":"V400m-346403161"
          },
          "EnableServiceRequest":{
             "TransactionAction":"AbortTransaction"
          }
       }
    }

    Show your own message

    To show your own message when ending the card acquisition with a cancellation, extend your EnableServiceRequest with a DisplayOutput object containing:

    Parameter Required Description
    Device -white_check_mark- CustomerDisplay
    InfoQualify -white_check_mark- Display
    OutputContent.PredefinedContent.ReferenceID -white_check_mark- Icon to show:
    • Accepted: Green check mark.
    • AcceptedAnimated: Animated green check mark.
    • Declined: Red cross.
    • DeclinedAnimated: Animated red cross.
    • Idle: No icon.
    .
    OutputContent.OutputFormat -white_check_mark- Text
    OutputContent.OutputText -white_check_mark- An array with one or two Text objects containing header and footer text. Provide empty values if you don't want to show text.

    The following example will show Welcome!, an animated green check mark -white_check_mark-, and We logged your arrival time.

    Cancellation using a custom message
    {
       "SaleToPOIRequest":{
          "MessageHeader":{
             "ProtocolVersion":"3.0",
             "MessageClass":"Service",
             "MessageCategory":"EnableService",
             "MessageType":"Request",
             "ServiceID":"3020711110",
             "SaleID":"POSSystemID12345",
             "POIID":"V400m-346403161"
          },
          "EnableServiceRequest":{
             "TransactionAction":"AbortTransaction",
             "DisplayOutput":{
                "Device":"CustomerDisplay",
                "InfoQualify":"Display",
                "OutputContent":{
                   "PredefinedContent":{
                      "ReferenceID":"AcceptedAnimated"
                   },
                   "OutputFormat":"Text",
                   "OutputText":[
                      {
                         "Text":"Welcome!"
                      },
                      {
                         "Text":"We logged your arrival time"
                      }
                   ]
                }
             }
          }
       }
    }
  2. If the card acquisition data is successfully cancelled, you receive an EnableServiceResponse that contains:

    • Response.Result: Success
    Response for cancelling the card acquisition data
    {
      "SaleToPOIResponse":{
        "EnableServiceResponse":{
          "Response":{
            "Result":"Success"
          }
        },
        "MessageHeader":{
          "ProtocolVersion":"3.0",
          "SaleID":"POSSystemID12345",
          "MessageClass":"Service",
          "MessageCategory":"EnableService",
          "ServiceID":"3020711110",
          "POIID":"V400m-346403161",
          "MessageType":"Response"
        }
      }
    }

Should you try to make a payment with a CardAcquisitionReference referring to the completed card acquisition that you cancelled, the payment will fail with a message Validation failed: No prior card acquisition data available.

Cancelling an in-progress card acquisition

By making an AbortRequest from your cash register, you can cancel a card acquisition before you receive a response, while the terminal is prompting the shopper to present their card.

  1. Make a POST request to a Terminal API endpoint, specifying:

    • AbortRequest: The request body with:

      Parameter Required Description
      AbortReason -white_check_mark- MerchantAbort
      MessageReference -white_check_mark- An object with:
      • MessageCategory: CardAcquisition
      • SaleID: Your unique ID of the cash register that made the payment request.
      • ServiceID: The ServiceID of the card acquisition request being cancelled.

    For more details see the AbortRequest API reference.

    The example below shows how you would make a request to cancel an in-progress card acquisition with a ServiceID of 21796.

    AbortRequest to cancel an in-progress CardAcquisitionRequest
    {
      "SaleToPOIRequest":{
        "MessageHeader":{
          "ProtocolVersion":"3.0",
          "MessageClass":"Service",
          "MessageCategory":"Abort",
          "MessageType":"Request",
          "SaleID":"POSSystemID12345",
          "ServiceID":"29239",
          "POIID":"V400m-324688179"
        },
        "AbortRequest":{
          "AbortReason":"MerchantAbort",
          "MessageReference":{
            "MessageCategory":"CardAcquisition",
            "SaleID":"POSSystemID12345",
            "ServiceID":"21796"
          }
        }
      }
    }

    A successful AbortRequest returns a response with a 200 OK HTTP status code and no body.

  2. Check whether cancelling was successful:

    • The Present card prompt generated by your CardAcquisitionRequest disappears from the terminal display.
    • You receive a CardAcquisitionResponse containing:
      • Result: Failure
      • ErrorCondition: Aborted

    The following example shows the response for a card acquisition that was cancelled before it was completed.

    CardAcquisitionResponse after cancelling before completion
    {
        "SaleToPOIResponse": {
            "CardAcquisitionResponse": {
                "POIData": {
                    "POITransactionID": {
                        "TimeStamp": "2020-11-04T18:44:11.000Z",
                        "TransactionID": "8ha5001604515451028"
                    },
                    "POIReconciliationID": "1000"
                },
                "SaleData": {
                    "SaleTransactionID": {
                        "TimeStamp": "2020-11-04T18:44:11.022Z",
                        "TransactionID": "152"
                    }
                },
                "Response": {
                    "Result": "Failure",
                    "AdditionalResponse": "refusalReason=104%20Merchant%20cancelled%20tx...",
                    "ErrorCondition": "Aborted"
                }
            },
            "MessageHeader": {
                "ProtocolVersion": "3.0",
                "SaleID": "POSSystemID12345",
                "MessageClass": "Service",
                "MessageCategory": "CardAcquisition",
                "ServiceID": "21796",
                "POIID": "V400m-346403161",
                "MessageType": "Response"
            }
        }
    }

See also