---
title: "Custom cards"
description: "Use our payment terminals to read cards that are not compliant with PCI DSS."
url: "https://docs.adyen.com/point-of-sale/custom-cards"
source_url: "https://docs.adyen.com/point-of-sale/custom-cards.md"
canonical: "https://docs.adyen.com/point-of-sale/custom-cards"
last_modified: "2023-12-13T14:33:00+01:00"
language: "en"
---

# Custom cards

Use our payment terminals to read cards that are not compliant with PCI DSS.

[View source](/point-of-sale/custom-cards.md)

You can use Adyen payment terminals to read your own custom cards, such as employee benefit cards, and send the data to your POS system. You can then process transactions with that card through the issuer of your custom cards.

## Requirements

Before you begin, take into account the following requirements, limitations, and preparations.

| Requirement          | Description                                                                                                                                                                  |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type** | A [Terminal API integration](/point-of-sale/basic-tapi-integration/) with payment terminals.                                                                                 |
| **Limitations**      | Only custom cards with a magnetic stripe are supported.                                                                                                                      |
| **Setup steps**      | Before you begin, ask our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) to enable reading custom cards on your Adyen payment terminals. |

## How it works

1. You make a card acquisition request.

2. On the terminal, the shopper swipes the card.

   The only entry method for custom cards is **Swipe**.

3. You receive the card data in the card acquisition response.

4. You pass the data from the card acquisition response to the card issuer.

5. You send an enable service request to stop the card acquisition flow on the terminal.

## Make a card acquisition request

To read the custom card:

1. Make a [Terminal API](/point-of-sale/design-your-integration/terminal-api) card acquisition 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 **CardAcquisition**.

     | 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-") | **CardAcquisition**                                                                                                                                         |
     | `MessageType`     | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Request**                                                                                                                                                 |
     | `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. |
     | `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.                                                                                      |
     | `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 [CardAcquisitionRequest](https://docs.adyen.com/api-explorer/terminal-api/latest/post/cardacquisition) object with:

     | Parameter                     | Required                                                                                    | Description                                                                                                                                                                                                                                                    |
     | ----------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
     | `SaleData.SaleTransactionID`  | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | An object with:- `TransactionID`: your reference to identify a payment. We recommend using a unique value per payment.
     - `TimeStamp`: date and time of the request in [UTC format](https://en.wikipedia.org/wiki/ISO_8601#Coordinated_Universal_Time_\(UTC\)). |
     | `SaleData.TokenRequestedType` |                                                                                             | **Customer**. Returns the card alias in the `TokenValue` field of the response. Note that the card alias is always returned in the `AdditionalResponse`.                                                                                                       |
     | `CardAcquisitionTransaction`  | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | A required object that can be empty or contain:- `TotalAmount` (optional): The transaction amount. It is allowed to omit this parameter or to specify an initial placeholder amount.                                                                           |

   **Card acquisition request to read a custom card**

   ```json
   {
      "SaleToPOIRequest":{
          "MessageHeader":{
              "ProtocolVersion":"3.0",
              "MessageClass":"Service",
              "MessageCategory":"CardAcquisition",
              "MessageType":"Request",
              "SaleID":"POSSystemID12345",
              "ServiceID":"20207111104",
              "POIID":"V400m-346403161"
          },
          "CardAcquisitionRequest":{
              "SaleData":{
                  "SaleTransactionID":{
                      "TransactionID":"02072",
                      "TimeStamp":"2023-10-18T07:57:045.000Z"
                  },
              },
              "CardAcquisitionTransaction":{
                  "TotalAmount":24.98
              }
          }
      }
   }
   ```

2. When the card acquisition succeeds, you receive a [CardAcquisitionResponse](https://docs.adyen.com/api-explorer/terminal-api/latest/post/cardacquisition#responses-200-Response) with **message=CARD\_ACQ\_COMPLETED** inside `Response.AdditionalResponse`. From the `PaymentInstrumentData.CardData.SensitiveCardData` object, save:

   * `PAN`: The value that uniquely identifies the shopper's card, for example **88154351166602100**.
   * `TrackData.TrackNumb`: The number on the track on the Magstripe that holds the encoded data. The vaalue can be **1**, **2**, or **3**.
   * `TrackData.TrackValue`: The raw value of the Magstripe track information, with the Sentinel values.

   **Card acquisition response**

   ```json
   {
       "SaleToPOIResponse": {
           "CardAcquisitionResponse": {
               "POIData": {
                   "POITransactionID": {
                       "TimeStamp": "2023-10-18T07:57:49.108Z",
                       "TransactionID": "8ha5001614946979000"
               },
               "SaleData": {...}
               },
               "PaymentInstrumentData": {
                   "CardData": {
                       "MaskedPan": "881543 **** 2100",
                       "PaymentBrand": "YOUR_CARD_BRAND",
                       "SensitiveCardData": {
                           "ExpiryDate": "0228"
                           "PAN": "88154351166602100",
                           "TrackData": [
                            {
                             "TrackNumb": 2,
                             "TrackValue": ";88154351166602100=6006491260550218157?>"
                            }
                          ]
                       }
                   },
                   "PaymentInstrumentType": "Card"
               },
               "Response": {
                   "AdditionalResponse": "giftcardIndicator=false&iso8601TxDate=2023-10-18T07%3a45%3a59.261Z&merchantReference=369&message=CARD_ACQ_COMPLETED&paymentMethod=YOUR_CARD_BRAND&posAuthAmountCurrency=EUR&osAuthAmountValue=0&posEntryMode=MSR&posOriginalAmountValue=0&posadditionalamounts.originalAmountCurrency=EUR&tid=52251152&transactionType=GOODS_SERVICES&txdate=18-10-2023&txtime=09%3a45%3a59",
                   "Result": "Success"
               },
               "SaleData": {
                   "SaleTransactionID": {
                       "TimeStamp": "2023-10-18T07:45:59.249Z",
                       "TransactionID": "882"
                   }
               }
           },
           "MessageHeader": {...}
       }
   }
   ```

## Complete the card acquisition

The card acquisition loading screen will continue to show until it times out. To free up the terminal to process other transactions, you need to make an enable service request. This stops the loading screen and the terminal discards the card data.

1. Make a [Terminal API](/point-of-sale/design-your-integration/terminal-api) enable service 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 **EnableService**.

     | 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-") | **EnableService**                                                                                                                                           |
     | `MessageType`     | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Request**                                                                                                                                                 |
     | `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. |
     | `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.                                                                                      |
     | `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 [EnableServiceRequest](https://docs.adyen.com/api-explorer/terminal-api/latest/post/enableservice) object with:

     | Parameter           | Required                                                                                    | Description                                                                                                                                                          |
     | ------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
     | `TransactionAction` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **AbortTransaction**.                                                                                                                                                |
     | `DisplayOutput`     |                                                                                             | [Optional object](/point-of-sale/card-acquisition/#alternative) 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 **![](/images/5/8/8/4/9/58849deb729ef765fb92c34a2b367b9ae58a5598-cancel2x.png)**, and *Transaction canceled*. You can also choose a [custom message](/point-of-sale/card-acquisition/#alternative) on the payment terminal display.

   **Basic request to cancel the card acquisition data**

   ```json
   {
      "SaleToPOIRequest":{
         "MessageHeader":{
            "ProtocolVersion":"3.0",
            "MessageClass":"Service",
            "MessageCategory":"EnableService",
            "MessageType":"Request",
            "ServiceID":"20207111104",
            "SaleID":"POSSystemID12345",
            "POIID":"V400m-346403161"
         },
         "EnableServiceRequest":{
            "TransactionAction":"AbortTransaction"
         }
      }
   }
   ```

## See also

* [Card acquisition](/point-of-sale/card-acquisition)
* [Gift cards and other stored value cards](/point-of-sale/gift-cards-terminal-api)
