---
title: "Manual Key Entry (MKE)"
description: "Manually enter card details to make a payment."
url: "https://docs.adyen.com/point-of-sale/enter-payment-manually"
source_url: "https://docs.adyen.com/point-of-sale/enter-payment-manually.md"
canonical: "https://docs.adyen.com/point-of-sale/enter-payment-manually"
last_modified: "2026-04-08T09:54:00+02:00"
language: "en"
---

# Manual Key Entry (MKE)

Manually enter card details to make a payment.

[View source](/point-of-sale/enter-payment-manually.md)

##### Standalone terminals

If the terminal is not integrated with a POS system, see [Use a standalone terminal](/point-of-sale/standalone/standalone-use#mke) for instructions to enter the card number by hand.

Manual key entry (MKE) involves manually typing the details from a shopper's card on the payment terminal. You can use this when the payment terminal fails to obtain the card details from the card's chip or magnetic stripe.

It is important to note that there is no liability shift with MKE. This means you are fully liable for [fraud chargebacks](/point-of-sale/what-we-support/payment-methods#pos-chargebacks).

## Requirements

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

| Requirement          | Description                                                                                                                                                                                                                                             |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type** | A [Terminal API](/point-of-sale/basic-tapi-integration/) integration with payment terminals.                                                                                                                                                            |
| **Limitations**      | Take into account the following limitations:- Manual Key Entry (MKE) is not supported for virtual credit cards on the Japan Card Network (JCB). Use the [MOTO flow](/point-of-sale/mail-and-telephone-order-moto) instead.                              |
| **Setup steps**      | Before you begin,- Contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) to enable Manual Key Entry.
- [Set a maximum transaction amount](#configure-mke) that the terminal will allow for an MKE transaction. |

## How it works

After MKE is enabled:

1. When the payment terminal cannot read the card details, you [start an MKE transaction](#request) from your POS app.
2. The terminal asks the shopper to manually enter their card number and expiry date.
3. The terminal then asks the shopper to provide their signature on the display.
4. The transaction continues.

## Set maximum MKE transaction amount

Because of the increased risk of chargebacks, you need to set a maximum transaction amount for MKE transactions.

1. Log in to your [Customer Area](https://ca-test.adyen.com/).
2. Optional. Select the merchant account or store where you want to configure settings.
3. Go to **In-person payments** > **Terminal settings** (or select a specific terminal) and select **Payment features**.
4. Enter the **MKE max amount**.
5. Select **Save**.

## Make an MKE payment

With a Terminal API integration, proceed as follows to force MKE as the [card entry mode](/get-started-with-adyen/adyen-glossary/#point-of-sale-entry-mode) in your Terminal API payment request:

1. [Make a payment request](/point-of-sale/basic-tapi-integration/make-a-payment) including:

   * The [TransactionConditions](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment#request-PaymentTransaction-TransactionConditions) object with:

     | Parameter        | Required                                                                                    | Description              |
     | ---------------- | ------------------------------------------------------------------------------------------- | ------------------------ |
     | `ForceEntryMode` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Use the value **Keyed**. |

   #### JSON

   ```json
   {
       "SaleToPOIRequest":{
           "MessageHeader":{
               "ProtocolVersion":"3.0",
               "MessageClass":"Service",
               "MessageCategory":"Payment",
               "MessageType":"Request",
               "ServiceID":"037",
               "SaleID":"POSSystemID12345",
               "POIID":"P400Plus-275040702"
           },
           "PaymentRequest":{
               "SaleData":{
                   "SaleToAcquirerData":"",
                   "SaleTransactionID":{
                       "TransactionID":"8377PME_POS",
                       "TimeStamp":"2021-01-19T11:03:39.000Z"
                   }
               },
               "PaymentTransaction":{
                   "AmountsReq":{
                       "RequestedAmount":17.50,
                       "Currency":"EUR"
                   },
                   "TransactionConditions":{
                       "ForceEntryMode":[
                           "Keyed"
                       ]
                   }
               }
           }
       }
   }
   ```

   #### Java

   ```java
   String POIID = "YOUR_TERMINAL_ID";
   String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
   String saleID = "YOUR_CASH_REGISTER_ID";
   String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";

   SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
   MessageHeader messageHeader = new MessageHeader();
   messageHeader.setPOIID(POIID);
   messageHeader.setMessageClass( MessageClassType.SERVICE );
   messageHeader.setMessageType( MessageType.REQUEST );
   messageHeader.setProtocolVersion("3.0");
   messageHeader.setServiceID(serviceID);
   messageHeader.setSaleID(saleID);
   messageHeader.setMessageCategory( MessageCategoryType.PAYMENT );
   saleToPOIRequest.setMessageHeader(messageHeader);

   PaymentRequest paymentRequest = new PaymentRequest();
   PaymentTransaction paymentTransaction = new PaymentTransaction();
   AmountsReq amountsReq = new AmountsReq();
   amountsReq.setRequestedAmount( BigDecimal.valueOf(17.5) );
   amountsReq.setCurrency("EUR");
   paymentTransaction.setAmountsReq(amountsReq);

   TransactionConditions transactionConditions = new TransactionConditions();
   transactionConditions.getForceEntryMode().add( ForceEntryModeType.KEYED );
   paymentTransaction.setTransactionConditions(transactionConditions);
   paymentRequest.setPaymentTransaction(paymentTransaction);

   SaleData saleData = new SaleData();
   saleData.setSaleToAcquirerData("");
   TransactionIdentification saleTransactionID = new TransactionIdentification();
   saleTransactionID.setTransactionID(transactionID);
   saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
   saleData.setSaleTransactionID(saleTransactionID);
   paymentRequest.setSaleData(saleData);
   saleToPOIRequest.setPaymentRequest(paymentRequest);
   terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
   ```

2. In the response, note that the `PaymentResult` includes:

   * `AuthenticationMethod`: **SignatureCapture**.
   * `CapturedSignature`: coordinate points of the signature drawn on the terminal display.
   * `PaymentInstrumentData.CardData`: indicates the `EntryMode` was **Keyed**.

   The `AdditionalResponse` also shows the `posEntryMode` was **MKE**.

   **MKE response**

   ```json
   {
       "SaleToPOIResponse": {
           "MessageHeader": {...},
           "PaymentResponse": {
               "POIData": {...}
               },
               "PaymentReceipt": [...],
               "PaymentResult": {
                   "AmountsResp": {...},
                   "AuthenticationMethod": [
                       "SignatureCapture"
                   ],
                   "CapturedSignature": {
                       "AreaSize": {
                           "X": "100",
                           "Y": "FB"
                       },
                       "SignaturePoint": [
                           {
                               "X": "2D",
                               "Y": "FB"
                           },
                           {
                               "X": "32",
                               "Y": "FB"
                           },
                           ...
                       ]
                   },
                   "OnlineFlag": true,
                   "PaymentAcquirerData": {...},
                   "PaymentInstrumentData": {
                       "CardData": {
                           "CardCountryCode": "840",
                           "EntryMode": [
                               "Keyed"
                           ],
                           "MaskedPan": "415150 **** 0008",
                           "PaymentBrand": "visa",
                           "SensitiveCardData": {
                               "ExpiryDate": "0330"
                           }
                       },
                       "PaymentInstrumentType": "Card"
                   }
               },
               "Response": {
                   "AdditionalResponse": "...posEntryMode=MKE...",
                   "Result": "Success"
               },
               "SaleData": {
                   "SaleTransactionID": {...}
               }
           }
       }
   }
   ```

## Risk management

You can use our [risk management](/point-of-sale/risk-management-pos) system to minimize fraud by applying risk rules before processing a transaction. Based on your risk settings, every transaction gets a risk score ranging from 0 to 100 and is declined when the risk score reaches 100.

## See also

* [Chargeback risk](/point-of-sale/what-we-support/payment-methods#pos-chargebacks)
* [Risk management for point of sale](/point-of-sale/risk-management-pos)
* [MKE on standalone terminals](/point-of-sale/standalone/standalone-use#mke)
