---
title: "Ask for a signature"
description: "Use an input request to ask a shopper to provide their signature."
url: "https://docs.adyen.com/point-of-sale/shopper-engagement/shopper-input/signature"
source_url: "https://docs.adyen.com/point-of-sale/shopper-engagement/shopper-input/signature.md"
canonical: "https://docs.adyen.com/point-of-sale/shopper-engagement/shopper-input/signature"
last_modified: "2026-06-01T15:33:14+02:00"
language: "en"
---

# Ask for a signature

Use an input request to ask a shopper to provide their signature.

[View source](/point-of-sale/shopper-engagement/shopper-input/signature.md)

Here we describe how you can use an input request to show a prompt on the payment terminal asking the shopper to confirm something by drawing their signature on the display.

## Requirements

Before you begin, take into account the following requirement.

| Requirement          | Description                                                                      |
| -------------------- | -------------------------------------------------------------------------------- |
| **Integration type** | A [Terminal API integration](/point-of-sale/get-started) with payment terminals. |

## How it works

When you use a **GetSignature** `InputRequest`, the terminal prompts the shopper to confirm something by drawing their signature on the display. The terminal continues to show your input request until one of these events occurs:

* The user has provided input.
* The maximum input time expires. You can set this time in the request.
* On the terminal, **Cancel** **![](/images/5/8/8/4/9/58849deb729ef765fb92c34a2b367b9ae58a5598-cancel2x.png)** is selected.
* The terminal receives a [request to cancel collecting input](/point-of-sale/shopper-engagement/shopper-input/cancel-input) or any other request from the POS app.

### Examples

The following illustrations show a signature screen on a portrait, small portrait, and landscape display. Using the on-screen buttons, the shopper can clear or confirm their signature.

![](/images/2/6/f/0/8/26f085e3f8af136f3c14bf9a2711ef2d96167bb8-screen-engetsignatureportrait.png)

![](/images/5/f/1/b/a/5f1ba80676563bc147e4abb46f6f31b511337976-screen-engetsignatureportrait-small.png)

![](/images/e/8/9/5/f/e895f5255dbbaea8fb484b3c7af78e2d2d1a5860-screen-engetsignaturelandscape.png)

## Make a Signature input request

To use the payment terminal to ask a shopper to provide their signature:

1. Make a [Terminal API](/point-of-sale/design-your-integration/terminal-api) input request, specifying:

   * The standard [`SaleToPOIRequest.MessageHeader` ](/point-of-sale/design-your-integration/terminal-api#request-message-header)object, with `MessageClass` set to **Device** and `MessageCategory` set to **Input**.

     | 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-") | **Device**                                                                                                                                                  |
     | `MessageCategory` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Input**                                                                                                                                                   |
     | `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 system where you 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 [InputRequest.DisplayOutput](https://docs.adyen.com/api-explorer/terminal-api/latest/post/input#request-DisplayOutput) object to define what is shown on the terminal:

     | Parameter                                     | Description                                                                                                                                                                                                                                                                                                                                                         |
     | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
     | `Device`                                      | **CustomerDisplay**                                                                                                                                                                                                                                                                                                                                                 |
     | `InfoQualify`                                 | **Display**                                                                                                                                                                                                                                                                                                                                                         |
     | `OutputContent.OutputFormat`                  | **Text**                                                                                                                                                                                                                                                                                                                                                            |
     | `OutputContent.PredefinedContent.ReferenceID` | **GetSignature**                                                                                                                                                                                                                                                                                                                                                    |
     | `OutputContent.OutputText`                    | An array of two `Text` fields containing your own text to show on the terminal:1) The header. On a portrait display, this is limited to about 20 characters.
     2) Use an empty value, or specify additional text. On M400, e280, and e285 terminals terminals, additional text is ignored, but you still need to include the second `Text` field with an empty value. |

   - The [InputRequest.InputData](https://docs.adyen.com/api-explorer/terminal-api/latest/post/input#request-InputData) object to handle the user input:

     | Parameter      | Description                                                                               |
     | -------------- | ----------------------------------------------------------------------------------------- |
     | `Device`       | **CustomerInput**                                                                         |
     | `InfoQualify`  | **Input**                                                                                 |
     | `InputCommand` | **GetConfirmation**                                                                       |
     | `MaxInputTime` | (Integer) Time-out in seconds. This is the time that the user gets to finish their input. |

   The following example asks the shopper for their signature.

   #### JSON

   ```json
   {
       "SaleToPOIRequest":{
           "MessageHeader":{
               "ProtocolVersion":"3.0",
               "MessageClass":"Device",
               "MessageCategory":"Input",
               "MessageType":"Request",
               "ServiceID":"0207111104",
               "SaleID":"POSSystemID12345",
               "POIID":"V400m-324688179"
           },
           "InputRequest":{
               "DisplayOutput":{
                   "Device":"CustomerDisplay",
                   "InfoQualify":"Display",
                   "OutputContent":{
                       "OutputFormat":"Text",
                       "PredefinedContent":{
                           "ReferenceID":"GetSignature"
                       },
                       "OutputText":[
                           {
                               "Text":"Please sign"
                           },
                           {
                               "Text":""
                           }
                       ]
                   }
               },
               "InputData":{
                   "Device":"CustomerInput",
                   "InfoQualify":"Input",
                   "InputCommand":"GetConfirmation",
                   "MaxInputTime":30
               }
           }
       }
   }
   ```

   #### Java

   ```java
   SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
   MessageHeader messageHeader = new MessageHeader();
   saleToPOIRequest.setMessageHeader(messageHeader);

   InputRequest inputRequest = new InputRequest();
   DisplayOutput displayOutput = new DisplayOutput();
   displayOutput.setDevice( DeviceType.CUSTOMER_DISPLAY );
   displayOutput.setInfoQualify( InfoQualifyType.DISPLAY );
   OutputContent outputContent = new OutputContent();
   outputContent.setOutputFormat( OutputFormatType.TEXT );
   PredefinedContent predefinedContent = new PredefinedContent();
   predefinedContent.setReferenceID("GetSignature");
   outputContent.setPredefinedContent(predefinedContent);

   OutputText title = new OutputText();
   title.setText("Please sign");
   OutputText additionalText = new OutputText();
   additionalText.setText("");
   outputContent.getOutputText().add(title);
   outputContent.getOutputText().add(additionalText);
   outputContent.getOutputText().add(declineAnswer);
   outputContent.getOutputText().add(agreeAnswer);
   displayOutput.setOutputContent(outputContent);
   inputRequest.setDisplayOutput(displayOutput);

   InputData inputData = new InputData();
   inputData.setDevice( DeviceType.CUSTOMER_INPUT );
   inputData.setInfoQualify( InfoQualifyType.INPUT );
   inputData.setInputCommand( InputCommandType.GET_CONFIRMATION );
   inputData.setMaxInputTime( BigInteger.valueOf(30) );
   inputRequest.setInputData(inputData);
   saleToPOIRequest.setInputRequest(inputRequest);
   terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
   ```

2. Wait for the user to supply the requested input.

   The input is not validated against a format.

   If input is received from the terminal, the input response includes an [InputResult](https://docs.adyen.com/api-explorer/terminal-api/latest/post/input#responses-200-InputResult) object with:

   * `Response.AdditionalResponse`: The signature provided by the shopper.
   * `Input.ConfirmedFlag`: **true** indicates the shopper confirmed their agreement by selecting **Confirm** **![](/images/6/9/3/7/8/6937831b6e8ba90eddeddde32c67f49162760228-confirm2x.png)**.
   * `Input.ConfirmedFlag`: **false** means the shopper declined by selecting **Cancel** **![](/images/5/8/8/4/9/58849deb729ef765fb92c34a2b367b9ae58a5598-cancel2x.png)**.

   **Example response when the shopper confirmed**

   ```json
   {
     "SaleToPOIResponse": {
       "InputResponse": {
         "InputResult": {
           "Device": "CustomerInput",
           "InfoQualify": "Input",
           "Response": {
             "Result": "Success",
             "AdditionalResponse": "responseData=%7b%20%22signature%22%3a%20%7b%20%22data...%22signature_format%22%3a%20%22raw%22%20%7d%20%7d"
           },
           "Input": {
             "ConfirmedFlag": true,
             "InputCommand": "GetConfirmation"
           }
         },
         "OutputResult": {
           "Device": "CustomerDisplay",
           "InfoQualify": "Display",
           "Response": {
             "Result": "Success"
           }
         }
       },
       "MessageHeader": {...}
     }
   }
   ```

   * If the input request times out, the `InputResult.Response` has `AdditionalResponse`: **message=Screen%20timeout**, `Result`: **Failure**, and `ErrorCondition`: **Cancel**.

   * If you make a payment request while the input request is waiting for input on the terminal, the payment request overrides the input request. The `InputResult.Response` has `AdditionalResponse`: **message=A%20higher%20priority%20request%20has%20been%20received**, `Result`: **Failure**, and `ErrorCondition`: **Busy**.

3. Pass the relevant data from `InputResult.Input` to your system for validation and further use.

## See also

* [Cancel an input request](/point-of-sale/shopper-engagement/shopper-input/cancel-input)
* [Ask for another type of input](/point-of-sale/shopper-engagement/shopper-input/select-input-request)
* [Create a session](/point-of-sale/shopper-engagement/create-session)
