---
updatedAt: 2026-09-23T11:09:54.000Z
agentTools:
  projectIndex: https://docs.sumsub.com/llms.txt
---

# QES integration guide

Start using QES Verification and seamlessly onboard customers in Europe with a single solution.

This article provides a complete guide on how to integrate QES Verification into your verification flows.

# Step 1: Set up implementation

To get started with Qualified Electronic Signature (QES) Verification:

1. [Generate an app token](https://docs.sumsub.com/sumsub/docs/app-tokens) to start using the Sumsub API.
2. [Set up webhooks](https://docs.sumsub.com/sumsub/docs/webhooks) to get verification results. To manage QES verification results, you will need to configure and use the [applicantReviewed](https://docs.sumsub.com/sumsub/docs/user-verification-webhooks#applicantreviewed) webhook.
3. Get started with the SDK implementation, as described in the [web SDK integration](https://docs.sumsub.com/sumsub/docs/get-started-with-web-sdk) article and the [mobile SDK integration](https://docs.sumsub.com/sumsub/docs/mobile-sdk) article.

<Callout icon="📘" theme="info">
  ### Note

  To view and manage your available and active QES Verification products, refer to [this article](https://docs.sumsub.com/sumsub/docs/manage-database-products-and-solutions).
</Callout>

# Step 2: Adjust the user flow

On your new Sumsub Client Dashboard account, you will have access to a pre-configured level that includes both identity verification and document signing. These processes run in sequence, with document signing starting right after identity verification.

## Upload documents for applicant signing

You can upload documents for signing and configure the visibility of signatures in two ways:

* [Via the Sumsub client Dashboard](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#upload-documents-using-the-client-dashboard). With this method, the documents uploaded on the level will be displayed to all applicants for signing.
* [Via the Sumsub API Endpoint](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#upload-documents-using-the-sumsub-api). This method allows you to upload unique documents for each applicant to be signed.

### Upload documents using the client Dashboard

In the Client Dashboard, open the dedicated verification level with the **E-sign** step and upload the documents for signing. Specify the following parameters during the process:

* The number of documents that should be signed.
* Whether the signature should be visually displayed in the document.
* The document page(s) where the signature(s) should be placed.
* The exact position of the signature within the page.
* The size of the displayed signature.

| Level setting        | Description                                                                                   |
| :------------------- | :-------------------------------------------------------------------------------------------- |
| Document upload      | Enables the client to upload a PDF file for user signing.                                     |
| Document name        | Name of the document that will be displayed in the user interface.                            |
| Signature appearance | Whether to display the signature on the document. If not set, the signature is not displayed. |
| Page number          | The page of the signed document on which the signature should be displayed.                   |
| Signature position   | The X & Y axes of the signature position on the selected document page (in PDF units).        |
| Signature width      | The width of the signature on the selected document page (in PDF units).                      |
| Signature height     | The height of the signature on the selected document page (in PDF units).                     |

By default, each signature displayed within the client document(s) will contain the following information:

* Name of the signer.
* Legal basis for Qualified Signature creation.
* Date of the Qualified Signature creation.

<Callout icon="📘" theme="info">
  ### Note

  Both the signature size and positions are specified in PDF units. For example, the A4 page size of 210mm x 297mm = 595 x 842 PDF units.
</Callout>

<Image src="https://files.readme.io/f9b4e513b4b59656e0ae65723ecfc2479730be4a5eb226c2b1f3039473065951-untitled.png" align="center" border={true} />

### Upload documents using the Sumsub API

To upload unique documents for each of your applicants to sign, firstly follow the instructions for [creating an applicant](https://docs.sumsub.com/sumsub/reference/create-applicant). Below is an example of an applicant creation API request:

```curl
curl -X POST \
  'https://api.sumsub.com/resources/applicants?levelName=QES+Verification+(Seamless+ID+Capture)' \
  -H 'Content-Type: application/json' \
  -d '{
          "externalUserId": "someUniqueUserId"
      }'
```

Once the applicant has been created, follow the document uploading and signature placement instructions. Below is an example of a document upload API request:

```curl
curl -X POST \
  "https://api.sumsub.com/resources/applicants/68516cc16724f8f19c7d935f/esign/resources/uploadDoc"  \
  -H 'Content-Type: multipart/form-data' \
  -F 'content=@/path/to/your/file.pdf'  \
  -F 'metadata={
        "imageFileName": "Displayed File Name",
        "signatures": [{
          "pages": [
            {
              "page": 1,
              "x": 400,
              "y": 45,
              "width": 150,
              "height": 45
            },
            {
              "page": 2,
              "x": 400,
              "y": 45,
              "width": 150,
              "height": 45
            }
          ]}
        ]}'
```

<Callout icon="📘" theme="info">
  ### Note

  - You can upload only one document per API request. To upload multiple documents for signing, conduct several API requests.
  - If you do not want the signature to appear in the document, you should not provide `signatures` in the request.
</Callout>

## Configure Email and Phone Verification

[Email and Phone verification](https://docs.sumsub.com/sumsub/docs/email-and-phone-verification) is required both for regulatory compliance and document signing purposes.

There are two primary options for how this can be completed:

1. Clients may choose to verify their users' email and phone number at the initial registration steps and pass this information over to Sumsub via the API. To do so, [create an applicant](https://docs.sumsub.com/sumsub/reference/create-applicant) in advance and share the email and phone attributes in the request body.
   ```curl
   curl -X POST \
     'https://api.sumsub.com/resources/applicants?levelName=QES-IDV' \
     -H 'Content-Type: application/json' \
     -d '{
             "externalUserId": "someUniqueUserId",
             "email": "erika@test.com",
             "phone": "+4912389032156"
         }'
   ```
2. Alternatively, Sumsub can handle these steps for you. To do so, include [Email and Phone verification](https://docs.sumsub.com/sumsub/docs/email-and-phone-verification) steps in your flow.

## Enable AML Screening and Monitoring

[AML Screening and Monitoring](https://docs.sumsub.com/sumsub/docs/aml-screening) helps you check your customers against the following watchlists during the onboarding:

* Sanctions
* PEPs
* Adverse Media
* Regulatory Exposure
* Law Enforcement Actions
* State-owned Enterprises

## Document exchange and signature placement

1. Signature placement configuration:
   * Define the position on the document where the Qualified Signature should appear (for example, the bottom-right corner of the final page).
   * You can configure this via the Sumsub Dashboard.
2. Document types and multi-document signing:
   * Sumsub supports signing multiple documents in a single session. Signed documents are returned to the client through both:
     * [Results Panel](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#get-verification-results-in-dashboard) on the Sumsub Client Dashboard.
     * [Dedicated API endpoint](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#get-verification-results-via-api) for signed document downloads.

# Step 3: Verify identity via Web and Mobile SDKs

Use our Web and Mobile SDK frameworks to conduct QES Verification code-free:

1. [Generate an access token](https://docs.sumsub.com/sumsub/docs/get-started-with-web-sdk#generate-sdk-access-token) associated with the userId (`externalUserId`) and `levelName` used for identity verification.
2. Launch the SDK and conduct identity verification.
3. [Receive and handle](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#step-5-get-verification-results) verification results.

<Callout icon="🚧" theme="warn">
  ### Important

  QES verification is supported only in the WebSDK 2.0 and MobileSDK versions starting from 1.43 or higher.
</Callout>

# Step 4: Listen to webhooks

Once verification is complete, the results are automatically delivered with the [applicantReviewed](https://docs.sumsub.com/sumsub/docs/user-verification-webhooks#applicantreviewed) webhook.

This webhook contains the `reviewResult` object that includes the `reviewAnswer` field, indicating the verification status. If it is GREEN, it means QES Verification successfully completed, and you can [get QES Verification results](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#step-5-get-verification-results). If it is RED, the applicant has not passed verification; the `reviewRejectType` is set to **RETRY** or **FINAL**:

* **FINAL** — indicates a final applicant rejection.
* **RETRY** — applicants are allowed to resubmit their documents and repeat verification.

# Step 5: Get verification results

You can get QES Verification results in either of the following ways:

* [Using the Sumsub Dashboard](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#get-verification-results-in-dashboard)
* [Using the Sumsub API](https://docs.sumsub.com/sumsub/docs/qes-integration-guide#get-verification-results-via-api)

## Get verification results in Dashboard

To view the results of QES Verification in the Dashboard:

1. Navigate to the [Applicants](https://cockpit.sumsub.com/checkus#/applicants/individual) page and open the profile that you need.
2. Scroll down to the **Qualified Electronic Signature** section and review the results.

<Image src="https://files.readme.io/dc1f5ee593c083ee4cebcc8dc9a2eb7331709ccb784dd930a4cabdab7aeac928-Frame_2.png" align="center" width="600px" framed={true} />

## Get verification results via API

To retrieve the results via the Sumsub API, use the [Get E-Sign method](https://docs.sumsub.com/sumsub/reference/get-e-sign-verification-results) according to the request example provided below.

**Request**

```curl
curl -X GET \
  'https://api.sumsub.com/resources/checks/latest?type=E_SIGN&applicantId={applicantId}'
```

**Response**

The response will include detailed personal information that was verified to issue a Qualified Signature and basic details about the signed documents.

```json
{
  "checks": [
    {
      "answer": "GREEN",
      "checkType": "E_SIGN",
      "createdAt": "2024-11-12 10:28:06",
      "id": "1cdf9711-4d50-4659-b82a-a12c330dc797",
      "inputDoc": {
        "idDocType": "PASSPORT",
        "country": "DEU",
        "firstName": "MUSTERMANN",
        "lastName": "ERIKA",
        "validUntil": "2027-02-28",
        "number": "C01XYCCG9",
        "dob": "1964-08-12",
        "email": "erika@test.com",
        "phone": "+4912389032156"
      },
      "esignCheckInfo": {
        "unsignedDocuments": [
          {
            "id": "1672018978",
            "imageId": 1672018978,
            "name": "Terms And Conditions.pdf"
          }
        ],
        "signedDocuments": [
          {
            "id": "1672018978",
            "imageId": 1919960264,  // Use this ID to receive signed document
            "name": "Terms And Conditions.pdf",
            "signedAt": "2024-11-12 10:28:37"
          }
        ]
      }
    }
  ]
}
```

The complete scope of possible applicant output data as a result of successful verification includes:

***

<HTMLBlock>{`
<style>
    .flex-container {
        display: flex;
        gap: 20px;
    }
    .column {
        width: 50%;
    }
</style>

<body>
    <div class="flex-container">
        <div class="column">
            <ul>
                <li>Signed client document(s)</li>
                <li>First name</li>
                <li>Date of birth</li>
                <li>Last name</li>
                <li>Nationality (if available)</li>
                <li>Gender (if available)</li>
                <li>Place of birth</li>
            </ul>
        </div>
        <div class="column">
            <ul>
                <li>Document type</li>
                <li>Document number</li>
                <li>Document issue date</li>
                <li>Document expiration date</li>
                <li>Phone number</li>
                <li>Email attributes</li>
            </ul>
        </div>
    </div>
</body>
`}</HTMLBlock>

***

# Step 6: Receive signed documents

After receiving the QES Verification results, you can obtain the signed documents.

The `signedDocuments` array from the response will include the following information:

* `id` — unique identifier of the signed document in the Sumsub system.
* `imageId` — unique identifier that is used to obtain the signed document.
* `name` — document title that was specified during the document upload in the level settings.
* `signedAt` — date and time when the document was signed.

> Note that there can be several objects in the `signedDocuments` array.

Each signed document will be issued an `imageId`. Submit the ID to the [Get signed documents](https://docs.sumsub.com/sumsub/reference/get-signed-document-qes) API method in order to retrieve the document.

The response will contain a binary content representing the signed document. The `Content-Type` response header precisely describes the response mime-type:

```http
HTTP/1.1 200 OK
Date: Wed, 13 Nov 2024 10:44:38 GMT
Content-Type: application/pdf
Content-Length: 239371
Connection: keep-alive
x-correlation-id: 85e3033ee12d196b8400322e03e47b36
Content-Encoding: identity
content-disposition: attachment; filename=Terms+And+Conditions.pdf
 
<Binary content representing the signed document>
```