# Dashboard

Your central hub for updates, quick links, and key resources — access new features, integrations, and documentation all in one place.

## Release notes

{% hint style="info" %}

14.01.2026

<i class="fa-nfc" style="color:$primary;">:nfc:</i> **NFC support added to SDKs – January 2026**

We’ve added **NFC reading support to our SDKs**, enabling secure chip-based verification for supported identity documents such as biometric passports and IDs.\
With this update, you can read data directly from the document's NFC chip for improved data accuracy. NFC capture can be enabled via configuration and is supported on compatible devices.

<p align="right"><a href="/pages/zp3PlfI2jqthOVkWQNJW#identity-document-verification" class="button primary" data-icon="square-code">Developer guide</a></p>
{% endhint %}

{% hint style="info" %}

25.08.2025

<i class="fa-building-columns" style="color:$primary;">:building-columns:</i>  **KYB now available - August 2025**

We’ve introduced **Know Your Business (KYB)** verification to help you onboard legal entities and organizations with the same flexibility as KYC. You can now create KYB sessions directly through the **API** or configure them seamlessly in the **No-code workflow builder**. This makes it easier than ever to integrate business verification into your processes. &#x20;

<p align="right"> <a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#kyb-know-your-business" class="button secondary" data-icon="square-code">Developer guide</a> <a href="/pages/Vh2KVAtSKWFjwhJLdTBn" class="button primary" data-icon="arrow-progress">Build with no-code</a></p>
{% endhint %}

## **Quick access**

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><mark style="color:$primary;"><strong>Product overview</strong></mark></td><td>Learn what Identomat offers, core features, and how it helps you streamline identity verification.</td><td><a href="/pages/UhDvrEwKiEEkYSQDU29s">/pages/UhDvrEwKiEEkYSQDU29s</a></td></tr><tr><td><mark style="color:$primary;"><strong>Get started</strong></mark></td><td>Step-by-step guide to set up your account, configure roles, and launch your first verification flow.</td><td><a href="/pages/jsSamWGbuqg1PP1VQba9">/pages/jsSamWGbuqg1PP1VQba9</a></td></tr><tr><td><mark style="color:$primary;"><strong>No-code workflow builder</strong></mark></td><td>Easily design and customize verification flows without coding, using drag-and-drop configurations.</td><td><a href="/pages/Vh2KVAtSKWFjwhJLdTBn">/pages/Vh2KVAtSKWFjwhJLdTBn</a></td></tr><tr><td><mark style="color:$primary;"><strong>Video KYC</strong></mark></td><td>Understand how live video identification works for operators and end-users, including compliance controls.</td><td><a href="/pages/qMezYAra47sEuMJsn6z8">/pages/qMezYAra47sEuMJsn6z8</a></td></tr><tr><td><mark style="color:$primary;"><strong>Integration</strong></mark></td><td>Explore different ways to integrate Identomat into your systems — via iframe, redirect, or backoffice.</td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2">/pages/0b9rYxbzZRr3nXjJ1NQ2</a></td></tr><tr><td><mark style="color:$primary;"><strong>API reference</strong></mark></td><td>Full technical reference for Identomat’s REST API with request/response examples.</td><td><a href="/pages/rA1jtXPZQc2eZi7l7nLP">/pages/rA1jtXPZQc2eZi7l7nLP</a></td></tr><tr><td><mark style="color:$primary;"><strong>SDKs</strong></mark></td><td>Mobile and web SDKs (iOS, Android, Flutter, React Native) with setup instructions and changelogs.</td><td><a href="/pages/cPdm6wwmOslG4B8xBhkw">/pages/cPdm6wwmOslG4B8xBhkw</a></td></tr></tbody></table>


# Introduction

Welcome to Identomat's documentation!

***

Identomat is an ID verification & KYC/AML platform for a wide range of business needs, maximizing pass rates without compromising the accuracy, security, or compliance. Whether you're looking to prevent fraud, comply with regulatory requirements, or enhance the customer onboarding experience, our platform offers the tools and flexibility to meet your needs.

### Overview <a href="#overview" id="overview"></a>

Identomat is designed to simplify the identity verification process through a combination of advanced technologies and a user-friendly interface. Our platform supports a wide range of verification methods, including:​​

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td> <mark style="color:$primary;"><strong>Identity document verification</strong></mark></td><td>Automatically verify government-issued IDs, passports, and other documents. Identomat provides truly global coverage by recognizing thousands of ID types from over 165 countries.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#identity-document-verification">/pages/0b9rYxbzZRr3nXjJ1NQ2#identity-document-verification</a></td></tr><tr><td><mark style="color:$primary;"><strong>Liveness check</strong></mark></td><td>Verify the genuine presence of an identity holder with Liveness checks using selfie video with (Active) or without (Passive) prompts.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#liveness-check">/pages/0b9rYxbzZRr3nXjJ1NQ2#liveness-check</a></td></tr><tr><td><mark style="color:$primary;"><strong>AML monitoring</strong></mark></td><td>Screening and ongoing monitoring of customers against thousands of watchlists, sanctions and PEP lists, and adverse media lists.</td><td></td><td><a href="/pages/rA1jtXPZQc2eZi7l7nLP#aml-screening">/pages/rA1jtXPZQc2eZi7l7nLP#aml-screening</a></td></tr><tr><td><mark style="color:$primary;"><strong>Address verification</strong></mark></td><td>Automated OCR and address validation for Proof of Address documents like bank statements, utility bills, etc., combined with location signals from IP &#x26; GPS.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#proof-of-address">/pages/0b9rYxbzZRr3nXjJ1NQ2#proof-of-address</a></td></tr><tr><td><mark style="color:$primary;"><strong>Video KYC</strong></mark></td><td>Single or multi-participant live video call verification with built-in AI-powered full eKYC functionality for Human-in-the-Loop workflows.</td><td></td><td><a href="/pages/qMezYAra47sEuMJsn6z8">/pages/qMezYAra47sEuMJsn6z8</a></td></tr><tr><td><mark style="color:$primary;"><strong>KYC questionnaires</strong></mark></td><td>Configurable solution for capturing necessary information for Customer Due Diligence with custom form builder and answers-based logic.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#user-questionnaire">/pages/0b9rYxbzZRr3nXjJ1NQ2#user-questionnaire</a></td></tr><tr><td><mark style="color:$primary;"><strong>Phone and email verifications</strong></mark></td><td>Verify a prospective customer's email address and phone number via OTP, enriching their profile and adding a layer of account security.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2#phone-number">/pages/0b9rYxbzZRr3nXjJ1NQ2#phone-number</a></td></tr><tr><td><mark style="color:$primary;"><strong>No-code configuration builder</strong></mark></td><td>Seamlessly configure and deploy KYC workflows from ID capture and verification to Proof of Address and AML screening, to human-in-the-loop, and more. </td><td></td><td><a href="/pages/Vh2KVAtSKWFjwhJLdTBn">/pages/Vh2KVAtSKWFjwhJLdTBn</a></td></tr><tr><td><mark style="color:$primary;"><strong>Ease of integration &#x26; customizability</strong></mark></td><td>Our advanced identity verification platform offers configurable workflows, customizable UI/UX, and a modular architecture, with an option to fully white label the solution.</td><td></td><td></td></tr></tbody></table>

With our powerful API and SDKs, you can easily integrate our identity verification services into your existing systems and workflows. We also provide extensive customization options to tailor the verification process to your specific business requirements.

### **Key features of Identomat** <a href="#key-features-of-identomat" id="key-features-of-identomat"></a>

Identomat's modular platform includes:

* Comprehensive KYC/AML feature set&#x20;
* iBeta Level 2 certified Liveness Check&#x20;
* Rapid verification time&#x20;
* Global ID coverage&#x20;
* High conversion rate&#x20;
* Robust deployment options&#x20;
* White label solution

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><mark style="color:$primary;"><strong>100 x</strong></mark></td><td>100x faster account activation compared to manual verification</td><td></td><td></td></tr><tr><td><mark style="color:$primary;"><strong>40 sec</strong></mark> </td><td>Avg. verification time</td><td></td><td></td></tr><tr><td><mark style="color:$primary;"><strong>60%</strong></mark> </td><td>Lower customer abandonment</td><td></td><td></td></tr><tr><td><mark style="color:$primary;"><strong>165+</strong></mark> </td><td>Countries &#x26; Territories</td><td></td><td></td></tr><tr><td><mark style="color:$primary;"><strong>98%</strong></mark> </td><td>Conversion rate</td><td></td><td></td></tr></tbody></table>


# Get started

Create an account and learn how to use and integrate Identomat.

### Start using Identomat

To get started with Identomat, create an account on [manage.identomat.com.](https://manage.identomat.com/) If you already have an account, you can proceed with integration.

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><mark style="color:$primary;"><strong>Account setup</strong></mark></td><td>A detailed guide on how to set up your Identomat account.</td><td></td><td><a href="/pages/26WGHzsWKaqgEjuFYHSI">/pages/26WGHzsWKaqgEjuFYHSI</a></td></tr><tr><td><mark style="color:$primary;"><strong>Integration overview</strong></mark></td><td>Learn how to integrate Identomat with your system.</td><td></td><td><a href="/pages/NCUj9lIsVP0ryHkK2NjU">/pages/NCUj9lIsVP0ryHkK2NjU</a></td></tr></tbody></table>


# Account setup

Create a personal account to get started with Identomat.

### About your personal account

Personal accounts for Identomat are set up on [manage.identomat.com.](https://manage.identomat.com/) Through the management platform, you can access the dashboard, view detailed information on KYC (Know Your Customer) and KYB (Know Your Business) sessions, review applicants, create custom workflows, and retrieve your access key. To gain full access to all features on the Manage platform, your account must be verified by our team.

### Requesting an account

If you don’t yet have an Identomat account, please [contact our team](https://www.identomat.com/contact-us) to request access.

Our team will guide you through the onboarding process and provide credentials for the Manage platform.

### Sign in

1. Go to [manage.identomat.com](https://manage.identomat.com/)&#x20;
2. Enter your email address and password, and click **Sign In**.&#x20;

> 💡 If your account needs activation and you've been waiting more than one day, please [contact us](https://www.identomat.com/contact-us).


# User roles overview

Learn about the different user roles in the Identomat system—Administrator, Operator, Call center operator, and End-user—and their specific access levels and functions to support various workflows.

### Roles in Manage platform

Identomat offers three types of user roles in the Manage platform to accommodate various use cases and workflows: **Administrator**, **Operator**, and **Call center operator**.&#x20;

Users can hold multiple roles simultaneously if needed to fit their specific responsibilities.

* **Administrator**: The highest level of access within the Manage platform. Administrators have full access to all dashboard features, can create configurations, manage users, delete sessions, and adjust company settings. If the company is registered as a Reseller, Administrators can also create and manage sub-company accounts.
* **Operator**: The Operator role is tailored for agents and company representatives responsible for handling daily operational tasks. This includes reviewing and managing sessions, conducting live video verification calls, and overseeing routine verification processes.
* **Call center operator**: A specialized sub-role of the Operator, focused on conducting manual verification during live video calls. Call center operators can only view sessions assigned to them.

**Roles comparison table:**

<table><thead><tr><th width="209">Role</th><th width="196">Permissions</th><th>Special abilities</th></tr></thead><tbody><tr><td><strong>Administrator</strong></td><td>Full access</td><td>Manage users, settings, configurations, integration</td></tr><tr><td><strong>Operator</strong></td><td>Moderate access</td><td>Manage dashboard, verification sessions</td></tr><tr><td><strong>Call center operator</strong></td><td>Limited access</td><td>Receive user calls, manage own sessions</td></tr></tbody></table>

#### End-user

* **End-user**: End-users are not Manage platform accounts. This term refers to individuals undergoing the verification process — they interact with the verification widget only, not the Manage platform.


# Receiving calls

Call center operators can receive end-user calls and conduct the video verification process.

In Identomat's system, only users with the **Call center operator** role are responsible for receiving calls. When this role is enabled, a call toggle will appear at the top of the page. Activating this toggle allows the system to receive calls from end-users.

When an end-user initiates a call, an incoming call animation will appear, and the Call center operator will hear a ringing sound. After answering, the operator connects with the end-user and can begin the verification steps configured for that session.

If no Call Center Operator has the toggle active, incoming calls will not be received. Ensure at least one operator is available before end-users begin sessions with a video call step.

**Call center operators** may:

* Take live screenshots of the end-user.
* Fill out operator questionnaires during the session.
* Initiate KYC steps for the end-user.

For more details, see:

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><mark style="color:blue;"><strong>Video KYC</strong></mark></td><td>Learn how live video verification works, including the full operator and end-user flow, call controls, and compliance features.</td><td></td><td><a href="/pages/bmez9GTbL908eOVutwYc">/pages/bmez9GTbL908eOVutwYc</a></td></tr></tbody></table>


# Integration overview

Whether you're looking for a lightweight, front-end solution or a more comprehensive server-side integration, we've got you covered.

### Available integration options

Identomat can be integrated into your systems in several ways, depending on your technical requirements and use case. Choose the option that best fits your setup:

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><mark style="color:blue;"><strong>No-code integration</strong></mark></td><td>Customize your verification flow and send verification links to end-users directly from the Manage platform — no development work required.</td><td></td><td><a href="/pages/XhW0Q99c8xPjlnDizbRR">/pages/XhW0Q99c8xPjlnDizbRR</a></td></tr><tr><td><mark style="color:blue;"><strong>Identomat SDKs</strong></mark></td><td>Native SDKs for iOS, Android, Flutter, and React Native. Covers setup, configuration, and key functionalities for seamless in-app identity verification.</td><td></td><td><a href="/pages/pNF9o4WdcSzYieGqk7Ld">/pages/pNF9o4WdcSzYieGqk7Ld</a></td></tr><tr><td><mark style="color:blue;"><strong>Identomat API</strong></mark></td><td>A REST API for full control over session creation, configuration, and result retrieval. Ideal for custom integrations and server-side workflows.</td><td></td><td><a href="/pages/rA1jtXPZQc2eZi7l7nLP">/pages/rA1jtXPZQc2eZi7l7nLP</a></td></tr></tbody></table>

Not sure which to use? Start with the **No-code integration** if you want to get up and running quickly. Choose the **API** or **SDKs** if you need to embed verification directly into your product.


# API access

To begin integrating with Identomat, you’ll need API keys to authenticate requests

### Obtaining API keys

* **Navigate to the API keys section**: Log into your Identomat dashboard and select **API keys** from the men&#x75;**,** nested under **Settings** .
* **Generate key**: In the API section, click the **Generate key** button.&#x20;
* **Whitelist IPs (optional):** You can restrict a key to a set of specific IP addresses, so that only requests from those IPs are accepted — requests from any other IP will be rejected. If no IPs are added, the key will accept requests from any IP. Whitelisted IPs aren't locked in at generation — you can add or remove them at any time from the key's settings.
* :exclamation: **Store securely**: Copy the generated API key and securely store it. For security purposes, the key will only be displayed once. If lost, you’ll need to generate a new one.

> 💡 **HMAC authorization**: For enhanced security, you can implement HMAC authorization using your secret key as the encryption key. This is optional but recommended for production environments.

### Procedure

The integration procedure consists of the following steps:

1. **Acquiring a `session_token`.**
2. **Redirecting the user's browser to widget.identomat.com.**
3. **Checking for a result.**

To acquire a `session_token`, the company server needs to call the **/begin** endpoint and provide the following arguments: `company_key`, `flags` and `steps`. The steps array contains the configuration for individual steps in the identification process, each of which can have its own set of flags specific to that step.&#x20;

**The endpoint used to create a session\_token:**

```
https://widget.identomat.com/begin/
```

For more details, see:

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><mark style="color:blue;"><strong>Developer guide</strong></mark></td><td>Step-by-step instructions and best practices for integrating and customizing our identity verification solutions.</td><td></td><td><a href="/pages/0b9rYxbzZRr3nXjJ1NQ2">/pages/0b9rYxbzZRr3nXjJ1NQ2</a></td></tr><tr><td><mark style="color:blue;"><strong>API Reference</strong></mark></td><td>Comprehensive details on endpoints, parameters, and response formats for seamless API integration.</td><td></td><td><a href="/pages/rA1jtXPZQc2eZi7l7nLP">/pages/rA1jtXPZQc2eZi7l7nLP</a></td></tr></tbody></table>


# Overview

No-code configurations allow you to create and customize identity verification workflows without writing any code. Use the intuitive interface to define steps that align with your business needs.

## Introduction

No-code configurations enable you to create and customize identity verification workflows **without writing a single line of code.** This feature provides a user-friendly interface where you can define steps, set parameters, and automate verification processes to meet your business requirements. Whether you're adjusting verification rules, adding extra security measures, or streamlining user onboarding, no-code configurations give you full control—without the need for development resources.

## **Key benefits**

1. **Ease of use** - A drag-and-drop or form-based interface allows anyone to configure workflows without technical expertise.
2. **Flexibility** – Customize workflows to fit different verification needs, such as KYC, AML screening, document validation or Proof of Address analysis.
3. **Faster deployment** – Make changes in real time without waiting for developers, ensuring quicker adaptation to regulatory or business needs.
4. **Scalability** – Easily modify and expand workflows as your company grows and verification requirements evolve.

## **How It Works**

Setting up a no-code Configuration involves a few straightforward steps:

1. **Access the no-code configurations** – Navigate to the Configurations section in your dashboard and create a new one.
2. **Define workflow steps** – Select from available verification steps such as **ID verification, Liveness, or Video KYC** to build your workflow.
3. **Set parameters** – Configure individual steps and overall workflow rules, such as redirecting users after verification is completed.
4. **Test and deploy** – Preview your workflow, make adjustments, and activate it by creating a new session or using the Configuration ID or Public URL.

## **Use cases**

No-code configurations can be applied in various scenarios, including:

* **Financial services** – Set up automated KYC workflows for new account openings.
* **E-commerce & Marketplaces** – Verify sellers and buyers before allowing transactions.
* **Gig economy & Hiring platforms** – Conduct identity and background verification for freelancers or employees.
* **Cryptocurrency & Fintech** – Implement compliance-driven checks for AML and fraud prevention.
* **Healthcare & Insurance** – Authenticate users before granting access to sensitive medical or policy data.


# Getting started

Prerequisites to create no-code configurations.

To start using No-code configurations, follow these steps to ensure a smooth setup and deployment:

### Ensure you have the right permissions

Before using No-code configurations, make sure you have the necessary access:

* This feature is **only available for the Administrator role**. (Refer to the [**User roles overview**](/get-started/user-roles-overview) for more details.)
* If you don’t have the required permissions, contact your system administrator or reach out to our support team for assistance.
* If you are an **Administrator** but the **`+ New configuration`** button is unavailable, your account may be on a **trial plan**. In this case, please contact us to enable full access.

### Navigate to the configurations section

* **Log in** to your dashboard and go to **Settings** in the navigation menu. Locate and click on the **Configurations** section.
* Click on **`+ New configuration`** to start building your workflow.
* If this is your first time using the feature, review the interface and available options. You can create **unlimited configurations**—this feature is **free to use on all paid plans**.

### Choose a verification type

Before selecting individual steps, choose the **verification type** for your workflow:

* **KYC (Know Your Customer)** – Designed for verifying individual users. Supports personal identity documents, liveness checks, video calls, and other individual-focused verification steps.
* **KYB (Know Your Business)** – Designed for verifying legal entities and organizations. Enables business document verification and related checks specific to companies and their representatives.

The selected verification type determines which steps are available in the workflow.

### **Review available verification steps**

Explore the verification steps available for your workflow, including:

* **ID verification** – Users submit identification documents for validation.
* **Liveness check** – Ensures the user is present and real during verification.
* **Video call** – Conducts live video-based verification sessions.
* **Proof of Address** – Includes verification of proof of address and analysis of other document types.

### **Create your first configuration**

* Finalize your flow by **dragging and dropping** or **selecting** the necessary verification steps.&#x20;
* Define key settings to match your verification requirements, such as:
  * **Required document types** (e.g., passport, ID card, driver’s license)
  * **Liveness retry limits** to control the number of user attempts
  * **Redirect URLs** after successful or failed verification
  * **Allowed document countries** to specify accepted regions
* Once all settings are in place, **save your configuration** to make it available for use.

### **Test before going live**

* Run sample test sessions from the dashboard to validate the workflow's behavior. You can create a test session by selecting your configuration and clicking **Generate link**.
* Check for:
  * Proper step execution and flow
  * Accurate verification results
  * Expected redirections and notifications
* Make necessary adjustments based on test results.

### **Deploy and monitor**

* Once your configuration is finalized, deploy it by:
  * **Creating a new session** from the dashboard
  * Using the **Configuration ID** in API requests
    * *Your* *Configuration ID is available on the configuration detail page.*
  * Sharing the **Public URL** for end-user access
* Once deployed, monitor verification results and session statuses from the **Dashboard**.


# Localization

Translate questionnaires, step titles, descriptions, and other UI texts directly within the Configuration builder so end-users see the verification widget in their preferred language.

### How localization works

**Prerequisite: the Language step**

* **Purpose**: Localization only becomes available once a **Language step** is added to your configuration. This step defines which additional languages users can choose from during verification.
* **Tip**: Add the Language step first, then come back to translate your content — if no Language step exists, the builder behaves as single-language and the language selector won't appear.

### **The language selector**

* **Purpose**: Once a Language step exists, a selector appears at the bottom of the Configuration builder, letting you choose which language you're currently editing content for.
* **How it works**:
  * The selector is visible at all times, no matter which step or section you're working on
  * Your **default language** (set in Configuration settings) is always listed first and pre-selected
  * All other languages you've added via the Language step appear below it
  * Use the search field to quickly find a language in a long list
  * Click **Add more** to jump to the Language step and add or remove available languages
* **Tip**: Think of the selector as a *"which language am I typing in right now"* switch — it applies to every translatable field in the builder: step titles, descriptions, questionnaire titles, questions, options, and prefilled answers.

***

### Editing modes

**Default language — full editing**

When the default language is selected, you have full control over your configuration:

* Add or remove questions and options
* Edit structure and keys, adjust step parameters.
* Edit all titles, labels, and descriptions

This is your "source of truth" — all translations reference back to whatever is written here.

**Translation language — translation-only mode**

* **Purpose**: When you switch to any non-default language, the builder enters a restricted **translation-only mode**, so you can safely add wording without accidentally changing the structure of your flow.
* **What happens**:
  * Every text field shows your default-language text as a **placeholder**, so you always have the original to translate from
  * Structural editing is disabled — you can only edit text, not add, remove, or reorder anything
* **Tip**: If you need to restructure anything (add a question, remove an option, etc.), switch back to the default language first — translation mode is purely for wording.

**If your configuration has errors**

* If you try to enter translation mode while your configuration has unresolved errors, you'll see a **"Fix errors before translating"** prompt asking you to resolve them first.
* **Tip**: Resolve validation errors in the default language before starting translation work, to avoid this interruption.

***

#### Saving translations

* There's no separate "Done" button for translations — everything is saved using the main **Save** button, just like your default-language content.
* You can translate as much or as little as you like:
  * Only languages you've actually edited are stored
  * Only fields you've actually translated contain that language's text
  * Partial translations are completely fine — nothing needs to be "complete" before saving

***

#### How the widget displays translations

* **Purpose**: Controls what an end-user sees when they use the verification widget in their selected language.
* **How it works**:
  * If a translation exists for the user's language, it's shown
  * If a translation is missing for a specific field, the widget automatically falls back to the default language for that field only
  * Partial translations never cause errors — users simply see a mix of translated and default-language text where needed

**Changing your default language later**

If you change the default language after content already exists, the system automatically remaps your existing content to the new default language key — and never overwrites content that already exists under that key. This makes it safe to change your default language without losing translated work.


# Configuration settings

Understanding configuration settings on the first tab of no-code builder

The first tab of the No-Code Builder is where you will find essential settings to customize and configure your workflow.&#x20;

## Configuration settings

The **Configuration settings** section includes key configurations related to the identification and organization of your workflows. Here’s an overview of the settings you’ll encounter:

### Configuration name

* **Purpose**: The name assigned to the configuration to easily identify it in your dashboard. It must be unique across your company, but it can be changed at any time.
* **Tip**: Choose a descriptive name that reflects the purpose or specific use of the configuration (e.g., "Standard ID verification flow" or "KYC onboarding"). This makes it easier to locate and manage workflows.

### Configuration ID

* **Purpose**: A unique identifier automatically generated when you create a configuration. This ID is used to reference the configuration in API requests, ensuring that the correct workflow is applied during user verification.
* **Tip**: Use the Configuration ID in API calls or when linking the configuration to external systems. Keep it handy for integration purposes.

### Public URL

* **Purpose**: The Public URL provides external access to your verification flow. Share it with users to direct them to the verification process — via invitation emails, embedded links, or other channels.
* **How it works**: Each Public URL contains a unique `public_config_id` parameter that identifies your verification flow:

```
  https://widget.identomat.com/launch/?public_config_id=<public-id>
```

When a user opens this URL, the platform automatically creates a new session and redirects them to a unique session URL:

```
  https://widget.identomat.com/?session_token=<generated_token>
```

The `public_config_id` stays the same for all users — a fresh `session_token` is generated for each individual session.

* **Activation**: The Public URL is **disabled by default**. You will need to **enable** it before you can copy and share the link.
* **Temporarily disabling**: Turning off the Public URL disables access without permanently removing it. You can re-enable it at any time.
* **Refreshing the URL**: Use the **`Refresh`** button to permanently replace the current Public URL with a new one. This generates a new `public_config_id`, invalidating the previous URL — anyone using the old link will no longer be able to access the flow. **This action cannot be undone.**
* **Tip**: Only share the Public URL with trusted parties. If access needs to be paused temporarily, disable the URL rather than refreshing it, so you can restore it later.

### Default language

* **Purpose**: Set the default language for the verification flow. This defines the language in which the verification steps, instructions, and notifications will be displayed to the user.
* **Tip**: Choose the language that best matches the primary user base for this workflow. If you're unsure of the user's preferred language in advance, you can configure a **Language step** in the **Steps tab**.
  * In this case, the **default language** you select here will be pre-selected for the user when they first encounter the language selection step. However, users will still have the option to change it if they prefer a different language.

### Groups with access

* **Purpose:** Define which user groups within your company are allowed to use this configuration. This setting controls visibility and access at the group level. \
  If you select one or more groups, *only* members of those groups will be able to see and use the configuration in their dashboard.\
  If you do **not** select any groups, the configuration becomes visible and accessible to **everyone** in the company.
* **How it works:** This field is presented as a **multi-choice dropdown** listing all groups available within the company. You may select one or many, depending on how you want to restrict access.
* **Tip:** Use this option to manage access for different teams, such as separating internal testing flows, production workflows, or department-specific configurations (e.g., “Fraud team”, “Support team”, “KYC operations”). Keeping access limited helps avoid accidental changes or unauthorized usage.

***

## Session settings

The **Session Settings** section allows you to customize various aspects of the verification session process, controlling how long sessions last, how they can be accessed, and specific verification rules. Here's an overview of the settings you'll encounter:

### Session lifetime (minutes)

* **Purpose**: Defines the maximum duration (in minutes) that a verification session will remain active. After this time, the session will expire, and the user will need to restart the verification process.
* **Tip**: Specify the session lifetime in minutes based on your security requirements. For example, you might set it to 15 minutes for a quick verification or longer for more detailed processes.

### Schedule session

* **Purpose**: When the **Schedule Session** toggle is enabled, it allows you to schedule a verification session to take place at a specific date and time in the future. This is especially useful for setting up verification flows in advance, giving users the option to book their session for a later time rather than initiating it immediately.
* **Tip**: Enable this toggle if you want users to have the flexibility to book their verification session in advance. User-side booking will be handled on your platform, while the session itself can be scheduled on our platform for a designated date and time. This ensures that verification sessions are managed according to your desired timeline and user convenience.

### **Request additional information**

* **Purpose**: When enabled, allows operators to request further verification from an applicant after a session has already reached a terminal state (approved, rejected, manual check, or expired), without creating a new session. All verification attempts remain stored under the same session, preserving a complete audit trail.
* **Tip**: Enable this setting for workflows where re-verification may be required — for example, when additional documents are needed or a previous submission was incomplete.
* **Default**: Disabled by default. Once enabled, operators will see the **Request more information** button on eligible sessions in Manage.

### Force user to continue on mobile device

* **Purpose**: When enabled, this setting forces the user to complete the verification process on a mobile device. The session will display a **QR code** at the beginning, which the user can scan to continue the verification on their mobile device. This ensures that the entire verification process occurs on mobile, which is essential for processes that require mobile-specific features.
* **Tip**: Enable this toggle if your verification process is designed to be mobile-first or requires mobile-specific features.

### Allow user to continue on another device

* **Purpose**: When enabled, this option allows users to resume their verification process on a different device. This is useful in cases where users start the verification on one device but need to switch to another (e.g., moving from desktop to mobile).
* **Tip**: Enable this toggle to provide flexibility for users who may need to switch devices without losing progress.

### Restrict URL sharing

* **Purpose**: When enabled, this setting prevents users from sharing the session URL with others. It ensures that only authorized users can access the verification flow and adds an extra layer of security.
* **Tip**: Use this option if the verification flow contains sensitive or high-security processes that should not be accessible to unintended users.

### Require FHD camera

* **Purpose**: When enabled, this setting ensures that users complete all **camera-based steps**—such as **liveness checks**, **document capture**, or **selfies**—using a **Full HD (FHD)** camera. This helps maintain high-quality image input, which is crucial for accurate identity verification and fraud detection.
* **Tip**: Enable this option if your process requires **clear, high-resolution visuals** to meet compliance or technical accuracy standards. If the user’s device does not meet the FHD requirement, they may be prompted to switch devices or will not be able to proceed.

### Screening&#x20;

* **Purpose**: Enables or disables screening as part of the verification process. Screening typically involves checking the user’s data against external datasets (e.g., watchlists, sanctions lists) to ensure compliance.
* **Tip**: Enable this toggle if screening is part of your verification process and you want to ensure users are checked against specific datasets.
* **Activation:** Screening is available only in paid plans. If you are on a trial plan, it may not function properly. For full access to screening features, you will need to contact our support team to ensure the right permissions are in place.
* **Minimum screening score**
  * **Purpose**: The Minimum screening score allows you to set a threshold score that the user must meet in order to pass the screening phase. If the user's screening score falls above this threshold, they will be rejected. This feature helps ensure that only users who meet the required compliance standards proceed in the verification process.
  * **Tip**: Set this score based on your risk management strategy or compliance standards. For example, if your compliance policy requires a strong match with screening data, you might set the threshold to **85%** pass rate.
* **Screening datasets**
  * **Purpose**: The Screening datasets option lets you select which external datasets to use during the verification process. These datasets help verify the user's identity by comparing their data against various lists.
  * **Datasets include**:
    * **Default**
    * **UN Sanctions**
    * **Georgian Sanctions**
    * **Adverse Media**
  * **Tip**: Choose the relevant datasets based on your industry, regulatory requirements, or business needs. For example, if your organization operates internationally, you may need to use global sanctions lists, while a local business might focus more on national or regional databases.
* **When to run screening**
  * **Purpose:** Defines **at which stage of the verification flow screening is executed**. This setting controls whether screening applies only to approved sessions or to all completed sessions, including rejected ones.
  * **Options:**
    * **After session approval:** Screening runs **only for sessions that have been approved**.\
      Rejected sessions are not screened.
    * **After session completion:** Screening runs for **all completed sessions**, regardless of whether the session was approved or rejected.
  * **Tip:** Use **After session approval** if you want to minimize screening volume and cost by screening only successful verifications.\
    Use **After session completion** if your compliance policy requires screening all users who reach the end of the verification flow, including rejected cases.

### VPN detection&#x20;

* **Purpose**: Detects whether an applicant is connected via a VPN during their verification session. When enabled, you can define how the session should respond if a VPN connection is identified, allowing you to enforce stricter access controls or flag suspicious activity.
* **Tip:** Enable this toggle if your compliance policy or risk management strategy requires monitoring for VPN usage.

> ⚠️ VPN detection is a paid add-on. Contact our team to enable it for your account.

**If VPN is detected**&#x20;

* **Purpose:** Defines the action taken when a VPN connection is detected during a session. This setting appears when VPN detection is enabled. \
  Options:
  * **Do nothing:** The session continues as normal. VPN usage is noted but does not affect the outcome.
  * **Reject session:** The session is automatically rejected at the end if a VPN was detected.
  * **Flag for manual check:** The session is flagged for manual review at the end, allowing an operator to make the final decision on approval or rejection.
* **Tip:** Choose the action that aligns with your risk tolerance. Use **Reject session** for high-security flows where VPN usage is not acceptable. Use **Flag for manual check** if you prefer human oversight before making a final decision.

***

## Other settings

The **Other Settings** section includes additional configuration options to enhance the verification process. Here’s an overview of the settings you’ll find:

### Return URL

* **Purpose**: The Return URL is a custom URL that users are redirected to after completing the verification process. It can be used to direct users to a specific page or action, such as a confirmation page, dashboard, or any other location relevant to your workflow.
* **Tip**: Define a Return URL to ensure users are redirected seamlessly after the verification process. This is especially useful if you need users to land on a post-verification page (e.g., a success page or next-step instructions).

### Pass custom QR URL&#x20;

* **Purpose**: If you're using the **Force user to continue on mobile device** feature, you can provide a custom **QR URL**. This allows you to pass a unique URL within the QR code that users scan to continue the verification process on their mobile devices.
* **Tip**: Enable this option if you want the QR code to link to a specific URL. This can be used for special workflows or user-specific data.

### Enable SMS notifications&#x20;

* **Purpose**: This option allows you to send **SMS notifications** to users, which can include **One-Time Passwords (OTP)** or other critical updates related to the verification process. SMS notifications are helpful for user authentication, reminders, and alerts.
* **Tip**: Enable **SMS notifications** if your verification process requires real-time communication with users, such as for sending OTPs or session reminders. Make sure to collect user phone numbers as part of the workflow to utilize this feature effectively.

### Recurring face recognition&#x20;

* **Purpose**: Recurring face recognition utilizes a face database to store facial data from users for future verification sessions. This enhances fraud detection by grouping sessions under a **personas** feature, allowing you to track users across multiple verification attempts.
* **Tip**: Enable this feature if you need to track users over time and improve security by detecting repeat users and identifying potential fraud. It is particularly useful for KYC, AML, and other compliance-related processes where recognizing the same user across sessions is crucial.


# KYC steps

Understanding steps for KYC configuration on the second tab of no-code builder

The Configuration steps tab allows you to design and customize your verification workflow by adding, organizing, and configuring different steps. This tab consists of three main sections:

## Overview

1. **Available steps (Left panel)**
   * This section contains all the verification steps that you can include in your workflow.
   * Steps may include Language, ID verification, Liveness check, Selfie with ID, Proof of Address, Video call, User questionnaire, Operator questionnaire, Phone number, Email, Geolocation.
   * **Click the steps** in the left section to add them to your workflow.
2. **Steps builder (Middle panel)**
   * Displays the **current steps** in your verification flow.
   * You can **rearrange** steps by dragging and dropping them to change the execution order.
   * Unwanted steps can be **deleted** if they are no longer needed.
3. **Step settings (Right panel)**
   * When a step is selected, its parameters appear in this panel.
   * You can **adjust parameters** such as retry limits, document type selection.
   * Advanced settings (e.g., step keys) can also be managed here.

## Step settings

The Step settings panel allows you to fine-tune each verification step by adjusting its specific parameters based on your business and compliance needs. When a step is selected, this panel provides configuration options.&#x20;

**Step titles appear in two places:** on the progress indicator shown to users resuming the flow on mobile or desktop, and in the video call operator's frame, where they're used to manually trigger steps.

### **Step titles**

* **Purpose**: Step titles are used for display purposes in various contexts:
  * When a user switches to a mobile device, the desktop screen displays the current step they are on.
  * In a **video call verification**, the operator sees the step titles inside their interface to manually trigger or monitor the verification process.
* **Tip**: Choose clear and descriptive step titles to improve the user experience and help operators navigate the process efficiently.

### Advanced tab

The **Advanced** tab stores all the necessary keys for steps, questions, and answers to facilitate integrations with external systems. These keys can be used for API integrations or other external applications that interact with the verification flow.

**Purpose**

* **Step keys** – Unique identifiers for each verification step.
* **Question keys** – Identifiers for the specific questions in forms or questionnaires.
* **Answer keys** – Corresponding keys for answers provided by users in questionnaire steps.

These keys enable seamless integration with other systems and facilitate tracking and reporting of data.

***

## Steps

### Language

* **Purpose**: The Language step allows users to select their preferred interface language from a dropdown list before proceeding with verification.
* **Positioning**: This step is **always positioned first** in the workflow.
* **Step Parameters**:
  * Define the list of **available languages** that users can choose from.
  * You must select at least **two languages** to enable the dropdown selection.
* **Tip**: If your users primarily speak a specific language, consider setting a **default language** in the general settings, while still offering alternative options for accessibility.

***

### ID verification

**Purpose**: The ID verification step is responsible for verifying a user’s primary identity documents. This step includes multiple configuration options to ensure document authenticity and compliance with verification requirements.

#### **Document type**

Defines which types of identity documents the user can select for verification. Options include:

* ID card
* Passport
* Residence permit
* Driver’s license

#### **Method**

Determines how users can submit their identity document:

* **Capture** – The user must take a live photo of the document.
* **Upload** – The user can upload an existing image of the document.
* **Both** – The user can choose either option.

#### Other parameters

**Compare document fields**

* Compares textual information between the document’s **Visual Zone (VIZ)** and **Machine-Readable Zone (MRZ)**.
* Prevents users from passing verification if the fields do not match.

**Compare document pages**

* Ensures the **front and back pages** belong to the same document.
* If discrepancies are found, the session is **rejected.**

**Block expired documents**

* Rejects users if the expiration date has **already passed**.

**Spoofing detection**

* Detects attempts to use **fake or altered** identity documents and **rejects** such sessions.

**Grayscale detection**

* Identifies if the document is **grayscale** (black & white) and **rejects** it to ensure authenticity.

**Visual damage detection**

* Scans the document for **physical defects**, such as a damaged chip.

**Warn if document expires within (days)**

* Sends a **warning** if the document will expire within the specified number of days.

**Reject if document expires within (days)**

* **Rejects** the session if the document is set to expire within the specified timeframe.

**Block person under age (years)**

* Rejects users **below** the specified age limit.

**Allowed document countries**

* Restricts document verification to **specific countries**.
* Prevents users from verifying if the document is from an unlisted country.

#### Document data review

**Enable document data editing**

* When enabled, a review page is shown to the applicant/operator after document scanning, allowing them to verify and correct OCR-extracted data before proceeding.
* Disabled by default.

**Who can edit**

* Defines which parties are allowed to edit document fields. Options:
  * **User only** – Only the applicant can make corrections.
  * **Operator only** – Only the operator can make corrections in Manage.
  * **Both** – Both the applicant and operator can make corrections.

**Editable fields**

* Defines which document fields are available for correction. For each field you can set:
  * **Mandatory** – Whether the field must be filled before the applicant can proceed.

For the full list of configurable fields and behavior details, see [Document data review ](/platform-concepts/document-data-review)in Platform concepts.

For API-level configuration of this feature, see [Document data review configuration](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification) in the Developer guide.

***

### Liveness check

**Purpose:** The Liveness check step ensures that the user is a real, live person and not a spoofed or manipulated image. During this step, the user positions their face within the designated frame and follows the instructions.

Identomat offers two types of liveness checks:

#### **Liveness type: Active liveness**

* An **advanced biometric check** where the user is prompted to perform specific actions (e.g., blinking, turning their head) to confirm their presence as a real person.
* Designed to prevent **spoofing attempts** using photos, videos, or masks.

#### **Liveness type: Passive liveness**

* A **basic liveness check** where the user simply holds their head within an oval frame.
* The system captures a **two-second video** to analyze and confirm liveness.

#### **Method for passive liveness**

Defines how the liveness check is performed:

* **Capture** – The user must take a live video using their device’s camera.
* **Upload** – The user can upload a selfie.
* **Both** - The user can choose either option.

#### **Maximum attempts for liveness**

* Specifies the **maximum number of attempts** allowed for the user to complete the liveness check.
* If the user exceeds this limit, the session is **rejected**, and they must restart the process.

***

### Selfie with ID&#x20;

**Purpose:** The Selfie with ID step ensures that the user is physically present with their identity document. Users must hold their document in their hands so that both their **face and the document** are clearly visible in the captured image.

#### **Method**

Defines how the user submits their selfie with the document:

* **Capture** – The user must take a live photo using their device’s camera.
* **Upload** – The user can upload an existing image where they are holding their document.
* **Both** – The user can choose either option.

***

### **Proof of Address**&#x20;

**Purpose:** The Proof of Address step verifies a user’s residential address by analyzing official documents that contain their name and address.&#x20;

#### **Document type**

Users can upload one of the following accepted documents as Proof of Address:

* Bank statement
* Utility bill
* Driver’s license
* Vehicle registration certificate&#x20;
* Yellow Slip&#x20;

***

### Video call

**Purpose:**  The Video call step connects the user with an operator for **manual identity verification**. The operator can interact with the user in real-time and initiate other verification steps as needed.

Identomat supports two types of video calls:

* **One-on-one call** – A secure direct video call between a customer and a verification operator.
* **Multi-user call** – Allows **multiple participants** in a single session, where each user follows their own customized verification workflow.

#### **`+ New step` button**

Adds verification steps within the video call process, allowing the operator to trigger them manually.

**Call type**

* **Single participant** – A one-on-one video call.
* **Multiple participants** – A multi-user video call.

**Participant name**

* If enabled, the **user must enter their name** before joining the call.

**Force user's camera on**

* If enabled, the **user cannot turn off their camera** during the call.

**Reset verification**

* If a user **disconnects and rejoins**, all previous verification data is cleared for security reasons, and the operator must restart the process.

***

### User questionnaire

**Purpose:** The User questionnaire step is designed to collect structured user input through various form types. The provided information is securely stored within the verification session. Questionnaire steps offer a wide range of configurable question formats.

#### Questionnaire details

* **Title** – The main title of the questionnaire.
* **Description** – A brief text displayed below the title to provide context.
* **Success button title** – Customizable text for the confirmation button.

#### Questions and answers

Identomat supports a variety of question types, all of which offer customizable parameters:

#### Short answer

Users can type in a response to an open-ended question.

* **Question title** – The label for the question.
* **Answer format** - Defines the expected structure of the user’s response. This setting controls how the input is validated and which type of data the system accepts.
  * **Free text** - Users can enter any text without restrictions.
  * **Email -** Users must enter a valid email address; the system enforces email format validation.
* **Prefilled answer** – A prefilled answer that the user can edit.
* **Required** – Determines whether the question must be answered.
* **Read-only mode** – Prevents users from editing the default answer.
* **Condition** – The question only appears if a specified condition is met.

#### Checkbox (Multiple selection)

Users can select one or more predefined options.

* **Question title** – The label for the question.
* **Default answer** – Pre-checked options that users can modify.
* **Required** – Determines if at least one option must be selected.
* **Read-only mode** – Prevents users from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define multiple selectable choices.

#### Radio (Single selection)

Users can select only one option from a predefined list.

* **Question title** – The label for the question.
* **Default answer** – Preselected option that users can change.
* **Required** – Determines if a selection is mandatory.
* **Read-only mode** – Prevents users from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define the available choices.

#### **File upload**

Users can upload files, such as images or PDFs.

* **Question title** – The label for the question.
* **Description** – Additional instructions displayed under the title.
* **Maximum number of files** – Limit the number of files users can upload (max: 10).
* **File types** – Restrict uploads to **PDFs**, **images**, or both.
* **Required** – Determines if file upload is mandatory.
* **Condition** – The question only appears if a specified condition is met.

#### **Dropdown**

Allows users to select one or multiple values from a predefined dropdown list.

* **Question title** – The label for the question.
* **Dropdown options** – Define the dropdown list by providing options in a comma-separated format (e.g., *Option 1, Option 2, Option 3*).
* **Multi-select** – If enabled, users can select multiple options from the dropdown list. If disabled, users can select only one option.
* **Required** – Determines if a selection is mandatory.
* **Error message** – The message displayed if the field is required but no selection is made.
* **Condition** – The question only appears if a specified condition is met.

#### **Attachment**

Allows users to access files that are either uploaded by operators during the session or pre-attached by administrators via the no-code builder or API.

* **Title** – The label for the question.
* **Description** – Additional instructions displayed under the title.
* **File attachment mode (Radio)** – Define how files are provided to the user:
  * **Uploaded by operator per session** – Operators can upload files during the session that are visible to the user.
    * **Allow changes to attachments after user confirmation -** If toggle is **turned off,** the operator cannot edit attachments after the user **confirms** the questionnaire. If **enabled**, the operator may still upload or remove files.
  * **Pre-attached file** – Files uploaded in advance via the no-code configurations or API.
* **Maximum number of files** – Limit the number of files users can upload (max: 10).
* **File types (Checkbox)** – Restrict uploads to **PDFs**, **images**, or both.
* **Condition** – The attachment field only appears if a specified condition is met.

***

### Operator questionnaire&#x20;

The operator questionnaire appears in the session, and the operator can fill out the form during or after the session.

#### Questionnaire details

* **Title** – The main title of the questionnaire.
* **Description** – A brief text displayed below the title to provide context.

#### Questions and answers

Identomat supports **five types of questions**, each with customizable parameters:

#### Short answer

Operators can type in a response to an open-ended question.

* **Question title** – The label for the question.
* **Answer format** - Defines the expected structure of the operator's response. This setting controls how the input is validated and which type of data the system accepts.
  * **Free text** - Operators can enter any text without restrictions.
  * **Email -** Operators must enter a valid email address; the system enforces email format validation.
* **Prefilled answer** – A prefilled answer that the operator can edit.
* **Required** – Determines whether the question must be answered.
* **Read-only mode** – Prevents operators from editing the default answer.
* **Condition** – The question only appears if a specified condition is met.

#### Checkbox (Multiple selection)

Operators can select one or more predefined options.

* **Question title** – The label for the question.
* **Default answer** – Pre-checked options that operators can modify.
* **Required** – Determines if at least one option must be selected.
* **Read-only mode** – Prevents operators from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define multiple selectable choices.

#### Radio (Single selection)

Operators can select only one option from a predefined list.

* **Question title** – The label for the question.
* **Default answer** – Preselected option that operators can change.
* **Required** – Determines if a selection is mandatory.
* **Read-only mode** – Prevents operators from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define the available choices.

#### **File upload**

Operators can upload files, such as images or PDFs, directly into the session while filling out the questionnaire. These files become part of the session record and can later be reviewed by administrators or other authorized roles.

* **Question title** – The label for the upload field.
* **Description** – Additional instructions displayed under the title.
* **Maximum number of files** – Limit the number of files operators can upload (max: 10).
* **File types** – Restrict uploads to **PDFs**, **images**, or both.
* **Required** – Determines if file upload is mandatory for the operator before submitting the questionnaire.
* **Condition** – The upload field only appears if a specified condition is met.

#### **Dropdown**

Allows operators to select one or multiple values from a predefined dropdown list while filling out the session questionnaire.

* **Question title** – The label for the dropdown field.
* **Dropdown options** – Define the list of options by providing values in a comma-separated format (e.g., *Option 1, Option 2, Option 3*).
* **Multi-select** – If enabled, operators can select multiple options. If disabled, only one option can be selected.
* **Required** – Determines if a selection is mandatory before submitting the questionnaire.
* **Condition** – The dropdown field only appears if a specified condition is met.

***

### Phone number

Purpose: The Phone number step allows for the collection or verification of a user’s phone number. The provided phone number is stored within the session.

**Method**

* **Collect** – The user enters their phone number, and it is stored in the session without verification.
* **Verify** – The user enters their phone number, and an **OTP (One-Time Password)** is sent. The phone number is stored only after the OTP is successfully verified.

***

### Email

**Purpose:** The Email step allows for the collection or verification of a user’s email address. The provided email is stored within the session.

**Method**

* **Collect** – The user enters their email address, and it is stored in the session without verification.
* **Verify** – The user enters their email address, and a **confirmation code** is sent. The email is stored only after the verification code is successfully confirmed.

***

### Geolocation

**Purpose:** The Geolocation step collects and verifies the user’s physical location during the verification process. This helps ensure compliance with jurisdiction, AML, or KYC requirements.

***

### **SSN verification**

**Purpose:** The SSN verification step verifies a user's **Social Security Number** as part of the identification process.

***


# KYB steps

Understanding steps for KYB configuration on the second tab of no-code builder

The KYB configuration steps tab allows you to design and customize your KYB workflow by adding, organizing, and configuring different steps. This tab consists of three main sections:

## Overview

* **Available steps (Left panel)**
  * This section contains all the verification steps that you can include in your workflow.
  * Steps may include Language, User questionnaire, Company data and Beneficiaries.
  * **Click the steps** in the left section to configure the KYB process.

2. **Steps builder (Middle panel)**
   * Displays the **current steps** in your verification flow.
   * You can **rearrange** steps by dragging and dropping them to change the execution order.
   * Unwanted steps can be **deleted** if they are no longer needed.
3. **Step settings (Right panel)**
   * When a step is selected, its parameters appear in this panel.
   * You can **adjust parameters** such as company data fields selection.
   * Advanced settings (e.g., step keys) can also be managed here.

## Step settings

The Step settings panel allows you to fine-tune each step by adjusting its specific parameters based on your business and compliance needs. When a step is selected, this panel provides configuration options.&#x20;

**Step titles appear in two places:** on the progress indicator shown to users resuming the flow on mobile or desktop, and in the video call operator's frame, where they're used to manually trigger steps.

### **Step titles**

* **Purpose**: Step titles are used for display purposes in various contexts:
  * Displayed as main title on the user's side.
  * When a user switches to a mobile device, the desktop screen displays the current step they are on.
* **Tip**: Choose clear and descriptive step titles to improve the user experience and help operators navigate the process efficiently.

### Advanced tab

The **Advanced** tab stores all the necessary keys for steps, questions, and answers to facilitate integrations with external systems. These keys can be used for API integrations or other external applications that interact with the verification flow.

**Purpose**

* **Step keys** – Unique identifiers for each verification step.
* **Question keys** – Identifiers for the specific questions in forms or questionnaires.
* **Answer keys** – Corresponding keys for answers provided by users in questionnaire steps.

These keys enable seamless integration with other systems and facilitate tracking and reporting of data.

***

## Steps

### Language

* **Purpose**: The Language step allows users to select their preferred interface language from a dropdown list before proceeding with verification.
* **Positioning**: This step is **always positioned first** in the workflow.
* **Step parameters**:
  * Define the list of **available languages** that users can choose from.
  * You must select at least **two languages** to enable the dropdown selection.
* **Tip**: If your users primarily speak a specific language, consider setting a **default language** in the general settings, while still offering alternative options for accessibility.

***

### User questionnaire

**Purpose:** The User questionnaire step is designed to collect structured user input through various form types. The provided information is securely stored within the verification session. Questionnaire steps offer a wide range of configurable question formats.

#### Questionnaire details

* **Title** – The main title of the questionnaire.
* **Description** – A brief text displayed below the title to provide context.
* **Success button title** – Customizable text for the confirmation button.

#### Questions and answers

Identomat supports a variety of question types, all of which offer customizable parameters:

#### Short answer

Users can type in a response to an open-ended question.

* **Question title** – The label for the question.
* **Answer format** - Defines the expected structure of the user’s response. This setting controls how the input is validated and which type of data the system accepts.
  * **Free text** - Users can enter any text without restrictions.
  * **Email -** Users must enter a valid email address; the system enforces email format validation.
* **Prefilled answer** – A prefilled answer that the user can edit.
* **Required** – Determines whether the question must be answered.
* **Read-only mode** – Prevents users from editing the default answer.
* **Condition** – The question only appears if a specified condition is met.

#### Checkbox (Multiple selection)

Users can select one or more predefined options.

* **Question title** – The label for the question.
* **Default answer** – Pre-checked options that users can modify.
* **Required** – Determines if at least one option must be selected.
* **Read-only mode** – Prevents users from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define multiple selectable choices.

#### Radio (Single selection)

Users can select only one option from a predefined list.

* **Question title** – The label for the question.
* **Default answer** – Preselected option that users can change.
* **Required** – Determines if a selection is mandatory.
* **Read-only mode** – Prevents users from modifying selections.
* **Condition** – The question only appears if a specified condition is met.
* **`+ Add option`** – Define the available choices.

#### **File upload**

Users can upload files, such as images or PDFs.

* **Question title** – The label for the question.
* **Description** – Additional instructions displayed under the title.
* **Maximum number of files** – Limit the number of files users can upload (max: 10).
* **File types** – Restrict uploads to **PDFs**, **images**, or both.
* **Required** – Determines if file upload is mandatory.
* **Condition** – The question only appears if a specified condition is met.

#### **Dropdown**

Allows users to select one or multiple values from a predefined dropdown list.

* **Question title** – The label for the question.
* **Dropdown options** – Define the dropdown list by providing options in a comma-separated format (e.g., *Option 1, Option 2, Option 3*).
* **Multi-select** – If enabled, users can select multiple options from the dropdown list. If disabled, users can select only one option.
* **Required** – Determines if a selection is mandatory.
* **Error message** – The message displayed if the field is required but no selection is made.
* **Condition** – The question only appears if a specified condition is met.

#### **Attachment**

Allows users to access files that are either uploaded by operators during the session or pre-attached by administrators via the no-code builder or API.

* **Title** – The label for the question.
* **Description** – Additional instructions displayed under the title.
* **File attachment mode (Radio)** – Define how files are provided to the user:
  * **Uploaded by operator per session** – Operators can upload files during the session that are visible to the user.
    * **Allow changes to attachments after user confirmation -** If toggle is **turned off,** the operator cannot edit attachments after the user **confirms** the questionnaire. If **enabled**, the operator may still upload or remove files.
  * **Pre-attached file** – Files uploaded in advance via the no-code configurations or API.
* **Maximum number of files** – Limit the number of files users can upload (max: 10).
* **File types (Checkbox)** – Restrict uploads to **PDFs**, **images**, or both.
* **Condition** – The attachment field only appears if a specified condition is met.

***

### Company data

**Purpose:** The Company Data step collects essential information about a legal entity during KYB verification. This information is required to validate the company’s identity and ensure compliance with regulatory requirements.

**Tip:** Always include the mandatory fields required for legal compliance. Use optional fields to gather extra information useful for business or regulatory purposes.

#### **Step fields**

* **Company name** – Mandatory; cannot be deleted.
* **Registration number** – Mandatory; cannot be deleted.
* **Registration country** – Mandatory; cannot be deleted.

#### **Add field button**

Allows administrators to include additional company information in the verification flow. The available fields include:

* **VAT/Tax ID**
* **Date of incorporation**
* **Email**
* **Phone number**
* **Website**
* **Legal address**
* **Company entity type**

Each added field includes a toggle to mark it as **required** or optional.

***

### Beneficiaries

**Purpose:** The Beneficiaries step collects detailed information about a company’s key individuals and legal entities, such as shareholders, UBOs, directors, and representatives. This ensures compliance with regulatory requirements and enables verification workflows for both individuals and legal entities.

**Tip:** Always configure the verification toggles and KYC/KYB dropdowns according to your compliance requirements. Mandatory fields cannot be removed, but optional fields can be added to capture additional information that may be useful for your internal processes or reporting.

#### **Step details**

* **Title** – The main label for the step.
* **Description** – A brief explanation of the purpose of this step.
* **Beneficiary verification** – Select how beneficiaries should be verified:
  * **Individuals** – Follow a **KYC flow**.
  * **Legal entities** – Follow a **KYB flow** using the chosen configuration.
* **KYC dropdown** – Select a **KYC configuration** to use for individual verification.
* **KYB dropdown** – Select a **KYB configuration** to use for company verification.
* <mark style="color:$primary;">**`+ Add beneficiary`**</mark>**&#x20;button** – Adds a new beneficiary entry to the step.

#### **Available roles:**

**Shareholders**

* **Verification toggle** – Activates when a KYC or KYB configuration is selected in the dropdown.
* **Tabs:** Individual and Company

**Individual fields** (mandatory, cannot be deleted)

* First name
* Last name
* Date of birth

**Add field button** – Additional optional fields:

* Beneficial ownership percentage
* Phone number
* Email

Each added field can be marked as **required** or optional.

**Company fields** (mandatory, cannot be deleted)

* Company name
* Registration number
* Registration country

**Add field button** – Additional optional fields:

* Beneficial ownership percentage
* Website
* VAT/Tax ID
* Date of incorporation
* Email
* Phone number
* Legal address

Each added field can be marked as **required** or optional.

#### **UBOs (Ultimate Beneficial Owners)**

* **Verification toggle** – Activates when a KYC configuration is selected.

**Fields** (mandatory, cannot be deleted)

* First name
* Last name
* Date of birth

**Add field button** – Additional optional fields:

* Beneficial ownership percentage
* Phone number
* Email

Each added field can be marked as **required** or optional.

#### **Directors**

* **Verification toggle** – Activates when a KYC configuration is selected.

**Fields** (mandatory, cannot be deleted)

* First name
* Last name
* Date of birth

**Add field button** – Additional optional fields:

* Phone number
* Email

Each added field can be marked as **required** or optional.

#### **Representatives**

* **Verification toggle** – Activates when a KYC configuration is selected.

**Fields** (mandatory, cannot be deleted)

* First name
* Last name
* Date of birth

**Add field button** – Additional optional fields:

* Phone number
* Email

Each added field can be marked as **required** or optional.

#### **Other**

* **Verification toggle** – Activates when a KYC configuration is selected.

**Fields** (mandatory, cannot be deleted)

* Position
* First name
* Last name
* Date of birth

**Add field button** – Additional optional fields:

* Phone number
* Email

Each added field can be marked as **required** or optional.

***


# Developer guide

The Developer Guide provides comprehensive instructions and best practices for integrating with our platform.

[Identomat](https://www.identomat.com/) is a service designed to verify **human identity** and **liveness** over the Internet. This guide assumes that the integrating organization (hereafter referred to as *"the company"*) operates a web server (referred to as *"the company server"*) at `example.com` .

### Prerequisites

Before integrating, the company must obtain a `company_key` — a credential used to securely communicate between the company server and the Identomat server (`widget.identomat.com`).

{% hint style="info" %}
Don't have a `company_key` yet? See [**API access**](/get-started/api-access) for how to generate one from your Identomat dashboard.
{% endhint %}

**Optional security features, configurable at key generation or any time after:**

* **HMAC authorization** — A `secret_key` is used to generate and validate HMAC signatures, adding an extra layer of verification to requests sent with your `company_key`.
* **IP whitelisting** — Restrict a `company_key` to a specific set of IP addresses. Once IPs are added, only requests carrying that key from a whitelisted address are accepted; requests from any other IP are rejected. Leaving the list empty allows the key to be used from any IP. Both settings can be added, edited, or removed at any time from the same section of your dashboard where the key was generated.

For enhanced security, companies can optionally implement **HMAC authorization**. In this case, a `secret_key` is used to generate and validate HMAC signatures for secure communication.

## Procedure

The integration procedure consists of three main steps:

{% stepper %}
{% step %}
[**Acquiring a `session_token`.**](#acquiring-a-session-token)
{% endstep %}

{% step %}
[**Redirecting the user's browser to `widget.identomat.com`.**](#redirecting-to-the-identomat-widget)
{% endstep %}

{% step %}
[**Checking for a result.**](#checking-for-a-result)
{% endstep %}
{% endstepper %}

### **Acquiring a session token**

To acquire a `session_token`, your backend must send a request to the `/begin/` endpoint with the following parameters:

* `company_key` – Your unique company identifier.
* `flags` – A JSON object defining global settings for the verification session.
* `steps` – An array specifying the steps to include in the verification flow. Each step can have its own step-specific flags.

> ⚠️ The `session_token` is valid for **15 minutes** by default.

**Endpoint:**

```nginx
POST https://widget.identomat.com/begin/
```

Requests can be sent as:

* **URL query parameters**
* **URL-encoded form data**
* **JSON object** in the request body (recommended)

#### **Steps and Flags Structure**

* &#x20;`flags` : Defines global behavior for the entire session.
* `steps` :  Allows full control of the verification process, enabling you to specify **which steps to include** (e.g., `liveness`, `identity-document`) and configure **step-specific flags**, such as `"allow_face_upload": true` for the `liveness` step.

{% hint style="info" %}
To ensure compatibility between the old and new methods, both of which need to work together, you should use the `'skip_face'` and `'skip_document'` flags when using steps.

These flags prevent the 'identity-document' and 'liveness' steps from being duplicated if they already exist in the flow.
{% endhint %}

**Using Configuration or custom steps**

You can initiate a session in two ways:

* **Via predefined configuration (Recommended):**
  * We strongly recommend using **predefined configurations** via the `config_id` parameter. Configurations ensure consistency, simplify integration, and reduce the risk of errors. Using configurations also allows us to deprecate legacy custom step handling in the future, helping clients maintain a clean and stable integration.
* **Via custom steps and flags**:\
  Only use custom steps and flags if you have very specific needs that cannot be satisfied with configurations. Over time, we encourage migrating all custom flows to configurations.

{% hint style="warning" %}
**Why configurations matter:**

* **Simplifies session creation** — no need to manually define steps and flags.
* **Reduces risk of errors** in the verification flow.
* **Future-proof** — legacy custom step handling will eventually be deprecated.
* Enables Identomat to **maintain**, **improve**, and **optimize** **flows** efficiently.
* Makes **integration** easier.
  {% endhint %}

{% hint style="info" %}
📘 For detailed parameter definitions and examples, refer to the [**API Reference.**](/developer-tools/api-reference#begin-session-creation)
{% endhint %}

### Redirecting to the Identomat Widget

To start a verification session, the company server must redirect the user’s browser to:

```
https://widget.identomat.com/?session_token={session_token_here}
```

Replace `{session_token_here}` with the actual token received from the `/begin/` endpoint.

### Embedding in an Iframe

Alternatively, the widget can be embedded within an iframe:

```html
<iframe
    height=“100dvh”
    width=“100%”
    src="https://widget.identomat.com/?session_token={session_token_here}"
    allow="camera">
</iframe>
```

{% hint style="warning" %}
The `allow="camera"` attribute is required to grant camera access. Without it, verification steps that rely on the camera will not function.
{% endhint %}

### **Checking for a result**

Once the verification process is completed, the result can be detected in two ways depending on how the widget was integrated:

* **If** **redirected**\
  If you used a redirect approach (not embedded in an iframe), the user will be redirected to the `return_url` specified in the configuration or session flags, with the `session_token` appended as a query parameter.

```
https://yourapp.com/?session_token=abc123xyz
```

* **If embedded in an iframe**, the process completion can be detected using JavaScript:

```javascript
addEventListener('message', function (e) {
    if (e.origin !== 'https://widget.identomat.com') return;
    if (e.data !== 'DONE') return;
    // Process completed, handle results here
});
```

{% hint style="success" %}
Ensure you verify the message `origin` to avoid security risks.
{% endhint %}

***

## Quick links

Access detailed developer guides for **KYC (Know Your Customer)** and **KYB (Know Your Business)** flows. Click a card below to explore configuration, integration steps, and best practices for each verification type.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>KYC (Know Your Customer)</strong><br><br>Learn how to collect and verify individual user data, configure verification steps, and integrate KYC flows.</td><td><a href="/pages/zp3PlfI2jqthOVkWQNJW">/pages/zp3PlfI2jqthOVkWQNJW</a></td></tr><tr><td><p><strong>KYB (Know Your Business)</strong></p><p><br>Learn how to collect and verify company data, beneficiaries, and representatives, with configurable verification steps.</p></td><td><a href="/pages/PcRaMELPuaahtgUUMEyI">/pages/PcRaMELPuaahtgUUMEyI</a></td></tr></tbody></table>


# KYC (Know Your Customer)

The KYC flow verifies the identity of individual users through document checks, liveness detection, and automated data validation.

Each KYC verification flow consists of configurable steps that define how the end user’s identity is verified. The flags and steps listed below determine which checks are included in the process and how they are executed.

## Flags

The `flags` parameter is an object with optional configuration flags that adjust the KYC verification flow. Below is a summary of the most commonly used flags:

<table data-full-width="true"><thead><tr><th width="218">Flag name</th><th width="437">Description</th><th width="216">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>skip_face</code></td><td>Skips the <code>liveness</code> step if it already exists in the defined steps. Prevents duplication when using custom flows.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>skip_document</code></td><td>Skips the <code>identity-document</code> step if it already exists in the defined steps. Prevents duplication when using custom flows.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>return_url</code></td><td>URL to redirect the user to after the identification process is completed. If omitted, the session is assumed to be embedded in an iframe.</td><td><code>null</code></td><td>&#x3C;string></td></tr><tr><td><code>language</code></td><td><p>User interface language code. Supported values:</p><pre data-overflow="wrap"><code>"es", "ka", "uk", "ru", "uz", "it", "gr", "tr", "ro", "ar", "de", "pl", "hi", "bn", "az", "ja", "pt", "fr", "kk", "sv"
</code></pre><p></p></td><td><code>"en"</code></td><td>&#x3C;string></td></tr><tr><td><code>skip_desktop</code></td><td>Limits sessions to mobile devices only. If initiated on desktop, a QR code is shown to transfer the session to a mobile device.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>switch_device_url</code></td><td>A custom URL to display in the QR code when the camera is unavailable or blocked. If omitted or empty, the QR code will not be displayed.</td><td><code>null</code></td><td>&#x3C;string></td></tr><tr><td><code>restrict_url_sharing</code></td><td>Prevents the session URL from being used on a different browser or device. <br>If <code>true</code>, the QR code will not appear when camera access is denied—unless <code>switch_device_url</code> is also defined.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>requiredHdMedia</code></td><td>Enforces Full HD (1080p+) camera usage for <code>liveness</code> and <code>identity-document</code> steps. If not met, a QR code is shown for the user to switch to another device.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

## Steps

The `steps` array defines the sequence and structure of the identification process. It is included alongside the `company_key` and `flags` parameters when creating a session.

Each step in the `steps` array can contain the following properties:

<table><thead><tr><th width="163.91015625">Property</th><th>Description</th></tr></thead><tbody><tr><td><code>type</code></td><td>The type of the specific step (see list of supported step types below).</td></tr><tr><td><code>key</code></td><td>A unique identifier for the step. This key can be customized but must remain unique within the session.</td></tr><tr><td><code>flags</code></td><td>Step-specific configuration flags that control the behavior of this step.</td></tr><tr><td><code>title</code></td><td>A custom title provided by the client, displayed to the user during this step in the interface.</td></tr></tbody></table>

### **Supported step types**

Below is a list of all step types currently supported in the system:

* [Language](#language)
* [ID verification](#identity-document-verification)
* [Liveness check](#liveness-check)
* [Proof of Address](#proof-of-address)
* [Selfie with ID](#selfie-with-id)
* [Video call](#video-call)
* [Phone number verification](#phone-number)
* [Email verification](#email)
* [Geolocation](#geolocation)
* SSN verification
* [User questionnaire](#user-questionnaire)
* [Operator questionnaire](#operator-questionnaire)

### Language

The **Language** step allows the user to select their preferred interface language at the beginning of the identification process.

**Language step configurations:**

* **Title:** `Language`
* **Type**: `language`
* **Key**: `language`
* **Array** of `languages`&#x20;

<table data-full-width="true"><thead><tr><th width="259">Flag</th><th width="441.3984375">Description</th><th width="98.85546875">Default</th><th width="131.734375">Type</th></tr></thead><tbody><tr><td><code>languages</code></td><td><p>An array of language codes to display. If left empty, all supported languages will be shown.</p><pre data-overflow="wrap"><code>"en", "ka", "es", "uk", "gr", "it", "de", "ru", "uz", "ro", "tr", "ar", "pl", "bn", "hi", "hy", "az", "ja", "pt", "fr", "kk", "sv"
</code></pre></td><td>All</td><td>Array&#x3C;string></td></tr></tbody></table>

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "return_url": "https://example.com/",
        "language": "es"
    } ,
    "steps": [
     {
                "title": {
                  "en": "Language",
                  "ka": "ენა",
                  "es": "Idioma",
                  "uk": "Мова",
                  "gr": "Γλώσσα",
                  "it": "Lingua",
                  "de": "Sprache",
                  "ru": "Язык",
                  "uz": "Til",
                  "ro": "Limbă",
                  "tr": "Dil",
                  "ar": "اللغة",
                  "pl": "Język",
                  "bn": "ভাষা",
                  "hi": "भाषा",
                  "hy": "Լեզու",
                  "az": "Dil",
                  "ja": "言語",
                  "pt": "Idioma",
                  "fr": "Langue",
                  "kk": "Тіл",
                  "sv": "Språk"
                },
                "type": "language",
                "key": "language",
                "languages": [
                    "en",
                    "ka",
                    "es",
                    "uk",
                    "gr",
                    "it",
                    "de",
                    "ru",
                    "uz",
                    "ro",
                    "tr",
                    "ar",
                    "pl",
                    "bn",
                    "hi",
                    "hy",
                    "az",
                    "ja",
                    "pt",
                    "fr",
                    "kk",
                    "sv"
                ]
            },
            {
                "title": {
                  "en": "ID verification",
                  "ka": "პირადობის დადასტურება",
                  "es": "Verificación de identidad",
                  "uk": "Підтвердження особи",
                  "gr": "Επαλήθευση ταυτότητας",
                  "it": "Verifica dell identità",
                  "de": "Identitätsprüfung",
                  "ru": "Проверка удостоверения личности",
                  "uz": "Shaxsni tasdiqlash",
                  "ro": "Verificare a identității",
                  "tr": "Kimlik doğrulama",
                  "ar": "التحقق من الهوية",
                  "pl": "Weryfikacja tożsamości",
                  "bn": "পরিচয় যাচাই",
                  "hi": "पहचान सत्यापन",
                  "hy": "Անձնագրի հաստատում",
                  "az": "Şəxsiyyətin təsdiqi",
                  "ja": "本人確認",
                  "pt": "Verificação de identidade",
                  "fr": "Vérification d identité",
                  "kk": "Жеке басын тексеру",
                  "sv": "ID-verifiering"
            },
                "type": "identity-document",
                "key": "select_document_id-1",
                "flags": {
                    "document_types": [
                        "id",
                        "passport",
                        "driver_license",
                        "residence_license"
                    ],
                    "allow_document_upload": false,
                    "disable_document_capture": false
                }
            }
    ]
}'
```

</details>

***

### Identity document verification

The Identity Document step involves users scanning or uploading photos of their ID documents.

**Identity document step configurations:**

* **Title:** `ID verification`
* **Type**: `identity-document`
* **Key**: `identity-document`
* **Flags:**&#x20;
  * disable\_document\_capture&#x20;
  * allow\_document\_upload&#x20;
  * document\_types&#x20;
  * document\_countries

<table data-full-width="true"><thead><tr><th width="234.47265625">Flag</th><th width="448">Description</th><th width="119.3828125">Default</th><th width="149.3515625">Type</th></tr></thead><tbody><tr><td><code>disable_document_capture</code></td><td>Disables live document scanning. Users can only upload images of their documents.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>allow_document_upload</code></td><td>Enables the option to either scan or upload the document.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>allow_nfc_capture</code><br><br></td><td>Enables NFC chip reading for supported identity documents (e.g. biometric passports and IDs).<br>When enabled, users can scan the document’s NFC chip using a compatible device.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>document_types</code></td><td><p>A list of allowed document types.<br></p><p>Possible values:</p><pre data-overflow="wrap"><code>"id", "passport", "driver_license", "residence_license"
</code></pre></td><td>All types</td><td>Array&#x3C;string></td></tr><tr><td><code>document_countries</code></td><td>Restricts accepted document issuers to specific country codes. (e.g., <code>"USA", "DEU", "ITA"</code>)</td><td>Unrestricted</td><td>Array&#x3C;string></td></tr><tr><td><code>optional_continue_on_another_device</code></td><td>Allows users to optionally switch to another device to continue the session.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with  **`return_url`** & **`language`** flags and an **`identity-document`** verification step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "return_url": "https://example.com/",
        "language": "es"
    } ,
    "steps": [
     {
            "title": {
                "es": "ID verification"
            },
            "type": "identity-document",
            "key": "select_document_id",
            "flags": {
                "allow_document_upload": true,
                "document_types": [
                    "id",
                    "passport",
                    "driver_license",
                    "residence_license"
                ]
            }
        }
    ]
}'
```

</details>

#### **Document data review**&#x20;

When enabled, users are presented with a review page after document scanning, where they can verify and correct the extracted data before submission.

To enable Document data review, add a `review` object to the step configuration:

<table><thead><tr><th width="139.65234375">Flag</th><th width="352.6171875">Description</th><th width="119.2421875">Default</th><th width="158.55078125">Type</th></tr></thead><tbody><tr><td><code>check</code></td><td>Enables the Document data review page.</td><td><code>false</code></td><td><code>&#x3C;boolean></code></td></tr><tr><td><code>allowedUsers</code></td><td>Defines who can edit the extracted data on the review page. <br>Possible values: <code>"client"</code> (the end user completing the verification), <code>"operator"</code> (operator supervising the session).</td><td>—</td><td><code>Array&#x3C;string></code></td></tr><tr><td><code>fields</code></td><td>A map of OCR fields to include in the review page. Each field can be configured with <code>editable</code> and <code>mandatory</code> properties.</td><td>—</td><td><code>Object</code></td></tr></tbody></table>

**Field configuration properties:**

<table><thead><tr><th width="120.27734375">Flag</th><th width="461.484375">Description</th><th>Type</th></tr></thead><tbody><tr><td><code>type</code></td><td>Data type of the field. Possible values: <code>"string"</code>, <code>"datestring"</code></td><td><code>&#x3C;string></code></td></tr><tr><td><code>editable</code></td><td>Whether the user or operator can edit this field.</td><td><code>&#x3C;boolean></code></td></tr><tr><td><code>mandatory</code></td><td>Whether the field must be filled before submission.</td><td><code>&#x3C;boolean></code></td></tr></tbody></table>

**Configurable fields:**

| Field                  | Key                    | Component        |
| ---------------------- | ---------------------- | ---------------- |
| First Name (Eng.)      | `firstNameEn`          | Text input       |
| First Name (Local)     | `firstNameLocal`       | Text input       |
| Middle Name (Eng.)     | `middleNameEn`         | Text input       |
| Middle Name (Local)    | `middleNameLocal`      | Text input       |
| Last Name (Eng.)       | `lastNameEn`           | Text input       |
| Last Name (Local)      | `lastNameLocal`        | Text input       |
| Father's Name (Eng.)   | `fatherNameEn`         | Text input       |
| Father's Name (Local)  | `fatherNameLocal`      | Text input       |
| Date of Birth          | `dateOfBirth`          | Date picker      |
| Place of Birth         | `placeOfBirth`         | Text input       |
| Sex                    | `sex`                  | Radio button     |
| Citizenship            | `citizenship`          | Country dropdown |
| Nationality            | `nationality`          | Country dropdown |
| Document Number        | `documentNumber`       | Text input       |
| Authority              | `authority`            | Text input       |
| Document Expires On    | `documentExpireDate`   | Date picker      |
| Document Issuing Date  | `documentIssuingDate`  | Date picker      |
| Document Issuing State | `documentIssuingState` | Country dropdown |
| Personal Number        | `personalNumber`       | Text input       |
| Address                | `address`              | Textarea         |
| State                  | `state`                | Text input       |

**Source trust hierarchy**

Fields populated from a trusted source are permanently **read-only**, regardless of the `editable` configuration. This rule is enforced at the backend level and cannot be overridden.

The following sources produce non-editable fields:

* `NFC`
* `MRZ`
* `QR`

**Example configuration:**

<details>

<summary><em>Expand to view example</em></summary>

```bash
{
  "type": "identity-document",
  "key": "select_document_id",
  "title": { "en": "ID verification" },
  "flags": {
    "document_types": ["id", "passport", "driver_license", "residence_license"],
    "allow_document_upload": true,
    "disable_document_capture": false
  },
  "review": {
    "check": true,
    "allowedUsers": ["client", "operator"],
    "fields": {
      "firstNameEn":          { "type": "string",     "editable": true, "mandatory": true },
      "firstNameLocal":       { "type": "string",     "editable": true, "mandatory": true },
      "middleNameEn":         { "type": "string",     "editable": true, "mandatory": true },
      "middleNameLocal":      { "type": "string",     "editable": true, "mandatory": true },
      "lastNameEn":           { "type": "string",     "editable": true, "mandatory": true },
      "lastNameLocal":        { "type": "string",     "editable": true, "mandatory": true },
      "fatherNameEn":         { "type": "string",     "editable": true, "mandatory": true },
      "fatherNameLocal":      { "type": "string",     "editable": true, "mandatory": true },
      "dateOfBirth":          { "type": "datestring", "editable": true, "mandatory": true },
      "placeOfBirth":         { "type": "string",     "editable": true, "mandatory": true },
      "sex":                  { "type": "string",     "editable": true, "mandatory": true },
      "citizenship":          { "type": "string",     "editable": true, "mandatory": true },
      "nationality":          { "type": "string",     "editable": true, "mandatory": true },
      "documentNumber":       { "type": "string",     "editable": true, "mandatory": true },
      "authority":            { "type": "string",     "editable": true, "mandatory": true },
      "documentExpireDate":   { "type": "datestring", "editable": true, "mandatory": true },
      "documentIssuingDate":  { "type": "datestring", "editable": true, "mandatory": true },
      "documentIssuingState": { "type": "string",     "editable": true, "mandatory": true },
      "personalNumber":       { "type": "string",     "editable": true, "mandatory": true },
      "address":              { "type": "string",     "editable": true, "mandatory": true },
      "state":                { "type": "string",     "editable": true, "mandatory": true }
    }
  }
}
```

</details>

***

### **Liveness check**

The **Liveness** step verifies that the user is physically present by analyzing a live facial image or video.

Identomat supports two types of liveness verification:

* **Passive liveness:** The user aligns their face within an oval frame while the system captures a short (approx. 2-second) video.
* **Active liveness:** The user performs specific actions to confirm their presence as a live person.

**Liveness check step configurations:**

* **Title:** `Liveness`
* **Type**: `liveness`
* **Key**: `liveness`
* **Flags:**&#x20;
  * liveness
  * allow\_face\_upload
  * adaptive\_liveness
  * instructions

<table data-full-width="true"><thead><tr><th width="215.96484375">Flag</th><th width="466.70703125">Description</th><th width="158.09765625">Default</th><th width="149.48046875">Type</th></tr></thead><tbody><tr><td><code>liveness</code></td><td><p>Defines the type of liveness check:</p><ul><li><code>true</code>: active liveness</li><li> <code>false</code>: passive liveness</li></ul></td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>allow_face_upload</code></td><td><p>Allows the user to upload a selfie instead of using the camera.</p><p><br>⚠️ <em>This flag is ignored if <code>liveness</code> is <code>true</code>, as active checks require live input.</em></p></td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>optional_continue_on_another_device</code></td><td>Allows users to optionally switch to another device to continue the session.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>adaptive_liveness</code></td><td>(SDKs only) Enables the new <strong>Adaptive liveness</strong> experience with improved UI and detection. Must be <code>true</code> to use Adaptive Liveness.<br>⚠️ If <code>adaptive_liveness</code> is <code>true</code>, the <code>liveness</code> flag <strong>must</strong> be <code>false</code>.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>instructions</code></td><td>Defines the actions the user must perform for Adaptive Liveness. <br>Only applicable if <code>adaptive_liveness</code> is <code>true</code>.<br>Currently supported option: <code>[ "smile" ]</code>.<br></td><td><code>[ "smile" ]</code></td><td>Array&#x3C;string></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`document_countries`** & **`language`** flags and **`identity-document`** verification & *active* **`liveness`** steps:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "language": "en"
    },
    "steps": [
        {
            "title": {
                "en": "ID verification"
                },
            "type": "identity-document",
            "key": "select_document_id",
            "flags": {
                "allow_document_upload": true,
                "document_types": [
                    "id",
                    "passport",
                    "driver_license",
                    "residence_license"
                ],
                "document_countries": [
                    "USA",
                    "FRA"
                ]
            }
        },
        {
            "title": {
                "en": "Liveness check"
                },
            "type": "liveness",
            "key": "liveness",
            "flags": {
                "liveness": true
            }
        }
    ]
}'
```

</details>

***

### Proof of Address

The POA step includes verification of Proof of Address and analysis of other types of documents. This step supports a wide range of general document types, such as utility bills or bank statements.

**Proof of Address step configurations:**

* **Title:** `Proof of Address`
* **Type**: `general-document`
* **Key**: `select_general_document`
* **Flags:**&#x20;
  * general\_document\_types

<table data-full-width="true"><thead><tr><th width="224.64453125">Flag</th><th width="431.55859375">Description</th><th width="172">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>general_document_types</code></td><td><p>A list of allowed document types.<br>If omitted or set to an empty array, all document types will be available for upload.</p><p></p><p>Possible values:</p><pre data-overflow="wrap"><code>"bank_statement", "utility_bill", "yellow_slip", "drivers_license", "vehicle_registration_certificate"
</code></pre></td><td>All types</td><td>&#x3C;array></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`optional_continue_on_another_device`** & **`language`** flags and **`liveness`**  &  **`general-document`** steps:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "optional_continue_on_another_device": true,
        "language": "en"
},
"steps": [
    {
        "title": {
            "en": "Liveness check"
            },
        "type": "liveness",
        "key": "liveness",
        "flags": {
            "liveness": true
        }
    },
    {
        "title": {
            "en": "Proof of address"
            },
        "type": "general-document",
        "key": "select_general_document",
        "flags": {
            "general_document_types": [
                "bank_statement",
                "utility_bill",
                "yellow_slip",
                "drivers_license",
                "vehicle_registration_certificate"
            ]
        }
    }
]
}'
```

</details>

***

### Selfie with ID

In the Selfie with ID step, users are required to hold their document in their hands so that both their face and the document are visible.

**Selfie with ID step configurations:**

* **Title:** `Selfie with ID`
* **Type**: `face-document`
* **Key**: `capture_face_document`
* **Flags:**&#x20;
  * allow\_face\_doc\_upload
  * require\_face\_document

<table data-full-width="true"><thead><tr><th width="209.796875">Flag</th><th width="391.66796875">Description</th><th width="172">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>allow_face_doc_upload</code></td><td>Allows users to upload an image of themselves holding the document.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>require_face_document</code></td><td>Requires users to capture themselves holding the document live.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>optional_continue_on_another_device</code></td><td>Allows users to optionally switch to another device to continue the session.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`restrict_url_sharing`** & **`language`** flags and  **`face-document`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "restrict_url_sharing": true,
        "language": "en"
},
"steps": [
    {
        "title": {
            "en": "Selfie with ID"
            },
        "type": "face-document",
        "key": "capture_face_document",
        "flags": {
            "allow_face_doc_upload": true,
            "require_face_document": true
        }
    }
]
}'
```

</details>

***

### Video call

In the Video call step, the user connects with an operator for a live verification. This can include any of the Identomat verification steps.

Identomat offers two call modes:

* **One-on-one:** Involves a secure video call between a customer and a verification operator
* **Multi-user call:** Enables the verification of multiple customers within a single session. Each user can follow their own customized workflow tailored to the specific business process.

**Video call step configurations:**

* **Title:** `Video call`
* **Type**: `video-call`
* **Key**: `video-call`
* **Array** of  `steps`
* **resetSteps**: `true/false` *(optional)*
* **hideCameraOption**: `true/false` *(optional)*
* **nameRequired***:* `true/false` *(optional)*
* **multiple\_participants:** `true/false` *(optional)*

<table data-full-width="true"><thead><tr><th width="211.5390625">Flag</th><th width="448">Description</th><th width="172">Default</th><th width="121" valign="middle">Type</th></tr></thead><tbody><tr><td><code>steps</code></td><td>List of steps to run during the video call (except <code>language</code> and <code>operator_questionnaire</code>).</td><td><code>[ ]</code></td><td valign="middle">&#x3C;array></td></tr><tr><td><code>resetSteps</code></td><td>If true, user verification data resets when they rejoin the call. </td><td><code>false</code></td><td valign="middle">&#x3C;boolean></td></tr><tr><td><code>hideCameraOption</code></td><td>Enabling this will hide the camera icon, preventing users from turning off the camera.</td><td><code>false</code></td><td valign="middle">&#x3C;boolean></td></tr><tr><td><code>nameRequired</code></td><td>Requires users to enter their name before joining.</td><td><code>false</code></td><td valign="middle">&#x3C;boolean></td></tr><tr><td><code>multiple_participants</code></td><td>Enables multi-user video sessions.</td><td><code>false</code></td><td valign="middle">&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`return_url`** & **`language`** flags and  **`video-call`** with **`identity-document`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "return_url": "https://example.com/",
        "language": "es"
},
"steps": [
    {
            "type": "video-call",
            "title": {
                "es": "video-call"
                },
            "key": "video-call",
            "steps": [
                {
                    "title": {
                        "es": "ID verification"
                        },
                    "type": "identity-document",
                    "key": "select_document_id",
                    "flags": {
                        "document_types": [
                            "id",
                            "passport",
                            "driver_license",
                            "residence_license"
                        ]
                    }
                }
            ]
        }
]
}'
```

</details>

***

### Phone number

Phone number verification allows users to verify or submit their phone number.

Phone number step may include:

* **Verification** of the user's phone number using an OTP code.&#x20;
* **Collection** of the user's phone number.&#x20;

**Phone number step configurations:**

* **Type**: `phone-number`
* **Key**: `phone_number`
* **Flags:**&#x20;
  * require\_phone\_number\_check
  * require\_phone\_number

<table data-full-width="true"><thead><tr><th width="252.58984375">Flag</th><th width="391.9375">Description</th><th width="172">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>require_phone_number_check</code></td><td>Requires users to verify their number via an OTP code.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>require_phone_number</code></td><td>Requires users to submit a phone number without verification.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`return_url`** & **`language`** flags and  **`phone-number`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "return_url": "https://example.com/",
        "language": "it"
},
"steps": [
    {
        "title": {
            "it": "Phone number verification"
            },
        "type": "phone-number",
        "key": "phone_number",
        "flags": {
            "require_phone_number_check": true
        }
    }
]
}'
```

</details>

***

### Email

The Email step allows users to verify or submit their email address.

Email step may include:

* **Verification** of the user's email using an OTP code.&#x20;
* **Collection** of the user's email.

**Email step configurations:**

* **Type**: `email`
* **Key**: `require_email`
* **Flags:**
  * require\_email\_check
  * require\_email

<table data-full-width="true"><thead><tr><th width="215">Flag</th><th width="360">Description</th><th width="112">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>require_email_check</code></td><td>Requires email verification via an OTP code.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>require_email</code></td><td>Requires users to submit an email without verification.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`return_url`** & **`language`** flags and  **`email`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "return_url": "https://example.com/",
        "language": "en"
},
"steps": [
    {
        "title": {
            "en": "Email verification"
            },
        "type": "email",
        "key": "require_email",
        "flags": {
            "require_email_check": true
        }
    }
]
}'
```

</details>

***

### Geolocation

The Geolocation step requests the user’s location data by prompting for browser permission.

**Geolocation step configurations:**

* **Type**: `geolocation`
* **Key**: `require_geolocation`
* **Flags:**&#x20;
  * require\_geolocation

<table data-full-width="true"><thead><tr><th width="280">Flag</th><th width="448">Description</th><th width="172">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>require_geolocation</code></td><td>Requires location access to proceed through the step.</td><td><code>true</code></td><td>&#x3C;boolean></td></tr></tbody></table>

#### **cURL example:**

Example using cURL with **`return_url`** & **`language`** flags and  **`geolocation`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "return_url": "https://example.com/",
        "language": "en"
},
"steps": [
    {
        "title": {
            "en": "Geolocation"
            },
        "type": "geolocation",
        "key": "require_geolocation",
        "flags": {
            "require_geolocation": true
        }
    }
]
}'
```

</details>

***

### **SSN verification**

The SSN verification step verifies a user's Social Security Number as part of the identification process.

**SSN verification step configurations:**

* **Title:** `SSN verification`
* **Type**: `ssn`
* **Key**: client-defined, must remain unique within the session

#### **cURL example:**

Example using cURL with **`return_url`** & **`language`** flags and an **`ssn`** step:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "return_url": "https://example.com/",
        "language": "en"
    },
    "steps": [
        {
            "type": "ssn",
            "title": {
                "en": "SSN verification"
            },
            "key": "ssn-gk466q"
        }
    ]
}'
```

</details>

***

### User questionnaire

The user questionnaire step allows you to collect custom user input as part of the verification flow. It supports various question types and provides multilingual support for titles and descriptions. All responses are saved to the verification session. This step has a slightly different structure compared to other steps.

**User questionnaire step configurations:**

* `type`

  Must be set to `"user-questionnaire"` to define this step as a user questionnaire block.
* `key` \
  A client-defined unique key for this questionnaire step. It must remain unique within a single session to avoid conflicts.
* `title` \
  The main title of the questionnaire displayed on the user interface.\
  Must always be provided as an \<object> with language codes as keys (e.g., `"en"`), even if only one language is used. This ensures consistency and supports future localization.
* `description` \
  Text displayed beneath the title in the user interface, providing context or instructions.\
  Must always be an \<object> of language codes. Same format and rules as `title`.
* `questions` \
  An \<array> of question objects to be presented to the user.\
  Supported question types include:
  * `string`: **Short answer** – The user enters a short text answer.
  * `multiple-choice`: **Checkboxes** – Allows the user to select one or more options.
  * `options`: **Radio** – The user selects a single option from a list.
  * `dropdown` : **Dropdown List** – The user selects one or more options from a dropdown menu.
  * `file`: **File Upload** – Allows the user to upload a file as a response.
  * `attachment`: **Attachment -** Allows attaching files either dynamically (via API/configuration) or per session. Depending on configuration, files may be pre-attached for the user or uploaded by the operator during the session.
* `successButtonTitle`\
  Defines the label of the confirmation button displayed at the end of the questionnaire.\
  Must also be an \<object> of language codes, even if only one language is used.\
  If any question is marked as `"mandatory": true`, the button will remain disabled until all required questions are answered.

#### **Questions**

Each question in the `questions` array supports a set of parameters that define how it behaves and appears to the user. Here's a breakdown of all supported properties:

* `type`\
  Defines the question type. \
  Supported values:
  * `string` – Short answer
  * `multiple-choice` – Checkbox (multiple selection)
  * `options` – Radio buttons (single selection)
  * `dropdown` – Dropdown menu (single or multi-select)
  * `file` – File upload
  * `attachment` - Attach files and share with the end-user
* `title`\
  A multilingual \<object> representing the question label.\
  Example:

```json
"title": {
  "en": "What is your occupation?",
  "fr": "Quelle est votre profession ?"
}
```

* `key`\
  A **unique identifier** for the question within the same questionnaire. This is client-defined and used for referencing and data mapping.
* `mandatory`\
  Indicates whether the question must be answered before the user can proceed.
  * Value: `true` or `false`
* `answer` \
  Allows you to **preset an answer** for the user.

  * `string`: A plain text string (e.g., `"John Doe"`).
  * `options`: A single option key (e.g., `"opt_a"`).
  * `multiple-choice`: An array of option keys (e.g., `["opt_a", "opt_c"]`).
  * `dropdown`: Not applicable.
  * `file`: Not applicable.
  * `attachment`: An array of file IDs

  *Note: End-users* can modify pre-filled answers unless `readOnly` is enabled.
* `readOnly` \
  Displays the question in a **non-editable** state. Users can view the question and answer but cannot change it.
  * Value: `true` or `false`
* `showConditions` \
  Defines a **conditional display rule** for the question, based on the answer to a previous question.
  * `questionKey`  Key of the controlling question.
  * `answer`  Key of the answer (for radio/checkbox) or specific text (for string)

```json
"showConditions": {
  "questionKey": "employment-status",
  "answer": "self-employed"
}
```

* `multiple`\
  Specific to `dropdown` type.
  * If `true`, the user can select **multiple values** from the dropdown.
  * Value: `true` or `false`

#### **Options**

Options are used exclusively in `multiple-choice` , `options` and `dropdown` type questions. They define the selectable choices that the user can pick from.

Each question that supports options must include the following parameter:

* `options` \
  An \<array> of option objects for the question. Each object must include the following:
* `title`\
  The text label for the option, shown to the user during the verification flow.\
  Must always be provided as an \<object> with language codes as keys, even if only one language is used.\
  This ensures consistency across multilingual flows. \
  Example:

```json
{
  "en": "Self-employed"
}
```

* `key`\
  A unique identifier for the option within the questionnaire.\
  This value is used for referencing in preset answers, conditions, and session data.\
  It must be unique within the same questionnaire to avoid conflicts.

#### **List of parameters with examples:**

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the questionnaire shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "terms-and-conditions"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title of the user questionnaire, displayed as the block title on the user's side. The title can be an &#x3C;object> containing different <strong>languages</strong>, allowing the title to be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title on the user's side. Similar to the title, the description can be an &#x3C;object> containing different <strong>languages</strong>, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>questions</code></td><td>An &#x3C;array>  of questions with the following types: <code>string</code>, <code>multiple-choice</code> , <code>options</code>, <code>dropdown</code>.</td><td>-</td><td>&#x3C;array></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"questions": [
    {
    "type": "string",
    "title": { 
        "es": "Tu título",
        "en": "Your title"
        }
    "key": "question1",
    "mandatory": true
    },
    {
    "type": "multiple-choice",
    "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
    "key": "question2",
    "mandatory": false,
    "options": [
        {
        "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
        "key": "option1"
        },
        { 
        "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
        "key": "option2"
        }
    ]
    }
]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": false
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.</td><td>-</td><td>&#x3C;string> or &#x3C;array></td><td><pre class="language-json"><code class="lang-json">"answer": "option2"
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": false
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr><tr><td><code>successButtonTitle</code></td><td>The title of the action button in the questionnaire. If the questions are mandatory, the button is deactivated until the user completes the questionnaire.</td><td>Confirm</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"successButtonTitle": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr></tbody></table>

#### **cURL example:**

<details>

<summary><em>Expand to view user-questionnaire example</em></summary>

<pre class="language-bash"><code class="lang-bash">curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "restrict_url_sharing": true,
        "language": "es"
},
"steps": [
    {
            "key": "questionnaire-page-1",
            "type": "user-questionnaire",
            "title": { 
                "es": "Tu título",
                "en": "Your title"
<strong>                },
</strong>            "description": {
                "es": "Tu descripción",
                "en": "Your description"
                },
            "questions": [
                {
                "type": "string",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question1",
                "mandatory": true
                },
                {
                "type": "multiple-choice",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question2",
                "mandatory": false,
                "options": [
                    {
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option1"
                    },
                    { 
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option2"
                    }
                ],
                "answer": ["option2"],
                "readOnly": true
                },
                {
                "type": "options",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question3",
                "mandatory": true,
                "options": [
                    {
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option3"
                    },
                    { 
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option4"
                    }
                ]
            }
        ]
    }
]
}'
</code></pre>

</details>

#### **Question type: Short answer**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="117.875">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>string</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "string"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "your-address"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>format</code></td><td>Specifies the expected structure of the user’s response. Determines how the input is validated.</td><td><code>free-text</code></td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"format": {
    "type": "free-text"
}
</code></pre><pre class="language-json"><code class="lang-json">"format": {
    "type": "email"
}
</code></pre><pre><code>"format": {
    "type": "contactNumber"
}
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the prefilled answer can be displayed in different languages.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": { 
        "en": "This is a prefilled answer",
        "es":"Esta es una respuesta prellenada."
}
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view SHORT ANSWER question example</em></summary>

```json
"questions": [
    {
        "type": "string",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question1",
        "mandatory": true,
        "format": {
            "type": "email"
        },
        "answer": {
            "en": "This is a prefilled answer",
            "es": "Esta es una respuesta prellenada."
        },
        "showConditions": {
            "questionKey": "question1",
            "answer": "option1"
        },
        "readOnly": false
    }
]
```

</details>

***

#### **Question type: Checkbox**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>multiple-choice</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "multiple-choice"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "check-two-answers"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;array> <strong>of option keys</strong> assigned to this question.</td><td>-</td><td>&#x3C;array></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": [
    "option-1",
    "option-2"
]
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view CHECKBOX question example</em></summary>

```json
"questions": [
    {
        "type": "multiple-choice",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question2",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "answer": [
                "identity-document",
                "proof-of-address"
            },
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            },
            "readOnly": true
        }
    ]
```

</details>

***

#### **Question type: Radio**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>options</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "options"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-one-answer"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;string> <strong>of an option key</strong> assigned to this question.</td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": "option-1"
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view RADIO question example</em></summary>

```json
"questions": [
    {
        "type": "options",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question3",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "answer": "identity-document",
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            },
            "readOnly": true
        }
    ]
```

</details>

***

#### **Question type: Dropdown**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>dropdown</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "dropdown"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-from-list"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>multiple</code></td><td><p>Specifies whether the question is single or multiple choice.</p><p></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"multiple": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view DROPDOWN question example</em></summary>

```json
"questions": [
    {
        "type": "options",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question4",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "multiple": true,
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            }
        }
    ]
```

</details>

***

#### **Question type: File upload**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>file</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "file"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-from-list"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  <code>&#x3C;object></code> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title. Similar to the title, the description can be an &#x3C;object> containing different languages, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>fileTypes</code></td><td>Specifies the types of files the user is allowed to upload.<br><br>Possible values:<br> <code>pdf</code>, <code>image</code>.</td><td>[ <code>"pdf"</code>, <code>"image"</code> ]</td><td>&#x3C;array></td><td><p></p><pre class="language-json"><code class="lang-json">"fileTypes": [
    "pdf",
    "image"
]
</code></pre></td></tr><tr><td><code>filesMaxCount</code></td><td>Specifies the maximum number of files the user is allowed to upload.<br><br>Possible values:<br>A number from 1 to 10.</td><td>10</td><td>&#x3C;number></td><td><pre class="language-json"><code class="lang-json">"filesMaxCount": 5
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view FILE UPLOAD question example</em></summary>

```json
"questions": [
    {
        "type": "file",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question5",
            "mandatory": true,
            "fileTypes": [
            "pdf",
            "image"
            ],
            "filesMaxCount": 5,
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            }
        }
    ]
```

</details>

***

#### **Question type: Attachment**

The **Attachment** question type allows attaching files to a questionnaire. It supports two main use cases:

1. **Operator-added attachments per session**\
   The operator uploads files during or before the verification session and shares them with the end-user.
2. **Predefined attachments from Configuration or API**\
   Files are uploaded in the Configuration interface or dynamically provided via API. These files are automatically included in future sessions.

**Behavior**

* Attachments are visible to both the operator and the end-user.
* When files are provided via API (`answer`) or Configuration, they will appear when the questionnaire is opened.
* Depending on settings, the operator may be allowed or restricted from modifying attachments after the user has confirmed the questionnaire.

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>attachment</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "attachment"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "attached-documents"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  <code>&#x3C;object></code> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title. Similar to the title, the description can be an &#x3C;object> containing different languages, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>fileTypes</code></td><td>Specifies the types of files the user is allowed to upload.<br><br>Possible values:<br> <code>pdf</code>, <code>image</code>.</td><td>[ <code>"pdf"</code>, <code>"image"</code> ]</td><td>&#x3C;array></td><td><p></p><pre class="language-json"><code class="lang-json">"fileTypes": [
    "pdf",
    "image"
]
</code></pre></td></tr><tr><td><code>filesMaxCount</code></td><td>Specifies the maximum number of files the user is allowed to upload.<br><br>Possible values:<br>A number from 1 to 10.</td><td>10</td><td>&#x3C;number></td><td><pre class="language-json"><code class="lang-json">"filesMaxCount": 5
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr><tr><td><code>allowOperatorUpload</code></td><td>Controls how files are added:<br>• <strong>true</strong> – operator uploads files per session.<br>• <strong>false</strong> – files are provided via Configuration or API only.</td><td>true</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"allowOperatorUpload": true
</code></pre></td></tr><tr><td><code>allowOperatorOverride</code></td><td>If <strong>false</strong>, the operator cannot edit attachments after the user confirms the questionnaire. <br>If <strong>true</strong>, the operator may still upload or remove files.</td><td>true</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"allowOperatorOverride": true
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view ATTACHMENT question example</em></summary>

```json
"questions": [
    {
        "type": "attachment",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "description": {
            "es": "Tu descripción",
            "en": "Your description"
            },
        "key": "question5",
        "fileTypes": [
            "pdf",
            "image"
            ],
        "filesMaxCount": 5,
        "allowOperatorUpload": true,
        "allowOperatorOverride": true,
        "answer": [ ],
        "showConditions": {
            "questionKey": "question1",
            "answer": "option1"
            }
        }
    ]
```

</details>

***

### Operator questionnaire

The operator questionnaire is part of the session and is designed to be filled out by the **operator**, either during or after the verification call. It allows operators to collect specific information or provide manual input.\
Its structure closely mirrors the user questionnaire, with the main difference being who completes the form.

**Operator questionnaire step configurations:**

* `type`\
  Must be set to `"operator-questionnaire"` to define this step as an operator-facing form.
* `key` \
  A unique identifier for the operator questionnaire step. This key is defined by the client and must remain unique within a single session.
* `title` \
  The name of the section as shown in the operator interface.\
  Must always be an \<object> with language codes as keys, even if only one language is used.\
  Example:

```json
"title": {
  "en": "Operator notes"
}
```

* `description` \
  Text displayed under the title, used to give context or instructions to the operator.\
  Also must be provided as an `<object>` of language codes.
* `questions`\
  An \<array> of question objects that define the fields the operator will fill out.\
  Supported question types include:
  * `string`: **Short answer** – Operator types a short answer as plain text.
  * `multiple-choice`: **Checkbox** – Operator selects one or more values from a list of options.
  * `options`: **Radio** – Operator selects one option from a predefined set.
  * `dropdown`: **Dropdown menu** – The operator selects one or more options from a dropdown list, depending on configuration.
  * `file`: **File upload** – The operator uploads one or more files (e.g., documents or images) as part of the questionnaire.

#### **Questions**

Each question in the Operator Questionnaire must be defined as an object within the `questions` array. The following parameters are supported for each question:

* `type` \
  The type of question. Supported values are:
  * `string` – Short answer
  * `multiple-choice` – Checkbox
  * `options` – Radio buttons
  * `dropdown` – Dropdown list
  * `file` – File upload
* `title`\
  The question title. There are no length or symbol restrictions. \
  Must always be provided as an \<object> of language codes (e.g., `"en"`, `"de"`), even if only one language is used.\
  Example:

```json
"title": {
  "en": "Reason for rejection"
}
```

* `key`\
  A unique identifier for the question, defined by the client. It must be unique within the same questionnaire.
* `mandatory`\
  \<boolean>. Indicates whether the question must be answered before submitting the questionnaire.\
  Default is `false`.
* `answer`\
  Allows you to **preset an answer** for the operator.

  * For `string`: A plain text string (e.g., `"Invalid ID"`).
  * For `options`: A single option key (e.g., `"opt_a"`).
  * For `multiple-choice`: An array of option keys (e.g., `["opt_a", "opt_c"]`).
  * For `dropdown`: Not applicable.
  * For `file`: Not applicable.

  *Note:* Operators can modify pre-filled answers unless `readOnly` is enabled.
* `readOnly`\
  Displays the question in a **non-editable** state. Operators can view the question and answer but cannot change it.
* `showConditions`\
  Defines a **conditional display rule** for the question, based on the answer to a previous question.
  * `questionKey` Key of the controlling question.
  * `answer` Key of the answer (for radio/checkbox) or specific text (for string).

```json
"showConditions": {
  "questionKey": "employment-status",
  "answer": "self-employed"
}
```

#### **Options**

Options are used exclusively in `multiple-choice` , `options` and `dropdown` type questions. They define the selectable choices that the user can pick from.

Each question that supports options must include the following parameter:

* `options`\
  An \<array> of option objects for the question. Each object must include the following:
* `title`\
  The text label for the option, shown to the operator during in the verification session. Must always be provided as an \<object> with language codes as keys, even if only one language is used. This ensures consistency across multilingual flows.

```json
{
  "en": "ID card"
}
```

* `key`\
  A unique identifier for the option within the questionnaire.\
  This value is used for referencing in preset answers, conditions, and session data.\
  It must be unique within the same questionnaire to avoid conflicts.

#### **List of parameters with examples:**

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the questionnaire shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "document-collection"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title of the operator questionnaire, displayed as the tab name in the session. The title can be an <code>&#x3C;object></code> containing different <strong>languages</strong>, allowing the title to be displayed in the selected language.</td><td>-</td><td>&#x3C;string> or &#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>Similar to the title, the description can be an &#x3C;object> containing different <strong>languages</strong>, so that it can be displayed in the selected language.</td><td>-</td><td>&#x3C;string> or &#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>questions</code></td><td>An &#x3C;array>  of questions with the following types: <code>string</code>, <code>multiple-choice</code> and <code>options</code>.</td><td>-</td><td>&#x3C;array></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"questions": [
    {
    "type": "string",
    "title": "Your title",
    "key": "question1",
    "mandatory": true
    },
    {
    "type": "multiple-choice",
    "title": "Your title",
    "key": "question2",
    "mandatory": false,
    "options": [
        {
        "title": "Your title",
        "key": "option1"
        },
        { 
        "title": "Your title",
        "key": "option2"
        }
    ]
    }
]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": false
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.</td><td>-</td><td>&#x3C;string> or &#x3C;array></td><td><pre class="language-json"><code class="lang-json">"answer": "option2"
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": false
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

#### **cURL example:**

<details>

<summary><em>Expand to view operator-questionnaire example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "restrict_url_sharing": true,
        "language": "es"
    },
    "steps": [
        {
            "key": "questionnaire-page-1",
            "type": "operator-questionnaire",
            "title": {
                "es": "Tu título",
                "en": "Your title"
            },
            "description": {
                "es": "Tu descripción",
                "en": "Your description"
            },
            "questions": [
                {
                    "type": "string",
                    "title": {
                        "es": "Tu título",
                        "en": "Your title"
                    },
                    "key": "question1",
                    "mandatory": true
                },
                {
                    "type": "multiple-choice",
                    "title": {
                        "es": "Tu título",
                        "en": "Your title"
                    },
                    "key": "question2",
                    "mandatory": false,
                    "options": [
                        {
                            "title": {
                                "es": "Tu título",
                                "en": "Your title"
                            },
                            "key": "option1"
                        },
                        {
                            "title": {
                                "es": "Tu título",
                                "en": "Your title"
                            },
                            "key": "option2"
                        }
                    ],
                    "answer": [
                        "option2"
                    ],
                    "readOnly": true
                },
                {
                    "type": "options",
                    "title": {
                        "es": "Tu título",
                        "en": "Your title"
                    },
                    "key": "question3",
                    "mandatory": true,
                    "options": [
                        {
                            "title": {
                                "es": "Tu título",
                                "en": "Your title"
                            },
                            "key": "option3"
                        },
                        {
                            "title": {
                                "es": "Tu título",
                                "en": "Your title"
                            },
                            "key": "option4"
                        }
                    ]
                }
            ]
        }
    ]
}'
```

</details>

***

## Additional session parameters

Besides `steps` and `flags`, you can also configure additional parameters when creating a session. These parameters help with session identification and management.

<table data-full-width="true"><thead><tr><th width="218">Parameter name</th><th width="437">Description</th><th width="216">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>name</code></td><td>A custom session label shown in the dashboard before the user completes verification. Once the session is completed, this value is replaced with the verified user's name (if available).</td><td>null</td><td>&#x3C;string></td></tr><tr><td><code>clientUserId</code></td><td>A unique identifier used to link the session to a specific user in your system. This is useful for grouping sessions or syncing with your internal user or account IDs.</td><td>null</td><td>&#x3C;string></td></tr><tr><td><code>groupId</code></td><td>Defines the group assigned to the session. For example, in a video call, only members of this specified group will be able to receive the call.</td><td>null</td><td>&#x3C;string></td></tr><tr><td><code>scheduleStartTime</code></td><td>The datetime when the session becomes available to the end-user. Before this time, the session cannot be started.<br>Format: ISO 8601 — e.g., <code>"2024-06-20T07:33:00.000Z"</code></td><td>null</td><td>&#x3C;string> (ISO 8601 datetime)</td></tr><tr><td><code>scheduleEndTime</code></td><td>The datetime after which the session is no longer accessible to the end-user.<br>Format: ISO 8601 — e.g., <code>"2024-06-20T09:00:00.000Z"</code></td><td>null</td><td>&#x3C;string> (ISO 8601 datetime)</td></tr></tbody></table>

**Example:**

```json
{
  "name": "KYC for John Smith",
  "clientUserId": "user-12345",
  "groupId": "682c60525a91a1e5b473858d",
  "scheduleStartTime": "2024-06-20T07:33:00.000Z",
  "scheduleEndTime": "2024-06-20T09:00:00.000Z",
  "steps": [...],
  "flags": [...]
}
```


# KYB (Know Your Business)

The KYB flow verifies the legitimacy of business entities, including company details, registration documents, and associated representatives.

The **KYB flow** is designed to collect and verify company information, including details about the organization itself, its beneficiaries, and its representatives.\
It ensures that all relevant entities are identified and verified before completing the onboarding process.

The KYB flow consists of three main steps:&#x20;

{% stepper %}
{% step %}
[Company data](#company-data)
{% endstep %}

{% step %}
[Beneficiaries](#beneficiaries)
{% endstep %}

{% step %}
[Review](#review)
{% endstep %}
{% endstepper %}

Each step is fully configurable and can include its own parameters.

## Flags

`flags` is an object that contains optional configuration parameters for adjusting the KYB verification flow.\
Below is a summary of the most commonly used flags:

<table data-full-width="true"><thead><tr><th width="218">Flag name</th><th width="437">Description</th><th width="216">Default</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>skip_face</code></td><td>Skips the <code>liveness</code> step if it already exists in the defined steps. Prevents duplication when using custom flows.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>skip_document</code></td><td>Skips the <code>identity-document</code> step if it already exists in the defined steps. Prevents duplication when using custom flows.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>return_url</code></td><td>URL to redirect the user to after the identification process is completed. If omitted, the session is assumed to be embedded in an iframe.</td><td><code>null</code></td><td>&#x3C;string></td></tr><tr><td><code>language</code></td><td><p>User interface language code. Supported values:</p><pre data-overflow="wrap"><code>"es", "ka", "uk", "ru", "uz", "it", "gr", "tr", "ro", "ar", "de", "pl", "hi", "bn", "az", "ja", "pt", "fr", "kk", "sv"
</code></pre><p></p></td><td><code>"en"</code></td><td>&#x3C;string></td></tr><tr><td><code>skip_desktop</code></td><td>Limits sessions to mobile devices only. If initiated on desktop, a QR code is shown to transfer the session to a mobile device.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr><tr><td><code>switch_device_url</code></td><td>A custom URL to display in the QR code when the camera is unavailable or blocked. If omitted or empty, the QR code will not be displayed.</td><td><code>null</code></td><td>&#x3C;string></td></tr><tr><td><code>restrict_url_sharing</code></td><td>Prevents the session URL from being used on a different browser or device. <br>If <code>true</code>, the QR code will not appear when camera access is denied—unless <code>switch_device_url</code> is also defined.</td><td><code>false</code></td><td>&#x3C;boolean></td></tr></tbody></table>

## Steps

The `steps` array defines the sequence and structure of the KYB process. It is passed together with the `company_key` and `flags` parameters when creating a session.

Each step in the array can contain its own properties:

<table><thead><tr><th width="163.91015625">Property</th><th>Description</th></tr></thead><tbody><tr><td><code>type</code></td><td>The type of the specific step (see list of supported step types below).</td></tr><tr><td><code>key</code></td><td>A unique identifier for the step. This key can be customized but must remain unique within the session.</td></tr><tr><td><code>flags</code></td><td>Step-specific configuration flags that control the behavior of this step.</td></tr><tr><td><code>title</code></td><td>A custom title provided by the client, displayed to the user during this step in the interface.</td></tr></tbody></table>

### **Supported step types**

Below is a list of all step types currently supported in the system:

* [Language](#language)
* [Company data](#company-data)
* [Beneficiaries](#beneficiaries)
* [Review](#review)
* [User questionnaire](#user-questionnaire)

***

### Language

The **Language** step allows the user to select their preferred interface language at the beginning of the identification process.

**Language step configurations:**

* **Title:** `Language`
* **Type**: `language`
* **Key**: `language`
* **Array** of `languages`&#x20;

<table data-full-width="true"><thead><tr><th width="259">Flag</th><th width="448">Description</th><th width="109.34765625">Default</th><th width="130.85546875">Type</th></tr></thead><tbody><tr><td><code>languages</code></td><td><p>An array of language codes to display. If left empty, all supported languages will be shown.</p><pre data-overflow="wrap"><code>"en", "ka", "es", "uk", "gr", "it", "de", "ru", "uz", "ro", "tr", "ar", "pl", "bn", "hi", "hy", "az", "ja", "pt", "fr", "kk", "sv"
</code></pre></td><td>All</td><td>Array&#x3C;string></td></tr></tbody></table>

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
    "company_key": "your_company_key_here",
    "flags": {
        "return_url": "https://example.com/",
        "language": "es"
    } ,
    "steps": [
     {
                "title": {
                  "en": "Language",
                  "ka": "ენა",
                  "es": "Idioma",
                  "uk": "Мова",
                  "gr": "Γλώσσα",
                  "it": "Lingua",
                  "de": "Sprache",
                  "ru": "Язык",
                  "uz": "Til",
                  "ro": "Limbă",
                  "tr": "Dil",
                  "ar": "اللغة",
                  "pl": "Język",
                  "bn": "ভাষা",
                  "hi": "भाषा",
                  "hy": "Լեզու",
                  "az": "Dil",
                  "ja": "言語",
                  "pt": "Idioma",
                  "fr": "Langue",
                  "kk": "Тіл",
                  "sv": "Språk"
                },
                "type": "language",
                "key": "language",
                "languages": [
                    "en",
                    "ka",
                    "es",
                    "uk",
                    "gr",
                    "it",
                    "de",
                    "ru",
                    "uz",
                    "ro",
                    "tr",
                    "ar",
                    "pl",
                    "bn",
                    "hi",
                    "hy",
                    "az",
                    "ja",
                    "pt",
                    "fr",
                    "kk",
                    "sv"
                ]
            },
            {
                "title": {
                  "en": "ID verification",
                  "ka": "პირადობის დადასტურება",
                  "es": "Verificación de identidad",
                  "uk": "Підтвердження особи",
                  "gr": "Επαλήθευση ταυτότητας",
                  "it": "Verifica dell'identità",
                  "de": "Identitätsprüfung",
                  "ru": "Проверка удостоверения личности",
                  "uz": "Shaxsni tasdiqlash",
                  "ro": "Verificare a identității",
                  "tr": "Kimlik doğrulama",
                  "ar": "التحقق من الهوية",
                  "pl": "Weryfikacja tożsamości",
                  "bn": "পরিচয় যাচাই",
                  "hi": "पहचान सत्यापन",
                  "hy": "Անձնագրի հաստատում",
                  "az": "Şəxsiyyətin təsdiqi",
                  "ja": "本人確認",
                  "pt": "Verificação de identidade",
                  "fr": "Vérification d'identité",
                  "kk": "Жеке басын тексеру",
                  "sv": "ID-verifiering"
            },
                "type": "identity-document",
                "key": "select_document_id-1",
                "flags": {
                    "document_types": [
                        "id",
                        "passport",
                        "driver_license",
                        "residence_license"
                    ],
                    "allow_document_upload": false,
                    "disable_document_capture": false
                }
            }
    ]
}'
```

</details>

***

### Company data

This step collects the core information about the company.

* **Title:** `Company data`
* **Description:** `Follow the simple steps below`
* **Type**: `company`
* **Key**: `company`
* **Fields:**
  * Company name (always mandatory)
  * Registration number (always mandatory)
  * Registration country (always mandatory)
  * Type of entity
  * Legal address
  * VAT / Tax ID
  * Date of Incorporation
  * Contact number
  * Contact email address

**Step example:**

```json
{
  "type": "company",
  "key": "company",
  "title": { "en": "Company data" },
  "description": { "en": "Follow the simple steps below" },
  "fields": [...]
}
```

**Step parameters:**

<table data-full-width="true"><thead><tr><th width="224.7890625">Parameter</th><th width="632.81640625">Description</th><th width="121">Type</th></tr></thead><tbody><tr><td><code>type</code></td><td>Step type. Must be <code>company</code>.</td><td>&#x3C;string></td></tr><tr><td><code>key</code></td><td>Unique identifier for the step.</td><td>&#x3C;string></td></tr><tr><td><code>title</code></td><td>Localized title text displayed as the block title to the user. The title can be an &#x3C;object> containing different <strong>languages</strong>, allowing the title to be displayed in the selected language during the flow.</td><td>&#x3C;object></td></tr><tr><td><code>description</code></td><td>A description that appears below the title on the user's side. Similar to the title, the description can be an &#x3C;object> containing different <strong>languages</strong>, so that it can be displayed in the selected language during the flow.</td><td>&#x3C;object></td></tr><tr><td><code>fields</code></td><td>List of fields to be collected during this step.</td><td>&#x3C;array></td></tr></tbody></table>

**Fields:**

Example:

```json
"fields": [
                  { "type": "companyName", "mandatory": true },
                  { "type": "registrationNumber", "mandatory": true },
                  { "type": "registrationCountry", "mandatory": true },
                  { "type": "ownershipPercentage", "mandatory": false },
                  { "type": "companyEntityType", "mandatory": false },
                  { "type": "legalAddress", "mandatory": false },
                  { "type": "taxId", "mandatory": false },
                  { "type": "dateOfIncorporation", "mandatory": false },
                  { "type": "firstName", "mandatory": true },
                  { "type": "lastName", "mandatory": true },
                  { "type": "dateOfBirth", "mandatory": true },
                  { "type": "contactNumber", "mandatory": false },
                  { "type": "email", "mandatory": false }, 
                  { "type": "website", "mandatory": false }
              ]
```

<table data-full-width="true"><thead><tr><th width="237.4921875">Field</th><th width="593.64453125">Description</th><th width="195.2734375">Input type</th></tr></thead><tbody><tr><td><code>companyEntityType</code></td><td><p><strong>Mandatory field.</strong> </p><p>Type of legal entity. Options include:</p><p></p><ul><li>Limited liability company</li><li>Publicly listed company</li><li>Sole proprietor</li><li>Partnership</li><li>Corporation</li><li>Trust</li><li>Private foundation</li><li>Charity</li><li>Nonprofit organization</li><li>Other</li></ul></td><td>Dropdown</td></tr><tr><td><code>companyName</code></td><td><p><strong>Mandatory field.</strong> </p><p>Official registered company name.</p></td><td>Text input</td></tr><tr><td><code>registrationNumber</code></td><td><p><strong>Mandatory field.</strong> </p><p>Company registration number.</p></td><td>Text input</td></tr><tr><td><code>registrationCountry</code></td><td><strong>Mandatory field.</strong> <br>Country of incorporation. Options: all countries list.</td><td>Dropdown</td></tr><tr><td><code>legalAddress</code></td><td>Company’s registered legal address.</td><td>Text input</td></tr><tr><td><code>taxId</code></td><td>Tax identification number.</td><td>Text input</td></tr><tr><td><code>dateOfIncorporation</code></td><td>Company incorporation date.</td><td>Date picker</td></tr><tr><td><code>contactNumber</code></td><td>Company contact phone number.</td><td>Text input</td></tr><tr><td><code>email</code></td><td>Company contact email address.</td><td>Text input</td></tr></tbody></table>

***

### Beneficiaries

The **Beneficiaries step** collects information about all individuals or companies with roles in the organization.

Each role can trigger either a KYC or KYB verification flow.

**Supported roles:**

* **Shareholder** – can be either an individual or another company
* **UBOs (Ultimate Beneficial Owner)** – always an individual with ownership/control
* **Director** – individual member of the board
* **Representative** – authorized individual acting on behalf of the company
* **Other** – custom role (requires position name)

**Step example:**

```json
{
  "type": "beneficiaries",
  "key": "beneficiaries",
  "title": { "en": "Beneficiaries" },
  "description": { "en": "Enter information about the company's beneficiaries" },
  "roles": { ... },
  "kycConfigId": "687e0ba12cf633bd323cb0db",
  "kybConfigId": "687e0ba12cf633bd323cb0d2"
}
```

**Step parameters:**

<table data-full-width="true"><thead><tr><th width="257.1328125">Parameter</th><th width="540.40234375">Description</th><th width="198.234375">Type</th></tr></thead><tbody><tr><td><code>type</code></td><td>Step type. Must be <code>beneficiaries</code>.</td><td>&#x3C;string></td></tr><tr><td><code>key</code></td><td>Unique identifier for the step.</td><td>&#x3C;string></td></tr><tr><td><code>title</code></td><td>Localized title text displayed as the block title to the user. The title can be an &#x3C;object> containing different <strong>languages</strong>, allowing the title to be displayed in the selected language during the flow.</td><td>&#x3C;object></td></tr><tr><td><code>description</code></td><td>A description that appears below the title on the user's side. Similar to the title, the description can be an &#x3C;object> containing different <strong>languages</strong>, so that it can be displayed in the selected language during the flow.</td><td>&#x3C;object></td></tr><tr><td><code>kycConfigId</code></td><td>ID of the KYC configuration applied to individuals.</td><td>&#x3C;string></td></tr><tr><td><code>kybConfigId</code></td><td>ID of the KYB configuration applied to companies.</td><td>&#x3C;string></td></tr><tr><td><code>roles</code></td><td>Defines roles (<code>shareholder</code>, <code>ubo</code>, <code>director</code>, <code>representative</code>, <code>other</code>).</td><td>&#x3C;object></td></tr></tbody></table>

#### **Role: Shareholder**

* Can be either an **individual** or a **company**.
* `verification: true` → triggers a verification flow
  * **Individual** → KYC (`kycConfigId`)
  * **Company** → KYB (`kybConfigId`)

**Important:**\
Pre-created KYC and KYB configurations are required for shareholder verification flows.\
These configurations define which verification steps (e.g., document upload, selfie, questionnaire) will be applied during the process. \
To learn how to create and manage KYC configurations, refer to the [KYC developer's guide](/developer-tools/developer-guide/kyc-know-your-customer) or [KYC configuration guide](/no-code-workflows/kyc-steps).

**Role example:**

```json
"roles": {
        "shareholder": {
              "fields": [
                  { "type": "ownershipPercentage", "mandatory": false },
                  { "type": "companyName", "mandatory": true },
                  { "type": "companyEntityType", "mandatory": false },
                  { "type": "registrationNumber", "mandatory": true },
                  { "type": "registrationCountry", "mandatory": true },
                  { "type": "legalAddress", "mandatory": false },
                  { "type": "taxId", "mandatory": false },
                  { "type": "dateOfIncorporation", "mandatory": false },
                  { "type": "firstName", "mandatory": true },
                  { "type": "lastName", "mandatory": true },
                  { "type": "dateOfBirth", "mandatory": true },
                  { "type": "contactNumber", "mandatory": false },
                  { "type": "email", "mandatory": false }, 
                  { "type": "website", "mandatory": false }
              ],
              "verification": true
        }
}
```

**Shareholder fields:**

<table data-full-width="true"><thead><tr><th width="237.4921875">Field</th><th width="484.6484375">Description</th><th width="111.6953125">Input type</th><th>Applies to</th></tr></thead><tbody><tr><td><code>ownershipPercentage</code></td><td>Percentage of ownership in the company.</td><td>Text input</td><td>Company / Individual</td></tr><tr><td><code>companyName</code></td><td><p><strong>Mandatory field.</strong> </p><p>Official registered company name.</p></td><td>Text input</td><td>Company</td></tr><tr><td><code>registrationNumber</code></td><td><p><strong>Mandatory field.</strong> </p><p>Shareholder company registration number.</p></td><td>Text input</td><td>Company</td></tr><tr><td><code>registrationCountry</code></td><td><strong>Mandatory field.</strong> <br>Country of incorporation. Options: all countries list.</td><td>Dropdown</td><td>Company</td></tr><tr><td><code>companyEntityType</code></td><td><p><strong>Mandatory field.</strong> </p><p>Type of legal entity. Options include:</p><p></p><ul><li>Limited liability company</li><li>Publicly listed company</li><li>Sole proprietor</li><li>Partnership</li><li>Corporation</li><li>Trust</li><li>Private foundation</li><li>Charity</li><li>Nonprofit organization</li><li>Other</li></ul></td><td>Dropdown</td><td>Company</td></tr><tr><td><code>legalAddress</code></td><td>Registered legal address of shareholder company.</td><td>Text input</td><td>Company</td></tr><tr><td><code>taxId</code></td><td>Tax identification number.</td><td>Text input</td><td>Company</td></tr><tr><td><code>dateOfIncorporation</code></td><td>Company incorporation date.</td><td>Date picker</td><td>Company</td></tr><tr><td><code>website</code></td><td>Company website.</td><td>Input</td><td>Company</td></tr><tr><td><code>contactNumber</code></td><td>Contact phone number.</td><td>Text input</td><td>Company / Individual</td></tr><tr><td><code>email</code></td><td>Contact email address.</td><td>Text input</td><td>Company / Individual</td></tr><tr><td><code>firstName</code></td><td><strong>Mandatory field.</strong> <br>Individual's first name.</td><td>Text input</td><td>Individual</td></tr><tr><td><code>lastName</code></td><td><strong>Mandatory field.</strong> <br>Individual's last name.</td><td>Text input</td><td>Individual</td></tr><tr><td><code>dateOfBirth</code></td><td><strong>Mandatory field.</strong> <br>Individual's date of birth.</td><td>Date picker</td><td>Individual</td></tr></tbody></table>

#### **Role: UBOs**

* Always an **individual**.
* `verification: true` → triggers KYC flow (`kycConfigId`)

**Important:**\
Pre-created KYC configuration is required for UBOs verification flows.\
These configurations define which verification steps (e.g., document upload, selfie, questionnaire) will be applied during the process. \
To learn how to create and manage KYC configurations, refer to the [KYC developer's guide](/developer-tools/developer-guide/kyc-know-your-customer) or [KYC configuration guide](/no-code-workflows/kyc-steps).

**Role example:**

```json
"roles": {
            "ubo": {
              "fields": [
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "ownershipPercentage", "mandatory": false },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
        }
}
```

**UBOs fields:**

<table data-full-width="true"><thead><tr><th>Field</th><th>Description</th><th>Input type</th></tr></thead><tbody><tr><td><code>firstName</code></td><td><strong>Mandatory field.</strong> <br>Individual's first name.</td><td>Text input</td></tr><tr><td><code>lastName</code></td><td><strong>Mandatory field.</strong> <br>Individual's last name.</td><td>Text input</td></tr><tr><td><code>dateOfBirth</code></td><td><strong>Mandatory field.</strong> <br>Individual's date of birth.</td><td>Date picker</td></tr><tr><td><code>ownershipPercentage</code></td><td>Percentage of ownership in the company.</td><td>Text input</td></tr><tr><td><code>contactNumber</code></td><td>Company contact phone number.</td><td>Text input</td></tr><tr><td><code>email</code></td><td>Company contact email address.</td><td>Text input</td></tr></tbody></table>

#### **Role: Director**

* Always an **individual**.
* `verification: true` → triggers KYC flow (`kycConfigId`)

**Important:**\
Pre-created KYC configuration is required for Director verification flows.\
These configurations define which verification steps (e.g., document upload, selfie, questionnaire) will be applied during the process. \
To learn how to create and manage KYC configurations, refer to the [KYC developer's guide](/developer-tools/developer-guide/kyc-know-your-customer) or [KYC configuration guide](/no-code-workflows/kyc-steps).

**Role example:**

```json
"roles": {
          "director": {
              "fields": [
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
        }
}
```

**Director fields:**

<table data-full-width="true"><thead><tr><th>Field</th><th>Description</th><th>Input type</th></tr></thead><tbody><tr><td><code>firstName</code></td><td><strong>Mandatory field.</strong> <br>Individual's first name.</td><td>Text input</td></tr><tr><td><code>lastName</code></td><td><strong>Mandatory field.</strong> <br>Individual's last name.</td><td>Text input</td></tr><tr><td><code>dateOfBirth</code></td><td><strong>Mandatory field.</strong> <br>Individual's date of birth.</td><td>Date picker</td></tr><tr><td><code>contactNumber</code></td><td>Company contact phone number.</td><td>Text input</td></tr><tr><td><code>email</code></td><td>Company contact email address.</td><td>Text input</td></tr></tbody></table>

#### **Role: Representative**

* Always an **individual**.
* `verification: true` → triggers KYC flow (`kycConfigId`)

**Important:**\
Pre-created KYC configuration is required for Representative verification flows.\
These configurations define which verification steps (e.g., document upload, selfie, questionnaire) will be applied during the process. \
To learn how to create and manage KYC configurations, refer to the [KYC developer's guide](/developer-tools/developer-guide/kyc-know-your-customer) or [KYC configuration guide](/no-code-workflows/kyc-steps).

**Role example:**

```json
"roles": {
          "representative": {
              "fields": [
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
        }
}
```

**Representative fields:**

<table data-full-width="true"><thead><tr><th>Field</th><th>Description</th><th>Input type</th></tr></thead><tbody><tr><td><code>firstName</code></td><td><strong>Mandatory field.</strong> <br>Individual's first name.</td><td>Text input</td></tr><tr><td><code>lastName</code></td><td><strong>Mandatory field.</strong> <br>Individual's last name.</td><td>Text input</td></tr><tr><td><code>dateOfBirth</code></td><td><strong>Mandatory field.</strong> <br>Individual's date of birth.</td><td>Date picker</td></tr><tr><td><code>contactNumber</code></td><td>Company contact phone number.</td><td>Text input</td></tr><tr><td><code>email</code></td><td>Company contact email address.</td><td>Text input</td></tr></tbody></table>

#### **Role: Other**

* Always an **individual**.
* `verification: true` → triggers KYC flow (`kycConfigId`)

**Important:**\
Pre-created KYC configuration is required for Other role verification flows.\
These configurations define which verification steps (e.g., document upload, selfie, questionnaire) will be applied during the process. \
To learn how to create and manage KYC configurations, refer to the [KYC developer's guide](/developer-tools/developer-guide/kyc-know-your-customer) or [KYC configuration guide](/no-code-workflows/kyc-steps).

**Role example:**

```json
"roles": {
          "other": {
              "fields": [
                { "type": "positionName", "mandatory": true },
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
        }
}
```

**Fields:**

<table data-full-width="true"><thead><tr><th>Field</th><th>Description</th><th>Input type</th></tr></thead><tbody><tr><td><code>positionName</code></td><td><strong>Mandatory field.</strong> <br>Position title (e.g., advisor)</td><td>Text input</td></tr><tr><td><code>firstName</code></td><td><strong>Mandatory field.</strong> <br>Individual's first name.</td><td>Text input</td></tr><tr><td><code>lastName</code></td><td><strong>Mandatory field.</strong> <br>Individual's last name.</td><td>Text input</td></tr><tr><td><code>dateOfBirth</code></td><td><strong>Mandatory field.</strong> <br>Individual's date of birth.</td><td>Date picker</td></tr><tr><td><code>contactNumber</code></td><td>Company contact phone number.</td><td>Text input</td></tr><tr><td><code>email</code></td><td>Company contact email address.</td><td>Text input</td></tr></tbody></table>

***

### Review

The **Review** step presents a summary of all collected company and beneficiary data before submission. Applicants can review and edit information if needed.

Example:

```json
{
  "type": "kyb-review",
  "key": "kyb-review",
  "title": {
    "en": "Checking the data",
    "es": "Verificando los datos"
  },
  "description": {
    "en": "Please check the information below to make sure everything is correct",
    "es": "Por favor revise la información a continuación para asegurarse de que todo esté correcto"
  }
}
```

This step allows the applicant to edit the data before submission.

KYB cURL example:

<details>

<summary><em>Expand to view example</em></summary>

```bash
curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "return_url": "https://example.com/",
        "language": "en"
},
  "steps": [
        {
          "type": "company",
          "key": "company",
          "title": {
            "en": "Company data"
          },
          "description": {
            "en": "Follow the simple steps below"
          },
          "fields": [
               { "type": "companyName", "mandatory": true },
               { "type": "companyEntityType", "mandatory": false },
               { "type": "registrationNumber", "mandatory": true },
               { "type": "registrationCountry", "mandatory": true },
               { "type": "legalAddress", "mandatory": true },
               { "type": "taxId", "mandatory": false },
               { "type": "dateOfIncorporation", "mandatory": false },
               { "type": "contactNumber", "mandatory": false },
               { "type": "email", "mandatory": false }
          ]
        },
        {
          "type": "beneficiaries",
          "key": "beneficiaries",
          "title": {
            "en": "Beneficiaries"
          },
          "description": {
            "en": "Enter information about the company's beneficiaries"
          },
          "kycConfigId": "687e0ba12cf633bd323cb0db",
          "kybConfigId": "687e0ba12cf633bd323cb0d2",
          "roles": {
            "shareholder": {
              "fields": [
                  { "type": "ownershipPercentage", "mandatory": false },
                  { "type": "companyName", "mandatory": true },
                  { "type": "companyEntityType", "mandatory": false },
                  { "type": "registrationNumber", "mandatory": true },
                  { "type": "registrationCountry", "mandatory": true },
                  { "type": "legalAddress", "mandatory": false },
                  { "type": "taxId", "mandatory": false },
                  { "type": "dateOfIncorporation", "mandatory": false },
                  { "type": "firstName", "mandatory": true },
                  { "type": "lastName", "mandatory": true },
                  { "type": "dateOfBirth", "mandatory": true },
                  { "type": "contactNumber", "mandatory": false },
                  { "type": "email", "mandatory": false }, 
                  { "type": "website", "mandatory": false }
              ],
              "verification": true
            },
            "ubo": {
              "fields": [
                { "type": "ownershipPercentage", "mandatory": true },
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
            },
            "director": {
              "fields": [
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
            },
            "representative": {
              "fields": [
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
            },
            "other": {
              "fields": [
                { "type": "positionName", "mandatory": true },
                { "type": "firstName", "mandatory": true },
                { "type": "lastName", "mandatory": true },
                { "type": "dateOfBirth", "mandatory": true },
                { "type": "email", "mandatory": false },
                { "type": "contactNumber", "mandatory": false }
              ],
              "verification": true
            }
          }
        },
        {
          "type": "kyb-review",
          "key": "kyb-review",
          "title": {
            "en": "Checking the data"
          },
          "subtitle": {
            "en": "Please check the information below to make sure everything is correct"
          }
        }
      ]
}'
```

</details>

***

### User questionnaire

The user questionnaire step allows you to collect custom user input as part of the verification flow. It supports various question types and provides multilingual support for titles and descriptions. All responses are saved to the verification session. This step has a slightly different structure compared to other steps.

**User questionnaire step configurations:**

* `type`\
  Must be set to `"user-questionnaire"` to define this step as a user questionnaire block.
* `key` \
  A client-defined unique key for this questionnaire step. It must remain unique within a single session to avoid conflicts.
* `title` \
  The main title of the questionnaire displayed on the user interface.\
  Must always be provided as an \<object> with language codes as keys (e.g., `"en"`), even if only one language is used. This ensures consistency and supports future localization.
* `description` \
  Text displayed beneath the title in the user interface, providing context or instructions.\
  Must always be an \<object> of language codes. Same format and rules as `title`.
* `questions`\
  An \<array> of question objects to be presented to the user.\
  Supported question types include:
  * `string`: **Short answer** – The user enters a short text answer.
  * `multiple-choice`: **Checkboxes** – Allows the user to select one or more options.
  * `options`: **Radio** – The user selects a single option from a list.
  * `dropdown` : **Dropdown List** – The user selects one or more options from a dropdown menu.
  * `file`: **File Upload** – Allows the user to upload a file as a response.
  * `attachment`: **Attachment -** Allows attaching files either dynamically (via API/configuration) or per session. Depending on configuration, files may be pre-attached for the user or uploaded by the operator during the session.
* `successButtonTitle`\
  Defines the label of the confirmation button displayed at the end of the questionnaire.\
  Must also be an \<object> of language codes, even if only one language is used.\
  If any question is marked as `"mandatory": true`, the button will remain disabled until all required questions are answered.

#### **Questions**

Each question in the `questions` array supports a set of parameters that define how it behaves and appears to the user. Here's a breakdown of all supported properties:

* `type`\
  Defines the question type. \
  Supported values:
  * `string` – Short text input
  * `multiple-choice` – Checkbox (multiple selection)
  * `options`– Radio buttons (single selection)
  * `dropdown`– Dropdown menu (single or multi-select)
  * `file`– File upload
  * `attachment` - Attach files and share with the end-user
* `title`\
  A multilingual \<object> representing the question label.\
  Example:

```json
"title": {
  "en": "What is your occupation?",
  "fr": "Quelle est votre profession ?"
}
```

* `key`\
  A **unique identifier** for the question within the same questionnaire. This is client-defined and used for referencing and data mapping.
* `mandatory`\
  Indicates whether the question must be answered before the user can proceed.
  * Value: `true` or `false`
* `answer` \
  Allows you to **preset an answer** for the user.

  * `string`: A plain text string (e.g., `"John Doe"`).
  * `options`: A single option key (e.g., `"opt_a"`).
  * `multiple-choice`: An array of option keys (e.g., `["opt_a", "opt_c"]`).
  * `dropdown`: Not applicable.
  * `file`: Not applicable.
  * `attachment`: An array of file IDs

  *Note: End-users* can modify pre-filled answers unless `readOnly` is enabled.
* `readOnly` \
  Displays the question in a **non-editable** state. Users can view the question and answer but cannot change it.
  * Value: `true` or `false`
* `showConditions` \
  Defines a **conditional display rule** for the question, based on the answer to a previous question.
  * `questionKey`  Key of the controlling question.
  * `answer`  Key of the answer (for radio/checkbox) or specific text (for string)

```json
"showConditions": {
  "questionKey": "employment-status",
  "answer": "self-employed"
}
```

* `multiple`\
  Specific to `dropdown` type.
  * If `true`, the user can select **multiple values** from the dropdown.
  * Value: `true` or `false`

#### **Options**

Options are used exclusively in `multiple-choice` , `options` and `dropdown` type questions. They define the selectable choices that the user can pick from.

Each question that supports options must include the following parameter:

* `options` \
  An \<array> of option objects for the question. Each object must include the following:
* `title`\
  The text label for the option, shown to the user during the verification flow.\
  Must always be provided as an \<object> with language codes as keys, even if only one language is used.\
  This ensures consistency across multilingual flows. \
  Example:

```json
{
  "en": "Self-employed"
}
```

* `key`\
  A unique identifier for the option within the questionnaire.\
  This value is used for referencing in preset answers, conditions, and session data.\
  It must be unique within the same questionnaire to avoid conflicts.

#### **List of parameters with examples:**

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the questionnaire shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "terms-and-conditions"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title of the user questionnaire, displayed as the block title on the user's side. The title can be an &#x3C;object> containing different <strong>languages</strong>, allowing the title to be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title on the user's side. Similar to the title, the description can be an &#x3C;object> containing different <strong>languages</strong>, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>questions</code></td><td>An &#x3C;array>  of questions with the following types: <code>string</code>, <code>multiple-choice</code> , <code>options</code>, <code>dropdown</code>.</td><td>-</td><td>&#x3C;array></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"questions": [
    {
    "type": "string",
    "title": { 
        "es": "Tu título",
        "en": "Your title"
        }
    "key": "question1",
    "mandatory": true
    },
    {
    "type": "multiple-choice",
    "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
    "key": "question2",
    "mandatory": false,
    "options": [
        {
        "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
        "key": "option1"
        },
        { 
        "title": { 
        "es": "Tu título",
        "en": "Your title"
        },
        "key": "option2"
        }
    ]
    }
]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": false
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.</td><td>-</td><td>&#x3C;string> or &#x3C;array></td><td><pre class="language-json"><code class="lang-json">"answer": "option2"
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": false
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr><tr><td><code>successButtonTitle</code></td><td>The title of the action button in the questionnaire. If the questions are mandatory, the button is deactivated until the user completes the questionnaire.</td><td>Confirm</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"successButtonTitle": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr></tbody></table>

#### **cURL example:**

<details>

<summary><em>Expand to view user-questionnaire example</em></summary>

<pre class="language-bash"><code class="lang-bash">curl https://widget.identomat.com/external-api/begin/ -d '{
"company_key": "your_company_key_here",
"flags": {
        "restrict_url_sharing": true,
        "language": "es"
},
"steps": [
    {
            "key": "questionnaire-page-1",
            "type": "user-questionnaire",
            "title": { 
                "es": "Tu título",
                "en": "Your title"
<strong>                },
</strong>            "description": {
                "es": "Tu descripción",
                "en": "Your description"
                },
            "questions": [
                {
                "type": "string",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question1",
                "mandatory": true
                },
                {
                "type": "multiple-choice",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question2",
                "mandatory": false,
                "options": [
                    {
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option1"
                    },
                    { 
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option2"
                    }
                ],
                "answer": ["option2"],
                "readOnly": true
                },
                {
                "type": "options",
                "title": {
                "es": "Tu título",
                "en": "Your title"
                },
                "key": "question3",
                "mandatory": true,
                "options": [
                    {
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option3"
                    },
                    { 
                    "title": {
                    "es": "Tu título",
                    "en": "Your title"
                    },
                    "key": "option4"
                    }
                ]
            }
        ]
    }
]
}'
</code></pre>

</details>

#### **Question type: Short answer**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>string</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "string"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "your-address"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>format</code></td><td>Specifies the expected structure of the user’s response. Determines how the input is validated.</td><td><code>free-text</code></td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"format": {
    "type": "free-text"
}
</code></pre><pre class="language-json"><code class="lang-json">"format": {
    "type": "email"
}
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the prefilled answer can be displayed in different languages.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": { 
        "en": "This is a prefilled answer",
        "es":"Esta es una respuesta prellenada."
}
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view SHORT ANSWER question example</em></summary>

```json
"questions": [
    {
        "type": "string",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question1",
        "mandatory": true,
        "answer": {
            "en": "This is a prefilled answer",
            "es": "Esta es una respuesta prellenada."
        },
        "showConditions": {
            "questionKey": "question1",
            "answer": "option1"
        },
        "readOnly": true
    }
]
```

</details>

***

#### **Question type: Checkbox**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>multiple-choice</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "multiple-choice"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "check-two-answers"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;array> <strong>of option keys</strong> assigned to this question.</td><td>-</td><td>&#x3C;array></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": [
    "option-1",
    "option-2"
]
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view CHECKBOX question example</em></summary>

```json
"questions": [
    {
        "type": "multiple-choice",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question2",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "answer": [
                "identity-document",
                "proof-of-address"
            },
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            },
            "readOnly": true
        }
    ]
```

</details>

***

#### **Question type: Radio**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>options</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "options"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-one-answer"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>answer</code></td><td>Allows you to preset an answer for a question.<br>The answer is an  &#x3C;string> <strong>of an option key</strong> assigned to this question.</td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"answer": "option-1"
</code></pre></td></tr><tr><td><code>readOnly</code></td><td>Displays the question but restricts interaction.</td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"readOnly": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view RADIO question example</em></summary>

```json
"questions": [
    {
        "type": "options",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question3",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "answer": "identity-document",
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            },
            "readOnly": true
        }
    ]
```

</details>

***

#### **Question type: Dropdown**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>dropdown</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "dropdown"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-from-list"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  &#x3C;object> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>options</code></td><td><p></p><p>An &#x3C;array> of options for the question. Each option may have:</p><ul><li>"<strong>title</strong>" : The title of an option. The title is an &#x3C;object> containing different languages, allowing the option to be displayed in the selected language during the verification flow.</li><li>"<strong>key</strong>": The key for the option, chosen by the client. It must remain unique within a single questionnaire.</li></ul></td><td>-</td><td>&#x3C;array></td><td><p></p><pre class="language-json" data-overflow="wrap"><code class="lang-json">"options": [
    {
        "title": {
            "en": "Identity Document",
            "es": "Documento de identidad"
        },
        "key": "identity-document"
    },
    {
        "title": {
            "en": "Proof of Address",
            "es": "Comprobante de domicilio"
        },
        "key": "proof-of-address"
    ]
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>multiple</code></td><td><p>Specifies whether the question is single or multiple choice.</p><p></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"multiple": true
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view DROPDOWN question example</em></summary>

```json
"questions": [
    {
        "type": "options",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question4",
        "options": [
            {
                "title": {
                    "en": "Identity Document",
                    "es": "Documento de identidad"
                },
                "key": "identity-document"
            },
            {
                "title": {
                    "en": "Proof of Address",
                    "es": "Comprobante de domicilio"
                },
                "key": "proof-of-address"
            ],
            "mandatory": true,
            "multiple": true,
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            }
        }
    ]
```

</details>

***

#### **Question type: File upload**

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>file</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "file"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "choose-from-list"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  <code>&#x3C;object></code> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title. Similar to the title, the description can be an &#x3C;object> containing different languages, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>mandatory</code></td><td><p>Specifies whether the question is required to be answered.<br></p><p>Possible values:</p><p><code>true</code>, <code>false</code></p></td><td>false</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"mandatory": true
</code></pre></td></tr><tr><td><code>fileTypes</code></td><td>Specifies the types of files the user is allowed to upload.<br><br>Possible values:<br> <code>pdf</code>, <code>image</code>.</td><td>[ <code>"pdf"</code>, <code>"image"</code> ]</td><td>&#x3C;array></td><td><p></p><pre class="language-json"><code class="lang-json">"fileTypes": [
    "pdf",
    "image"
]
</code></pre></td></tr><tr><td><code>filesMaxCount</code></td><td>Specifies the maximum number of files the user is allowed to upload.<br><br>Possible values:<br>A number from 1 to 10.</td><td>10</td><td>&#x3C;number></td><td><pre class="language-json"><code class="lang-json">"filesMaxCount": 5
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json5" data-overflow="wrap"><code class="lang-json5">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view FILE UPLOAD question example</em></summary>

```json
"questions": [
    {
        "type": "file",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "key": "question5",
            "mandatory": true,
            "fileTypes": [
            "pdf",
            "image"
            ],
            "filesMaxCount": 5,
            "showConditions": {
                "questionKey": "question1",
                "answer": "option1"
            }
        }
    ]
```

</details>

***

#### **Question type: Attachment**

The **Attachment** question type allows attaching files to a questionnaire. It supports two main use cases:

1. **Operator-added attachments per session**\
   The operator uploads files during or before the verification session and shares them with the end-user.
2. **Predefined attachments from Configuration or API**\
   Files are uploaded in the Configuration interface or dynamically provided via API. These files are automatically included in future sessions.

**Behavior**

* Attachments are visible to both the operator and the end-user.
* When files are provided via API (`answer`) or Configuration, they will appear when the questionnaire is opened.
* Depending on settings, the operator may be allowed or restricted from modifying attachments after the user has confirmed the questionnaire.

Available parameters:&#x20;

<table data-full-width="true"><thead><tr><th width="133">Parameter</th><th width="217">Description</th><th width="100">Default</th><th width="118">Type</th><th>Example</th></tr></thead><tbody><tr><td><code>type</code></td><td><code>attachment</code></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json"><code class="lang-json">"type": "attachment"
</code></pre></td></tr><tr><td><code>key</code></td><td><p>Keys are chosen by the client and must remain unique within a single session.</p><p>Recommended to use key describing the question shortly. </p></td><td>-</td><td>&#x3C;string></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"key": "attached-documents"
</code></pre></td></tr><tr><td><code>title</code></td><td>The title is an  <code>&#x3C;object></code> of languages so that if the user changes the language during the verification flow, the question can be displayed in different languages. There are no length or symbol restrictions.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"title": { 
    "es": "Tu título",
    "en": "Your title"
}
</code></pre></td></tr><tr><td><code>description</code></td><td>A description that appears below the title. Similar to the title, the description can be an &#x3C;object> containing different languages, so that it can be displayed in the selected language during the verification flow.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json"><code class="lang-json">"description": {
    "es": "Tu descripción",
    "en": "Your description"
}
</code></pre></td></tr><tr><td><code>fileTypes</code></td><td>Specifies the types of files the user is allowed to upload.<br><br>Possible values:<br> <code>pdf</code>, <code>image</code>.</td><td>[ <code>"pdf"</code>, <code>"image"</code> ]</td><td>&#x3C;array></td><td><p></p><pre class="language-json"><code class="lang-json">"fileTypes": [
    "pdf",
    "image"
]
</code></pre></td></tr><tr><td><code>filesMaxCount</code></td><td>Specifies the maximum number of files the user is allowed to upload.<br><br>Possible values:<br>A number from 1 to 10.</td><td>10</td><td>&#x3C;number></td><td><pre class="language-json"><code class="lang-json">"filesMaxCount": 5
</code></pre></td></tr><tr><td><code>showConditions</code></td><td>This parameter may be used to set conditions for whether a question should be displayed.</td><td>-</td><td>&#x3C;object></td><td><pre class="language-json" data-overflow="wrap"><code class="lang-json">"showConditions": {
    "questionKey": "question1",
    "answer": "option1"
    }
</code></pre></td></tr><tr><td><code>allowOperatorUpload</code></td><td>Controls how files are added:<br>• <strong>true</strong> – operator uploads files per session.<br>• <strong>false</strong> – files are provided via Configuration or API only.</td><td>true</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"allowOperatorUpload": true
</code></pre></td></tr><tr><td><code>allowOperatorOverride</code></td><td>If <strong>false</strong>, the operator cannot edit attachments after the user confirms the questionnaire. <br>If <strong>true</strong>, the operator may still upload or remove files.</td><td>true</td><td>&#x3C;boolean></td><td><pre class="language-json"><code class="lang-json">"allowOperatorOverride": true
</code></pre></td></tr></tbody></table>

<details>

<summary><em>Expand to view ATTACHMENT question example</em></summary>

```json
"questions": [
    {
        "type": "attachment",
        "title": {
            "es": "Tu título",
            "en": "Your title"
        },
        "description": {
            "es": "Tu descripción",
            "en": "Your description"
            },
        "key": "question5",
        "fileTypes": [
            "pdf",
            "image"
            ],
        "filesMaxCount": 5,
        "allowOperatorUpload": true,
        "allowOperatorOverride": true,
        "answer": [ ],
        "showConditions": {
            "questionKey": "question1",
            "answer": "option1"
            }
        }
    ]
```

</details>


# API reference

The API Reference documentation provides detailed information on the available endpoints, request parameters, response formats, and authentication methods for integrating with Identomat.

### Rate limit

To protect system stability and prevent abuse, our API enforces rate limiting:

* **Limit**: Maximum of **600 requests per minute** per IP address.
* **Exceeding the limit**: If an IP exceeds this threshold, it will be **temporarily blocked for 1 hour**.
* **Error response**: During the block period, all requests from the blocked IP will return a **`529 Too many requests`** error.

***

### Session management

Use these endpoints to create and manage verification sessions. Sessions can be started using a saved configuration (recommended) or with custom steps and flags.

<details>

<summary>begin/ - Session creation (Legacy)</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/begin/></mark>

**Description:**

Initiates a new verification session. Sessions can be started using either a predefined configuration (`config_id`) or by explicitly specifying the steps and flags for a custom flow.

This endpoint now also supports **overriding individual steps within a configuration**. This allows you to inject dynamic data (e.g., prefill user details like first name and last name) while still using your saved configuration, making the transition to configuration-based setups more flexible.

**Parameters:**

* `company_key` *(string, required)*- The company's secret key.
* `parent_session_id` *(string, optional)* – Specifies the parent session ID when creating a child session for multi-participant verification.

with:

* `config_id` (string, optional) - The unique identifier for the session configuration.

or:&#x20;

* `flags` *(object, optional)* – A JSON object containing session customization options.
* `steps` *(array, optional)* – Defines the sequence of steps in the identification process.

{% hint style="warning" %}
Only use custom steps and flags if you have very specific needs that cannot be satisfied with configurations. Over time, **we encourage migrating all custom flows to configurations.**<br>

**Why configurations matter:**

* **Simplifies session creation** — no need to manually define steps and flags.
* **Reduces risk of errors** in the verification flow.
* **Future-proof** — legacy custom step handling will eventually be deprecated.
* Enables Identomat to **maintain**, **improve**, and **optimize** **flows** efficiently.
* Makes **integration** easier.
  {% endhint %}

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/begin/ \
    -F 'company_key=your-company-secret-key' \
    -F 'config_id=62412c096c4b39ba845d4bf2'
```

Check all **steps** examples in [Developer guide](/developer-tools/developer-guide).

**Request parameter examples:**

*Start default session:*

```json
{
  "company_key": "your-company-secret-key"
}
```

*Start session with configuration **(recommended)**:*

```json
{
  "company_key": "your-company-secret-key",
  "config_id": "62412c096c4b39ba845d4bf2"
}
```

*Start session with flags and steps:*

```json
{
  "company_key": "your-company-secret-key",
  "flags": {},
  "steps": [],
  "parent_session_id": "98aryxvvzwpi4zuasth332ozfucli3l0qx13hisc"
}
```

**Result examples:**

*default:*

```json
"47fjzxvvzapi4ztasth3c2ozfucli3l0qx13hisc"
```

***

#### Overriding configuration behavior

When creating a session with `config_id`, you can selectively override parts of the saved configuration at runtime. This allows you to keep configurations reusable while adjusting behavior per session.

There are **two supported override types**:

**1. Override configuration steps**

You can redefine one or more steps from the configuration by passing the `steps` array in the `/begin` request.

Only the steps explicitly provided in the request will be overridden. All other steps from the configuration remain unchanged.&#x20;

Steps are matched by their `key`. If a step with the same `key` already exists in the configuration, it will be **overridden** by the step definition provided in the request.

This is commonly used to:

* Prefill questionnaire answers (e.g. name, agreement)
* Adjust step content dynamically
* Inject user-specific data into predefined flows

> If both `config_id` and `steps` are provided, the configuration is used as the base and **only matching steps are overridden**.

*Example:*

{% code expandable="true" %}

```json
{
    "company_key": "your-company-secret-key",
    "config_id": "62412c096c4b39ba845d4bf2",
    "steps": [
        {
            "type": "user-questionnaire",
            "key": "agreement",
            "title": {
                "en": "Personal information"
            },
            "questions": [
                {
                    "mandatory": true,
                    "type": "string",
                    "key": "agreement-1",
                    "title": {
                        "en": "Your full name"
                    },
                    "answer": "John Doe"
                }
            ],
            "successButtonTitle": {
                "en": "Continue"
            }
        }
    ]
}
```

{% endcode %}

**2. Override configuration parameters (general)**

You can override configuration-level parameters by passing them via the `general` object in the `/begin` request.

Any parameter provided in `general` will **override the corresponding value from the configuration** for that session only. Parameters not provided will fall back to the configuration defaults.

Example parameters that can be overridden include:\
\&#xNAN;*(See* [*Configuration settings*](/no-code-workflows/configuration-settings) *for the full list and detailed descriptions of all available parameters)*

```json
{
  "language": "en",                                //Default language
  "returnUrl": "https://www.identomat.com/",       //Return URL
  "optionalContinueOnAnotherDevice": false,        //Allow user to continue on another device
  "restrictUrlSharing": false,                     //Restrict URL sharing
  "switchDeviceUrl": "https://www.identomat.com/", //Pass custom QR URL 
  "skipDesktop": false,                            //Force user to continue on mobile device
  "useSmsNotifications": false,                    //Enable SMS notifications 
  "sessionLifetime": "15",                         //Session lifetime (minutes)
  "identifyPersonWithFace": false,                 //Recurring face recognition 
  "checkScreening": true,                          //Screening 
  "minScreeningScore": "85",                       //Minimum screening score
  "screeningDatasets": ["default"],                //Screening Datasets
  "runScreeningAfter": "completion",               //When to run screening
  "groups": ["667eb394d3ae73e1902da6dd"],          //Groups with access
  "requiredHdMedia": false                         //Require FHD camera
}
```

Example request using parameter overrides:

```json
{
  "company_key": "your-company-secret-key",
  "config_id": "62412c096c4b39ba845d4bf2",
  "general": {
    "language": "ka",
    "useSmsNotifications": true,
    "sessionLifetime": "20"
  }
}
```

> Parameter overrides apply **only to the created session** and do not modify the saved configuration.

</details>

<details>

<summary>begin/ - Session creation (New, Additional information request support )</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/begin></mark>

**Description:**

Creates a new verification session using the External API. Unlike the legacy endpoint, this endpoint uses **camelCase** parameter names and supports configurations with [**Additional information request**](/platform-concepts/additional-information-requests) enabled.

When called with a configuration that has `additionalInformationRequest` set to `true`, the endpoint automatically provisions a parent session (operator-facing) and a child session (applicant-facing), returning both in the response.

> For new integrations, this endpoint is recommended over the legacy `begin/` endpoint.

**Parameters:**

* `companyKey` *(string, required)* – The company's secret key.
* `configId` *(string, optional)* – The unique identifier for the session configuration.
* `parentSessionId` *(string, optional)* – Specifies the parent session ID when creating a child session for multi-participant verification.
* `name` *(string, optional)* – A custom name for the session.
* `scheduleStartTime` *(string, optional, ISO 8601)* – The scheduled start time for the session.
* `scheduleEndTime` *(string, optional, ISO 8601)* – The scheduled end time for the session.
* `groupId` *(string, optional)* – Assigns the session to a specific group.
* `createdByUser` *(string, optional)* – The ID of the user creating the session.
* `clientUserId` *(string, optional)* – A custom identifier for the applicant on your side, useful for linking sessions to your internal user records.
* `general` *(object, optional)* – Overrides configuration-level parameters for this session only. See [Configuration settings ](/no-code-workflows/configuration-settings)for the full list of available parameters.
* `flags` *(object, optional)* – A JSON object containing session customization options.
* `steps` *(array, optional)* – Defines or overrides the sequence of steps in the verification flow. If used together with `configId`, only matching steps are overridden.

Check all **steps** examples in [Developer guide](/developer-tools/developer-guide).

{% hint style="warning" %}
Only use custom steps and flags if you have very specific needs that cannot be satisfied with configurations. Over time, **we encourage migrating all custom flows to configurations.**<br>

**Why configurations matter:**

* **Simplifies session creation** — no need to manually define steps and flags.
* **Reduces risk of errors** in the verification flow.
* **Future-proof** — legacy custom step handling will eventually be deprecated.
* Enables Identomat to **maintain**, **improve**, and **optimize** **flows** efficiently.
* Makes **integration** easier.
  {% endhint %}

***

**cURL example:**

```bash
curl -X POST https://external-api.identomat.com/begin \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "configId": "62412c096c4b39ba845d4bf2"
    }'
```

***

**Request parameter examples:**

*Create standard session:*

```json
{
  "companyKey": "your-company-secret-key",
  "configId": "62412c096c4b39ba845d4bf2"
}
```

*Create session with Additional information request:*

```json
{
  "companyKey": "your-company-secret-key",
  "configId": "62412c096c4b39ba845d4bf2"
}
```

*Request additional information for existing session:*

```json
{
  "companyKey": "your-company-secret-key",
  "configId": "62412c096c4b39ba845d4bf2",
  "sessionId": "parent-session-id"
}
```

When `sessionId` is provided, the parent session remains unchanged. **Only a new child session is created**, with a fresh applicant-facing URL. Always share the latest `additionalSessionUrl` with the applicant.

***

**Result examples:**

*Standard configuration:*

```json
{
  "id": "session-id",
  "url": "https://widget.identomat.com/?session_token=session-id"
}
```

*Configuration with `additionalInformationRequest` enabled:*

```json
{
  "id": "parent-session-id",
  "url": "https://widget.identomat.com/?session_token=child-session-id",
  "additionalSessionId": "child-session-id",
  "additionalSessionUrl": "https://widget.identomat.com/?session_token=child-session-id"
}
```

***

**Response fields:**

<table><thead><tr><th width="199.55859375">Field</th><th>Description</th></tr></thead><tbody><tr><td><code>id</code></td><td>The parent session ID. Use this to track the session in Manage and receive callbacks.</td></tr><tr><td><code>url</code></td><td>The applicant-facing URL for the child session. Mirrors <code>additionalSessionUrl</code> for backwards compatibility. </td></tr><tr><td><code>additionalSessionId</code></td><td>The child session ID. Only present when <code>additionalInformationRequest</code> is enabled on the configuration.</td></tr><tr><td><code>additionalSessionUrl</code></td><td>The applicant-facing URL for the child session. Only present when <code>additionalInformationRequest</code> is enabled on the configuration.</td></tr></tbody></table>

</details>

<details>

<summary>result/ - <strong>KYC (Customer)</strong> session result</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/></mark>

\
**Description:**

This endpoint allows you to retrieve the result of a verification session. Based on the session ID, the response will return the final decision (approved/rejected), document data, extracted information, and metadata.

**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
 curl https://widget.identomat.com/external-api/result/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Request parameter examples:**

```json
{
  "company_key": "your-company-secret-key",
  "session_token": "example-session-id-12345"
}
```

***

#### 📹 **videoCallStatus:**

If the session included a **video call step**, the `/result` endpoint will include a `videoCallStatus` array.\
This allows clients to track the lifecycle of each video call room — when it was created, when it ended, and when the composed video file becomes available.

**Example:**

```json
"videoCallStatus": [
  {
    "roomId": "RM27b1b047ccc30c0519959d66b4f0689d",
    "roomStatus": "ended",
    "compositionStatus": "available",
    "videoFileStatus": "available",
    "videoFileId": "hlwXVfonxNogXujgqT9anl1EphgwNiXuy7ug96sH"
  }
]
```

**Object structure:**

Each entry in `videoCallStatus` follows this scheme:

```json
{
  "roomId": "string",
  "roomStatus": "created | ended | empty",
  "compositionStatus": "null | started | available",
  "videoFileStatus": "null | started | available",
  "videoFileId": "null | string"
}
```

**Status descriptions:**

<table><thead><tr><th width="169.7734375">Field</th><th width="133.3046875">Possible values</th><th>Meaning</th></tr></thead><tbody><tr><td><strong>roomStatus</strong></td><td><code>created</code></td><td>Room successfully created; call is in progress.</td></tr><tr><td></td><td><code>ended</code></td><td>Operator ended the call.</td></tr><tr><td></td><td><code>empty</code></td><td>The video call room ended with no media recorded.</td></tr><tr><td><strong>compositionStatus</strong></td><td><code>null</code></td><td>Composition not started yet.</td></tr><tr><td></td><td><code>started</code></td><td>Composition (video merging) has started.</td></tr><tr><td></td><td><code>available</code></td><td>Composed full video is ready.</td></tr><tr><td><strong>videoFileStatus</strong></td><td><code>null</code></td><td>Final video file has not been generated yet.</td></tr><tr><td></td><td><code>started</code></td><td>Video file generation has started.</td></tr><tr><td></td><td><code>available</code></td><td>Final downloadable video file is ready.</td></tr><tr><td><strong>videoFileId</strong></td><td><code>null</code> or File ID</td><td>If available, this ID can be used to download the composed video.</td></tr></tbody></table>

***

#### **Result examples:**

*<mark style="color:green;">sessionApproved:</mark>*

{% code expandable="true" %}

```json
{
    "result": "approved",
    "similarity": 0.9027283530404249,
    "live": false,
    "document_type": "id",
    "generalDocuments": [
        {
            "pages": [
                {
                    "typeId": "utility-bill",
                    "final": {
                        "street": "Main Street",
                        "state": "California",
                        "city": "Los Angeles",
                        "country": "United States",
                        "postalCode": "90001",
                        "streetNumber": "123",
                        "county": "Los Angeles County",
                        "countryCode": "USA",
                        "documentIssued": "1/15/2025",
                        "documentIssuedTime": "2025-01-15T00:00:00",
                        "authority": "Bank of America, NA",
                        "address": "123 Main St, Los Angeles, CA 90001",
                        "formattedAddress": "123 Main St, Los Angeles, CA 90001, USA",
                        "latitude": 34.052235,
                        "longitude": -118.243683,
                        "fullName": "John Doe",
                        "firstName": "John",
                        "lastName": "Doe",
                        "permanent": null
                    },
                    "documentPages": [
                        {
                            "pageNumber": 1
                        }
                    ],
                    "pageNumber": 1,
                    "statuses": []
                }
            ],
            "documentType": "UTILITY_BILL",
            "permanent": null,
            "typeId": "utility_bill"
        }
    ],
    "reject_reason": {
        "value": "",
        "description": ""
    },
    "result_comment": "",
    "name": "John Doe",
    "face_images": 1,
    "id_card_front": {
        "Given_Names_en_US": "John",
        "Surname_en_US": "Doe",
        "citizenship": "USA",
        "Sex_en_US": "M",
        "Personal_Number_en_US": "123456789",
        "Date_of_Birth_en_US": "1/8/1980",
        "Date_of_Expiry_en_US": "8/9/2025",
        "Document_Number_en_US": "AB1234567",
        "Issuing_State_Code_en_US": "USA",
        "Date_of_Birth_ISO": "1980-01-08T00:00:00.000Z",
        "Date_of_Expiry_ISO": "2025-08-09T00:00:00.000Z"
    },
    "id_card_back": {
        "Date_of_Issue_en_US": "6/28/2021",
        "Issuing_State_Code_en_US": "USA",
        "Place_of_Birth_en_US": "USA",
        "Date_of_Issued_ISO": "2021-06-28T00:00:00.000Z",
        "Given_Names_en_US": "John",
        "Surname_en_US": "Doe",
        "Nationality_Code_en_US": "USA",
        "Sex_en_US": "M",
        "Personal_Number_en_US": "123456789",
        "Date_of_Birth_en_US": "1/8/1980",
        "Date_of_Expiry_en_US": "6/28/2028",
        "Document_Number_en_US": "AB0002261",
        "Nationality_en_US": "USA",
        "Date_of_Birth_ISO": "1980-01-08T00:00:00.000Z",
        "Date_of_Expiry_ISO": "2028-06-28T00:00:00.000Z",
        "mrz": "IDUSAAB0002261938001085718<<<<\n8001081M2806288USA<<<<<<<<<<<1\nDOE<<JOHN<<<<<<<<<<<<<<<<<<<"
    },
    "suggested": {},
    "person": {
        "email": "johndoe@email.com",
        "phoneNumber": "+1234567890",
        "first_name": "John",
        "last_name": "Doe",
        "birthday": "1/8/1980",
        "birthday_time": "1980-01-08T00:00:00.000Z",
        "age": 45,
        "citizenship": "USA",
        "document_number": "AB0002261",
        "document_expires": "6/28/2028",
        "document_expires_time": "2028-06-28T00:00:00.000Z",
        "personal_number": "123456789",
        "issuing_state": "USA",
        "sex": "M",
        "birth_place": "USA",
        "nationality": "USA",
        "document_issued": "6/28/2021",
        "document_issued_time": "2021-06-28T00:00:00.000Z",
        "status": "FIELDS_MATCH",
        "mrz": "IDUSAAB0002261938001085718<<<<\n8001081M2806288USA<<<<<<<<<<<1\nDOE<<JOHN<<<<<<<<<<<<<<<<<<<",
        "address": "2804 Fairway Dr, Cedar Hill, TX 75104, USA"
    },
    "questionnaires": [
        {
            "key": "agreement",
            "questions": [
                {
                    "key": "question1",
                    "answer": "John Doe"
                },
                {
                    "key": "question2",
                    "answer": "option4"
                },
                {
                    "key": "question3",
                    "answer": [
                        "option1",
                        "option2"
                    ]
                },
                {
                    "key": "question5",
                    "answer": 1
                },
                {
                    "key": "question6",
                    "answer": "readOnly answer"
                }
            ]
        }
    ],
    "geolocation": [
        {
            "key": "require_geolocation",
            "latitude": 34.05221168293059,
            "longitude": -118.24393094417908,
            "address": "123 Main St, Los Angeles, CA 90001, USA"
        }
    ],
    "technicalDetails": {
        "remoteAddress": "192.168.1.1",
        "userAgent": "PostmanRuntime/7.37.3",
        "countryCode": "US"
    },
    "videoCallStatus": [
        {
            "roomId": "RMf12391ce20597708d747587bdee8e715",
            "roomStatus": "ended",
            "compositionStatus": "available",
            "videoFileStatus": "available",
            "videoFileId": "av7YsrnDopwVmyzLtzkPKSiyWKVIaQDQZPtDfEq0"
        },
        {
            "roomId": "RM48170f8ee1235e27d5d09f8330b4f67f",
            "roomStatus": "empty",
            "compositionStatus": null,
            "videoFileStatus": null,
            "videoFileId": null
        }
    ]
}
```

{% endcode %}

*<mark style="color:red;">sessionRejected:</mark>*

{% code expandable="true" %}

```json
{
    "result": "rejected",
    "similarity": 0.59931052549619,
    "live": true,
    "document_type": "id",
    "generalDocuments": [
        {
            "pages": [
                {
                    "typeId": "utility-bill",
                    "final": {
                        "street": "Main Street",
                        "state": "California",
                        "city": "Los Angeles",
                        "country": "United States",
                        "postalCode": "90001",
                        "streetNumber": "123",
                        "county": "Los Angeles County",
                        "countryCode": "USA",
                        "documentIssued": "1/15/2025",
                        "documentIssuedTime": "2025-01-15T00:00:00",
                        "authority": "Bank of America, NA",
                        "address": "123 Main St, Los Angeles, CA 90001",
                        "formattedAddress": "123 Main St, Los Angeles, CA 90001, USA",
                        "latitude": 34.052235,
                        "longitude": -118.243683,
                        "fullName": "John Doe",
                        "firstName": "John",
                        "lastName": "Doe",
                        "permanent": null
                    },
                    "documentPages": [
                        {
                            "pageNumber": 1
                        }
                    ],
                    "pageNumber": 1,
                    "statuses": []
                }
            ],
            "documentType": "UTILITY_BILL",
            "permanent": null,
            "typeId": "utility_bill"
        }
    ],
    "reject_reason": {
        "value": "low_similarity",
        "description": "Low similarity"
    },
    "result_comment": "",
    "name": "John Doe",
    "errors": [
        "LOW_SIMILARITY"
    ],
    "face_images": 1,
    "id_card_front": {
        "Given_Names_en_US": "James",
        "Surname_en_US": "Smith",
        "Nationality_Code_en_US": "USA",
        "Sex_en_US": "M",
        "Date_of_Birth_en_US": "1/1/1980",
        "Date_of_Issue_en_US": "5/30/2015",
        "Document_Number_en_US": "A12345678",
        "Nationality_en_US": "USA",
        "Issuing_State_Code_en_US": "USA",
        "Date_of_Birth_ISO": "1980-01-01T00:00:00.000Z",
        "Date_of_Issued_ISO": "2015-05-30T00:00:00.000Z"
    },
    "id_card_back": {
        "Issuing_State_Code_en_US": "USA",
        "Authority_en_US": "Department of State",
        "Given_Names_en_US": "James",
        "Surname_en_US": "Smith",
        "Nationality_Code_en_US": "USA",
        "Sex_en_US": "M",
        "Date_of_Birth_en_US": "1/1/1980",
        "Date_of_Expiry_en_US": "5/30/2025",
        "Document_Number_en_US": "A12345678",
        "Nationality_en_US": "USA",
        "Date_of_Birth_ISO": "1980-01-01T00:00:00.000Z",
        "Date_of_Expiry_ISO": "2025-05-30T00:00:00.000Z",
        "mrz": "I<USA12345678<<<<<<<<<<<<<<<\n8001013M2505309USA<<<<<<<<<<<2\nSMITH<<JAMES<<<<<<<<<<<<<<<<<"
    },
    "suggested": {},
    "person": {
        "email": "johndoe@email.com",
        "phoneNumber": "+1234567890",
        "first_name": "James",
        "last_name": "Smith",
        "birthday": "1/1/1980",
        "birthday_time": "1980-01-01T00:00:00.000Z",
        "age": 45,
        "nationality": "USA",
        "document_number": "A12345678",
        "document_issued": "5/30/2015",
        "document_issued_time": "2015-05-30T00:00:00.000Z",
        "issuing_state": "USA",
        "sex": "M",
        "document_expires": "5/30/2025",
        "document_expires_time": "2025-05-30T00:00:00.000Z",
        "authority": "Department of State",
        "status": "FIELDS_MATCH",
        "mrz": "I<USA12345678<<<<<<<<<<<<<<<\n8001013M2505309USA<<<<<<<<<<<2\nSMITH<<JAMES<<<<<<<<<<<<<<<<<",
        "address": "123 Main St, Los Angeles, CA 90001, USA"
    },
    "questionnaires": [
        {
            "key": "agreement",
            "questions": [
                {
                    "key": "question1",
                    "answer": "John Doe"
                },
                {
                    "key": "question2",
                    "answer": "option4"
                },
                {
                    "key": "question3",
                    "answer": [
                        "option1",
                        "option2"
                    ]
                },
                {
                    "key": "question5",
                    "answer": 1
                },
                {
                    "key": "question6",
                    "answer": "readOnly answer"
                }
            ]
        }
    ],
    "geolocation": [
        {
            "key": "require_geolocation",
            "latitude": 34.05221168293059,
            "longitude": -118.24393094417908,
            "address": "123 Main St, Los Angeles, CA 90001, USA"
        }
    ],
    "technicalDetails": {
        "remoteAddress": "192.168.1.1",
        "userAgent": "PostmanRuntime/7.37.3",
        "countryCode": "US"
    },
    "videoCallStatus": [
        {
            "roomId": "RMf12391ce20597708d747587bdee8e715",
            "roomStatus": "ended",
            "compositionStatus": "available",
            "videoFileStatus": "available",
            "videoFileId": "av7YsrnDopwVmyzLtzkPKSiyWKVIaQDQZPtDfEq0"
        },
        {
            "roomId": "RM48170f8ee1235e27d5d09f8330b4f67f",
            "roomStatus": "empty",
            "compositionStatus": null,
            "videoFileStatus": null,
            "videoFileId": null
        }

}
```

{% endcode %}

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/ - <strong>KYB (Business)</strong> session result</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/result></mark>

\
**Description:**

Use this endpoint to retrieve the result of a **KYB (business verification)** session.

> This endpoint uses the newer `external-api.identomat.com` base URL and camelCase parameter names, unlike the legacy KYC endpoint.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
 curl https://external-api.identomat.com/result/ \
    -F 'companyKey={your-company-secret-key}' \
    -F 'sessionId={example-session-id-12345}'
```

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

***

#### **Response structure**

KYB results are returned under a `result.stepsResults` array. Each entry corresponds to a step in the KYB flow.

<table><thead><tr><th width="174.73828125">Step type</th><th>Description</th></tr></thead><tbody><tr><td><code>company</code></td><td>Company information submitted in the flow.</td></tr><tr><td><code>beneficiaries</code></td><td>List of UBOs and representatives (individuals or companies). Each individual beneficiary includes a KYC <code>sessionId</code> that can be queried via the KYC endpoint.</td></tr><tr><td><code>kyb-review</code></td><td>Final review status and trusted database data.</td></tr></tbody></table>

#### **Result example:**

*default:*&#x20;

{% code expandable="true" %}

```json
{
  "result": {
    "stepsResults": [
      {
        "key": "company",
        "type": "company",
        "result": {
          "companyName": "Acme Corp",
          "registrationNumber": "0000000000000",
          "registrationCountry": "United States",
          "taxId": "00000000",
          "dateOfIncorporation": "01/01/2010",
          "email": "contact@acme.com",
          "contactNumber": "+10000000000",
          "website": "www.acme.com",
          "companyEntityType": "Joint-stock company",
          "legalAddress": "123 Main Street",
          "countryCode": "US"
        },
        "status": "approved"
      },
      {
        "key": "beneficiaries-1",
        "type": "beneficiaries",
        "result": [
          {
            "entityType": "individual",
            "positions": ["shareholder", "representative"],
            "firstName": "John",
            "lastName": "Doe",
            "dateOfBirth": "01/01/1980",
            "ownershipPercentage": "25",
            "contactNumber": "+10000000000",
            "email": "john.doe@example.com",
            "sessionIds": ["example-kyc-session-id-0001"],
            "sessionUrl": "https://widget.identomat.com/?session_token=example-kyc-session-id-0001",
            "_id": "example-internal-id-0001"
          },
          {
            "entityType": "company",
            "positions": ["shareholder"],
            "companyName": "Partner Ltd",
            "registrationNumber": "000000000",
            "registrationCountry": "United Kingdom",
            "ownershipPercentage": "50",
            "contactNumber": "+44000000000",
            "email": "contact@partnerltd.com",
            "taxId": "000000000",
            "website": "www.partnerltd.com",
            "dateOfIncorporation": "01/01/2015",
            "sessionIds": ["example-kyc-session-id-0002"],
            "sessionUrl": "https://widget.identomat.com/?session_token=example-kyc-session-id-0002",
            "_id": "example-internal-id-0002"
          }
        ],
        "status": "approved"
      },
      {
        "key": "kyb-review",
        "type": "kyb-review",
        "status": "approved",
        "trustedDatabase": {
          "activityStatus": "ACTIVE",
          "companyName": "Acme Corp",
          "address": {
            "registeredOffice": {
              "streetName": "Main Street",
              "town": "New York",
              "zipCode": "10001"
            }
          },
          "lastUpdateTimestamp": 1777447248,
          "balanceSheets": {
            "last": {
              "year": 2023,
              "balanceSheetDate": "2023-12-31",
              "employees": 42,
              "netWorth": 500000.00,
              "totalAssets": 1200000.00
            },
            "all": [
              {
                "year": 2023,
                "balanceSheetDate": "2023-12-31",
                "employees": 42,
                "netWorth": 500000.00,
                "operatingRevenue": 800000.00,
                "equity": 360000.00,
                "totalAssets": 1200000.00
              },
              {
                "year": 2022,
                "balanceSheetDate": "2022-12-31",
                "employees": 38,
                "netWorth": 450000.00,
                "operatingRevenue": 750000.00,
                "equity": 320000.00,
                "totalAssets": 900000.00
              }
            ]
          }
        }
      }
    ],
    "technicalDetails": {
      "remoteAddress": "192.168.1.1",
      "userAgent": "Mozilla/5.0",
      "countryCode": "US"
    }
  }
}
```

{% endcode %}

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>delete/ - Session data deletion</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/delete/></mark>

**Description:**

This endpoint allows you to permanently delete data related to a specific verification session. This operation is irreversible and should be used with caution. It is typically used to comply with data retention policies or user data deletion requests.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/delete/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={some_session_token}'
```

**Request parameter examples:**

```json
{
  "company_key": "your-company-secret-key",
  "session_token": "defg"
}
```

**Result examples:**

*default:*

```json
true
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>export-session-as-pdf - Export session</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/export-session-as-pdf></mark>

**Description:**

This endpoint allows you to export data related to a specific session as a downloadable PDF document. You can choose to include the full session details, screening results, and/or proof of address documents. At least one export option must be set to `true`.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

One of the following parameters must be set to `true` for the operation to proceed:

* `exportSession` *(boolean, optional)* – Indicates whether to export the full session data.
* `exportScreening` *(boolean, optional)* – Specifies whether to include screening results in the export.
* `exportProofOfAddress` *(boolean, optional)* - Determines whether to include proof of address documents in the export.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/export-session-as-pdf \    
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "exportSession": true,
  "exportScreening": false,
  "exportProofOfAddress": false
}
```

**Result examples:**

*default:*

```json
PDF document of session
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

### Accessing data and more

Use these endpoints to retrieve media and metadata associated with a verification session. This includes document images, face captures, liveness video, proof of address documents, session activity logs, statistical summaries, and visual document markers.

<details>

<summary>result/card-front/ - Card front side image</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/card-front/></mark>

**Description:**

This endpoint returns the front image of the identification document submitted during the session.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/card-front/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples:**

*default:*

```
Card front side image
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/card-back/ - Card back side image</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/card-back/></mark>

**Description:**

This endpoint returns the back image of the identification document submitted during the session.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/card-back/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples:**

*default:*

```
Card back side image
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/passport/ - Passport photo page image</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/passport/></mark>

**Description:**

This endpoint returns the image of the passport submitted during the session.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/passport/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples:**

*default:*

```
Passport image
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/face/ - Face image</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/face/></mark>

**Description:**

This endpoint returns the image of the user’s face captured during the verification session.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/face/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples**:

*default:*

```
Face image
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/face-video/ - Face motion video</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/face-video/></mark>

**Description:**

This endpoint returns the video used during the liveness of the identity verification process.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/face-video/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples:**

*default:*

```
Face video
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/face-document/ - Selfie with ID</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/face-document/></mark>

**Description:**

This endpoint provides the image where the user holds their ID document next to their face.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/face-document/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}'
```

**Result examples:**

*default:*

```
Selfie with ID (image)
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>result/general-document/ - Proof of Address image or PDF</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/result/general-document/></mark>

**Description:**

This endpoint returns a proof of address document or other general documents submitted during the session, such as a bank statement, utility bill, or driver's license.

\
**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `session_token` *(string, required)* - The unique identifier of the session.
* `typeId` *(string, required)* – The document type identifier. Valid values include:
  * `bank-statement`
  * &#x20;`utility-bill`
  * `vehicle-registration-certificate-front`
  * `vehicle-registration-certificate-back`&#x20;
  * `drivers-license`

**cURL example:**

```bash
curl https://widget.identomat.com/external-api/result/general-document/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'session_token={example-session-id-12345}' \
    -F 'typeId={example-type-id}'
```

**Request parameter examples:**

```json
{
  "company_key": "your-company-secret-key",
  "session_token": "defg",
  "typeId": "bank-statement"
}
```

**Result examples:**

*default:*

```
Image or PDF of document
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>get-session-main-document-face-photo - Get face photo from main document</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-session-main-document-face-photo></mark>

**Description:**

This endpoint allows you to retrieve the face photo from the main document associated with a specific session.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-session-main-document-face-photo \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```json
{
  "result": "data:text/plain;base64String"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*notFound:*

```json
{  
    "argumentError": "face-photo-not-found"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>list-session-activities - List of session activities</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/list-session-activities></mark>

**Description:**

This endpoint retrieves a list of activities related to a specific session.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/list-session-activities \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```json
{
  "result": [
    {
      "id": "6162636465666768696a6b6c",
      "type": "PAGE_LOADED",
      "time": "2021-12-29T11:30:39.086Z",
      "data": {}
    },
    {
      "id": "5ff45878f44e95bbf987a801",
      "type": "PAGE_LOADED",
      "time": "2011-12-29T11:30:39.086Z",
      "data": {}
    }
  ]
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>get-session-statistical-summary - Session statistical summary</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-session-statistical-summary></mark>

**Description:**

This endpoint retrieves a statistical summary of a session, providing key metrics and insights.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl -X POST https://external-api.identomat.com/get-session-statistical-summary \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345"}'
```

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```json
{
  "result": [
    {
      "sessionStartDate": "2021-12-29T11:30:40.000Z",
      "sessionTimeSpan": 8000,
      "scanDocumentStartTime": "2021-12-29T11:30:41.000Z",
      "scanDocumentEndTime": "2021-12-29T11:30:43.000Z",
      "scanDocumentAttempts": 1,
      "scanDocumentFailReason": null,
      "livenessStartTime": "2021-12-29T11:30:45.000Z",
      "livenessEndTime": "2021-12-29T11:30:48.000Z",
      "livenessFailReasons": null,
      "sessionTerminationStep": null,
      "sessionTerminationReasons": null
    }
  ]
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>get-visual-markers - Get document visual markers</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-visual-markers></mark>

**Description:**

This endpoint retrieves the visual markers from a document.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

```bash
curl -X POST 'https://external-api.identomat.com/get-visual-markers' \
    -H 'Content-Type: application/json' \
    -d '{
    "companyKey": "your-company-secret-key",
    "sessionId": "example-session-id-12345"
}'
```

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```json
{
  "result": "data:application/x-tar;base64,base64String"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

### AML Screening

Use these endpoints to search global screening databases for sanctions, PEPs, regulatory actions, and other risk indicators. You can perform one-off searches, retrieve detailed profiles, and set up ongoing monitoring for individuals so you are alerted when their screening status changes.

<details>

<summary>search-screening-person - Search for a person in screening databases</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/search-screening-person></mark>

**Description:**

Use this endpoint to search for individuals in global screening databases including sanctions, PEPs (Politically Exposed Persons), regulatory actions, and more.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `query` *(object, required)* – The parameters for querying the database.
  * `fullName` *(string, required)* – Full name of the individual.
  * `birthdayTimeFrom` *(string, optional)* – The start date and time of the birthday range in ISO 8601 format.
  * `scoreThreshold` *(integer, required)* – The minimum score required for the query results.
* `offset` *(integer, optional)* – The number of items to skip from the beginning of the results.
* `limit` *(integer, optional)* – The maximum number of items to return in the query results.

**Entities glossary:**

* **`Sanctioned entity`**: Companies, individuals, or other entities that have been designated by a government to prohibit specific interactions with them.
* **`Sanction-linked entity`**: Entities, including companies and individuals, that have a direct relationship with a sanctioned entity. This also includes companies that are indirect subsidiaries of sanctioned entities, regardless of the percentage ownership held by the sanctioned entity.
* **`Counter-sanctioned entity`**: Entities listed on sanctions lists from non-democratic countries, often targeting pro-democracy activists, journalists, and human rights advocates.
* **`Debarred entity`**: Companies or individuals that have been excluded from public procurement, typically due to committing fraud in the execution of a government contract.
* **`Politician (Politically Exposed Persons)`**: Individuals who currently or previously held a position of political influence.
* **`Close associate`**: Family members and key business associates of politically exposed persons (PEPs). These individuals are often used as nominees or front-people to hide illicit financial gains.
* **`Person of Interest`**: Individuals under scrutiny due to public interest, who do not meet the common definitions of politically-exposed persons and are not sanctioned.
* **`Regulator action`**: Companies that have been subject to enforcement action by an industry regulatory body.
* **`Regulator warning`**: Companies that have been placed on a warning or alert list by an industry regulatory body.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/search-screening-person \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey":"your-company-secret-key",
        "query":
            {
            "birthdayTimeFrom":"1980-11-07T13:07:59.790Z",
            "fullName":"John Doe",
            "scoreThreshold":80
            },
        "offset":0,
        "limit":100
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "query": {
    "birthdayTimeFrom": "1980-11-07T13:07:59.790Z",
    "fullName": "John Doe",
    "scoreThreshold": 80
  },
  "offset": 0,
  "limit": 100
}
```

**Result examples:**

*default - no results for person:*

```json
{
    "result": []
}
```

*default - person found:*

```json
{
    "result": [
        {
            "score": 100,
            "name": "John Doe",
            "personId": "67137933a2176f0797f1e657",
            "entityType": "person",
            "topics": [
                "Sanctioned entity",
                "Wanted person",
                "Person of interest",
                "Politician"
            ]
        }
    ]
}
```

*companyMissing:*

```json
{
  "argumentError": "company-missing"
}
```

*accessDenied:*

```json
{
  "argumentError": "access-denied"
}
```

</details>

<details>

<summary>get-screening-person-details - Get person details from screening databases</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-screening-person-details></mark><br>

**Description:**

Retrieve extended profile data, positions, aliases, sanctions, and other metadata for a specific individual listed in screening databases.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `personId` *(string, required)* – The unique identifier for the person.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-screening-person-details \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey":"your-company-secret-key",
        "personId":"example-person-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "personId": "example-person-id-12345"
}
```

**Result examples:**

*default:*

{% code expandable="true" %}

```json
{
    "result": {
        "entityType": "person",
        "firstName": "John",
        "middleName": "Doe",
        "lastName": "Smith",
        "gender": "male",
        "birthdayTime": "1952-10-07",
        "nationality": "US",
        "extraDetails": [
            {
                "groupName": "Profile",
                "details": [
                    {
                        "detailName": "John Doe Smith",
                        "properties": [
                            {
                                "propertyName": "Position",
                                "value": [
                                    "President of US (2012-)",
                                    "chairperson",
                                    "party leader"
                                ],
                                "type": "list"
                            },
                            {
                                "propertyName": "Name",
                                "value": [
                                    "John Doe Smith",
                                    "约翰·多·史密斯",
                                    "Джон Доу Сміт",
                                    {
                                        "propertyName": "Alias",
                                        "value": [
                                            "John Smith"
                                        ],
                                        "type": "list"
                                    },
                                    {
                                        "groupName": "Position occupied",
                                        "details": [
                                            {
                                                "detailName": "President",
                                                "properties": [
                                                    {
                                                        "propertyName": "Name",
                                                        "value": [
                                                            "President of US",
                                                            "President"
                                                        ],
                                                        "type": "string"
                                                    },
                                                    {
                                                        "propertyName": "Start Date",
                                                        "value": [
                                                            "1999-08-16"
                                                        ],
                                                        "type": "date"
                                                    },
                                                    {
                                                        "propertyName": "End Date",
                                                        "value": [
                                                            "2000-05-07"
                                                        ],
                                                        "type": "date"
                                                    },
                                                    {
                                                        "propertyName": "Status",
                                                        "value": [
                                                            "active"
                                                        ],
                                                        "type": "string"
                                                    }
                                                ]
                                            },
                                            {
                                                "groupName": "Sanctions",
                                                "details": [
                                                    {
                                                        "detailName": "Department of Foreign Affairs and Trade",
                                                        "properties": [
                                                            {
                                                                "propertyName": "Start Date",
                                                                "value": [
                                                                    "2022-02-28"
                                                                ],
                                                                "type": "date"
                                                            },
                                                            {
                                                                "propertyName": "Authority",
                                                                "value": [
                                                                    "Department of Foreign Affairs and Trade"
                                                                ],
                                                                "type": "string"
                                                            },
                                                            {
                                                                "propertyName": "Program",
                                                                "value": [
                                                                    ""
                                                                ],
                                                                "type": "string"
                                                            },
                                                            {
                                                                "propertyName": "Entity",
                                                                "value": [
                                                                    "Q772247"
                                                                ],
                                                                "type": "string"
                                                            },
                                                            {
                                                                "propertyName": "Summary",
                                                                "value": [
                                                                    "Instrument of first designation and declaration: Autonomous Sanctions ....."
                                                                ],
                                                                "type": "string"
                                                            },
                                                            {
                                                                "propertyName": "Source Url",
                                                                "value": [
                                                                    "https://www.dfat.gov.au/international-relations/security/sanctions/Pages3/"
                                                                ],
                                                                "type": "url"
                                                            }
                                                        ]
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
}
```

{% endcode %}

*companyMissing:*

```json
{
  "argumentError": "company-missing"
}
```

*accessDenied:*

```json
{
  "argumentError": "access-denied"
}
```

</details>

<details>

<summary>monitor-screening-query - Set person on monitoring</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/monitor-screening-query></mark>

**Description:**

Enable ongoing monitoring of a specific individual in screening databases. If the person is already on monitoring, an appropriate error will be returned.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `query` *(object, required)* – The parameters for querying the database.
  * `fullName` *(string, required)* – The last name of the individual.
  * `birthdayTimeFrom` *(string, optional)* – The start date and time of the birthday range in ISO 8601 format.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/monitor-screening-query \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey":"your-company-secret-key", 
        "query": 
            {
            "fullName": "John Doe",  
            "birthdayTimeFrom": "1982-11982-12-12T00:00:00Z"
            }
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "query": {
    "fullName": "John Doe",
    "birthdayTimeFrom": "1982-12-12T00:00:00Z"
  }
}
```

**Result examples:**

*default:*

```json
{
  "result": "64ad3b14090678e34512eab8"
}
```

*Already on monitoring:*

```json
{
    "argumentError": "already-exists"
}
```

</details>

<details>

<summary>remove-screening-query-from-monitoring - Remove person from monitoring</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/remove-screening-query-from-monitoring></mark>

**Description:**

Removes an individual from ongoing screening monitoring, unsubscribing from further updates or alerts related to that person.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `id` *(string, required)* - The ID of monitoring query.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/remove-screening-query-from-monitoring \
  -H 'Content-Type: application/json' \
  -d '{ 
      "companyKey": "your-company-secret-key", 
      "id": "64ad3b14090678e34512eab8"
      }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "id": "64ad3b14090678e34512eab8"
}
```

**Result examples:**

*default:*

```json
{ 
    "result": true
}
```

</details>

<details>

<summary>list-screening-monitoring-records - List screening records that are monitored</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/list-screening-monitoring-records></mark>

**Description:**

Retrieves a list of individuals currently being monitored for screening. This includes basic metadata like name, ID, and optionally the last updated date.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `start`  *(integer, optional)* – The number of items to skip from the beginning of the results.
* `limit` *(integer, optional)* – The maximum number of records to return.
* `date` *(string, optional, ISO 8601 format)* – Filters records after a specific date. If no date is provided, the entire list will be returned.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/list-screening-monitoring-records \
  -H 'Content-Type: application/json' \
  -d '{
      "companyKey":"your-company-secret-key", 
      "start":0, 
      "limit": 50
      }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "start": 0,
  "limit": 50,
  "date":"2023-07-10T12:26:00.576Z
}
```

**Result examples:**

*default:*

```json
{
  "result": {
    "start": 0,
    "limit": 50,
    "total": 4,
    "data": [
      {"fullName":"John Smith1","id":"64ad3b14090678e34512eab8"},
      {"fullName":"John Smith2","id":"64ad3ef45fcf054afc73ebb4", "lastUpdatedDate": "2023-07-01T10:50:42.389Z"},
      {"fullName":"John Smith3","id":"64ad3f3a8b3f54aca29fc0a2", "lastUpdatedDate": "2023-07-20T10:50:42.389Z"},
      {"fullName":"John Smith4","id":"64ad3f3a8b3f54aca29fc0a3"}
    ]
  }
}
```

</details>

### **Blacklist management**

Use these endpoints to manage your company's internal blacklist. You can flag individuals based on identifying attributes such as name, document number, or personal number, and retrieve or remove records as needed. Blacklist checks run automatically during verification sessions.

<details>

<summary>add-blacklist-record - Add person to the blacklist</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/add-blacklist-record></mark>

**Description:**

Adds a person to the blacklist based on identifying attributes such as name, document number, or personal number.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `query` *(object of strings, required)* - Object containing query details. **Must include** `reason` and **at least one of** the following: `firstName`, `lastName`, `personalNumber`, `documentNumber`, `birthday`.
  * firstName (string, optional) - First name of the individual.
  * lastName (string, optional) - Last name of the individual.
  * personalNumber (string, optional) - Personal identification number.
  * documentNumber (string, optional) - Document number (e.g., from an ID or passport).
  * birthday (string, optional) - Birthday in ISO 8601 format (e.g., 1990-05-14).
  * reason (string, required) - The reason for blacklisting the individual.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/add-blacklist-record' \
    -H 'Content-Type: application/json' \
    -d'{
        "companyKey": "your-company-secret-key",
        "query": {
            "firstName": "John",
            "lastName": "Doe",
            "personalNumber": "12345678901",
            "documentNumber": "123ABC123",
            "birthday": "1980-01-01T00:00:00.000Z",
            "reason": "Reason for adding to blacklist",
            "notes" : "Fraud-related activity"
                }
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key",
    "query": {
        "firstName": "John",
        "lastName": "Doe",
        "personalNumber": "12345678901",
        "documentNumber": "123ABC123",
        "birthday": "1980-01-01T00:00:00.000Z",
        "reason": "Reason for adding to blacklist",
        "notes" : "Fraud-related activity"
    }
}
```

**Result examples:**

*default:*

```json
{
    "result": "64ad3b14090678e34512eab8"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidCompanyKey:*

```json
{
  "argumentError": "invalid-company-key"
}
```

*alreadyExists*

```json
{  
  "argumentError": "already-exists"
}
```

</details>

<details>

<summary>remove-blacklist-record - Remove record from the blacklist</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/remove-blacklist-record></mark>

**Description:**

Removes previously added record from the blacklist.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `id` (string, required) - Blacklist record ID.&#x20;

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/remove-blacklist-record' \
    -H 'Content-Type: application/json' \
    -d'{
        "companyKey": "your-company-secret-key",
        "id": "682b09e4400b3a00067ebcf7"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key",
    "id": "682b09e4400b3a00067ebcf7"
}
```

**Result examples:**

*default:*

```json
{
    "result": true
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidCompanyKey:*

```json
{
"argumentError": "invalid-company-key"
}
```

*idNotFound:*

```json
{  
  "argumentError": "not-found"
}
```

</details>

<details>

<summary>list-blacklist-records - List all blacklist records associated with the company</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/list-blacklist-records></mark>

**Description:**

Retrieves all blacklist records associated with the company. You can optionally filter records by a query, set pagination with `offset` and `limit`, or retrieve the full list.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* query (object of strings, optional) - Optional filter fields:&#x20;
  * `offset` (number, optional) - Number of records to skip from the beginning.
  * `limit` (number, optional) - Maximum number of records to return.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/list-blacklist-records' \
    -H 'Content-Type: application/json' \
    -d'{
        "companyKey": "your-company-secret-key"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key"
}
```

**Result examples:**

*default:*

```json
{
    "result": {
        "offset": 0,
        "limit": 100,
        "total": 1,
        "data": [
            {
                "firstName": "John",
                "lastName": "Doe",
                "documentNumber": "123ABC123",
                "personalNumber": "012345678901",
                "birthday": "1980-01-01T00:00:00.000Z",
                "notes": "Fraud-related activity",
                "reason": "Reason for adding to blacklist",
                "id": "64f4d0ec35f5bb20a8022012"
            }
        ]
    }
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidCompanyKey:*

```json
{
"argumentError": "invalid-company-key"
}
```

*noRecord:*

```json
{
    "result": {
        "offset": 0,
        "limit": 100,
        "total": 0,
        "data": []
    }
}
```

</details>

### **Video call**&#x20;

Use these endpoints to manage and retrieve data from video call sessions. You can access screenshots taken by the operator during a call, retrieve recorded video files, and programmatically end an active call.

<details>

<summary>get-video-call-shots - Video call shots</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-video-call-shots></mark>

**Description:**

Retrieves all screenshots (shots) taken by the operator during a video call session. These images serve as part of the evidence captured during the KYC verification.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-video-call-shots \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```json
{
  "result": "data:application/x-tar;base64,base64String"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>get-video-call-videos - Video call videos</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-video-call-videos></mark>

**Description:**

Retrieves video recordings from a video call session.\
The endpoint supports two retrieval modes:

1. **Preferred (recommended):** retrieve a **single video file** using the `fileId` parameter.
2. **Legacy:** retrieve **all video files at once** (returned as a `.tar` archive).

Using `fileId` is recommended for better performance, reduced payload size, and improved reliability.

**Parameters:**

**Required**

* **companyKey** *(string)* — The company's secret key.
* **sessionId** *(string)* — The unique identifier of the session.

**Optional (recommended)**

* **fileId** *(string)* — The unique ID of the video file you want to retrieve.\
  When provided, the endpoint returns **only the specified video file** instead of a full archive.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-video-call-videos \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345",
        "fileId": "abc123xyz"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "fileId": "abc123xyz"
}
```

**Result examples:**

single file:

```json
"result": {
    "contentType": "video/mp4"
  }
```

*all files:*

```json
"result": {
    "contentType": "application/x-tar"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*notFound:*

```json
{  
    "argumentError": "not-found"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>end-video-call - End video call for the connected user</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/end-video-call></mark>

**Description:**

Manually ends an active video call session for the connected user. This endpoint is typically used by system to forcefully close a session that is still ongoing.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-video-call-videos \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId":"example-session-id-12345"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345"
}
```

**Result examples:**

*default:*

```
{ }
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

</details>

### Questionnaire attachments

Use these endpoints to manage files associated with attachment-type questions across questionnaire steps. Files can originate from multiple sources — uploaded by the user during their KYC session, submitted by an operator in Manage, defined statically in a configuration, or uploaded programmatically via the API.

<details>

<summary>get-question-file - Get file from the question</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-question-file></mark>

**Description:**

Retrieves a file attached to a question in a questionnaire step. Use this endpoint to access files regardless of how they were submitted — this includes files uploaded **by the user during their KYC session** and files submitted **by an operator in Manage**. Use `fileIndex` to reference a specific file when multiple files are attached to the same question.

\
**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionId` *(string, required)* - The unique identifier of the session.
* `stepKey` *(string, required)* – The unique key of the questionnaire step.
* `questionKey`*(string, required)* – The unique key of the question within the questionnaire.
* `fileIndex` *(integer, optional)* – The index of the file when multiple files are uploaded to a question. This is used to reference a specific file within the question’s attachments.

**cURL example:**

```bash
curl -X POST 'https://external-api.identomat.com/get-question-file' \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345",
        "stepKey": "user-questionnaire-1a2b3c",
        "questionKey": "question-1",
        "fileIndex": 0
}'
```

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "stepKey": "user-questionnaire-1",
  "questionKey": "question-1",
  "fileIndex": 0
}
```

**Result examples:**

*default:*

```json
{
  "result": {
        "contentType": "application/pdf | image/png | image/jpeg"
    }
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

</details>

<details>

<summary>upload-file - Upload file to a question</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/upload-file></mark>

**Description:**

Uploads a file to a specific Attachment-type question within a questionnaire step. The file must be provided as a base64-encoded data URI. Returns a `fileId` that can be used to retrieve or delete the file later.

**Supported formats:**

* `data:application/pdf;base64,...`
* `data:image/jpeg;base64,...`
* `data:image/png;base64,...`

**Parameters:**

* `companyKey` *(string, required)* — The company's secret key.
* `sessionId` *(string, required)* — The unique identifier of the session.
* `stepKey` *(string, required)* — The unique key of the questionnaire step.
* `questionKey` *(string, required)* — The unique key of the Attachment-type question.
* `content` *(string, required)* — The file content as a base64-encoded data URI (e.g. `data:image/png;base64,...`).

**cURL example:**

```bash
curl -X POST https://external-api.identomat.com/upload-file \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345",
        "stepKey": "user-questionnaire-1a2b3c",
        "questionKey": "question-1",
        "content": "data:image/png;base64,iVBORw0KGgo..."
    }'
```

**Request parameter example:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "stepKey": "user-questionnaire-1a2b3c",
  "questionKey": "question-1",
  "content": "data:image/png;base64,iVBORw0KGgo..."
}
```

**Result examples:**

*default:*

```json
{
  "result": "9iomy86NuoOQnK7l2puTgiSapWf22xFwn6KRn4FG"
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

</details>

<details>

<summary>get-file - Get file from a question</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-file></mark>

**Description:**

Retrieves a file that was uploaded programmatically via the `upload-file` endpoint.

**Parameters:**

* `companyKey` *(string, required)* — The company's secret key.
* `sessionId` *(string, required)* — The unique identifier of the session.
* `stepKey` *(string, required)* — The unique key of the questionnaire step.
* `questionKey` *(string, required)* — The unique key of the Attachment-type question.
* `filename` *(string, required)* — The file ID returned by `upload-file`.

**cURL example:**

```bash
curl -X POST https://external-api.identomat.com/get-file \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345",
        "stepKey": "user-questionnaire-1a2b3c",
        "questionKey": "question-1",
        "filename": "9iomy86NuoOQnK7l2puTgiSapWf22xFwn6KRn4FG"
    }'
```

**Request parameter example:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "stepKey": "user-questionnaire-1a2b3c",
  "questionKey": "question-1",
  "filename": "9iomy86NuoOQnK7l2puTgiSapWf22xFwn6KRn4FG"
}
```

**Result examples:**

*default:*

```json
File stream
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

</details>

<details>

<summary>delete-file - Delete file from a question</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/delete-file></mark>

**Description:**

Permanently deletes a previously uploaded file from an Attachment-type question. This operation is irreversible.

**Parameters:**

* `companyKey` *(string, required)* — The company's secret key.
* `sessionId` *(string, required)* — The unique identifier of the session.
* `stepKey` *(string, required)* — The unique key of the questionnaire step.
* `questionKey` *(string, required)* — The unique key of the Attachment-type question.
* `filename` *(string, required)* — The file ID returned by `upload-file`.

**cURL example:**

```bash
curl -X POST https://external-api.identomat.com/delete-file \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "sessionId": "example-session-id-12345",
        "stepKey": "user-questionnaire-1a2b3c",
        "questionKey": "question-1",
        "filename": "9iomy86NuoOQnK7l2puTgiSapWf22xFwn6KRn4FG"
    }'
```

**Request parameter example:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionId": "example-session-id-12345",
  "stepKey": "user-questionnaire-1a2b3c",
  "questionKey": "question-1",
  "filename": "9iomy86NuoOQnK7l2puTgiSapWf22xFwn6KRn4FG"
}
```

**Result examples:**

*default:*

```json
{
  "result": true
}
```

*sessionNotFound:*

```json
{
  "argumentError": "session-not-found"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

</details>

### Other methods

Use these endpoints to manage groups, users, and session configurations in Manage. Groups can be used to control which operators have access to specific sessions. User management endpoints allow you to create, list, and delete platform users programmatically. You can also retrieve the full details of a session configuration by its ID.

<details>

<summary>list-groups - List groups</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/list-groups></mark>

**Description:**

Retrieves a list of groups associated with the specified company. Each group includes its ID, name, and a list of its members.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/list-groups \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key"
}
```

**Result examples:**

*default:*

```json
{
  "result": [
        {
            "id": "650976e8dc32104b8bb1757e",
            "name": "group_name",
            "memberUserIds": [
                        "64f4d0ec35f5bb20a8022012",
                        "64f4d10435f5bb20a8022013",
                        "64f4d12335f5bb20a8022014"
              ]
        }
    ]
}
```

*noGroups:*

```json
{
  "result": []
}
```

*notFound:*

```json
{  
    "argumentError": "not-found"
}
```

</details>

<details>

<summary>make-group - Create a new group</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/make-group></mark>

**Description:**

Creates a new user group under the specified company. A group can be used to manage permissions, assign sessions, or organize users.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `name` *(string, required)* – The name of the new group.
* `memberIds` *(array of strings, optional)* – A list of user IDs to be added to the group.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/make-group' \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "name": "GroupName",
        "memberIds": 
            [ 
            "user1_id", 
            "user2_id"
            ]
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key",
    "name": "GroupName",
    "memberIds": [ "user1_id", "user2_id"
    ]
}
```

**Result examples:**

*default:*

```json
{
    "result": {
        "id": "6784c6d768cb9e8a891087e1"
    }
}
```

*wrongParameter:*

```json
{
    "argumentError":"wrong-parameters",
    "errorSourceGroup":"service-module-server-external"
}
```

</details>

<details>

<summary>change-group - Update existing group</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/make-group></mark>

**Description:**

Allows you to modify an existing group by updating its name or changing the members in the group. **To keep existing members in the group, you must include their IDs in the list.**

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `groupId` *(string, required)* – The unique identifier of the group.
* `name` *(string, optional)* – The name of the new group.
* `memberIds` *(array of strings, optional)* – A list of user IDs to be added or removed from the group. To keep existing members in the group, you must include their IDs in the list.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/change-group' \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "groupId": "64a50a0c6c2ff7f9a1f12833",
        "name": "Group 1",
        "memberIds": 
            [ 
            "user1_id", 
            "user2_id"
            ]
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key",
    "groupId": "64a50a0c6c2ff7f9a1f12833",
    "name": "Group 1",
    "memberIds": [ "user1_id", "user2_id"
    ]
}
```

**Result examples:**

*default:*

```
{}
```

*wrongParameter:*

```json
{
    "argumentError":"wrong-parameters",
    "errorSourceGroup":"service-module-server-external"
}
```

</details>

<details>

<summary>delete-group - Delete a group</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/delete-group></mark>

**Description:**

Allows you to delete a group permanently from the system.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `groupId` *(string, required)* – The unique identifier of the group.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/delete-group' \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key",
        "groupId": "64b63613ad6f7ccaec256773"
    ]
}'
```

{% endcode %}

**Request parameter examples:**

```json
{
    "companyKey": "your-company-secret-key",
    "groupId": "64b63613ad6f7ccaec256773"
    ]
}
```

**Result examples:**

*default:*

```
{}
```

*wrongParameter:*

```json
{
    "argumentError":"wrong-parameters",
    "errorSourceGroup":"service-module-server-external"
}
```

</details>

<details>

<summary>list-users - List users</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/list-users></mark>

**Description:**

This endpoint retrieves a list of users associated with the company.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/list-users \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey": "your-company-secret-key"
        }'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key"
}
```

**Result examples:**

*default:*

```json
{
    "result": [
        {
            "id": "user_id",
            "username": "user@identomat.com",
            "roles": [
                "administrator",
                "operator",
                "call_center_operator"
            ]
        }
    ]
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidAccess:*

```json
{
  "argumentError": "invalid-access"
}
```

</details>

<details>

<summary>create-user - Create a user</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/create-user></mark>

**Description:**

Creates a new user for the Identomat platform (Manage).

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `email` *(string, required)* - The email address of the new user.
* `emailVerified` (boolean, optional) - Whether the email should be marked as verified. Defaults to `false`.
* `password` (string, required) - The user’s password (minimum 8 characters).
* `firstName` (string, optional) - First name of the user.
* `lastName` (string, optional) - Last name of the user.
* `rights` (array of strings, optional) - List of roles to assign to the user. If omitted, defaults to `call_center_operator`. Valid values are:
  * `call_center_operator`
  * `operator`
  * `administrator`

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/create-user' \
    -H 'Content-Type: application/json' \
    -d'{
        "companyKey": "your-company-secret-key",
        "email": "john.doe@example.com",
        "emailVerified": true,
        "password": "SecurePass123!",
        "firstName": "John",
        "lastName": "Doe",
        "rights": [
            "call_center_operator",
            "administrator",
            "operator"
    ]
}'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "email": "john.doe@example.com",
  "emailVerified": true,
  "password": "SecurePass123!",
  "firstName": "John",
  "lastName": "Doe",
  "rights": [
        "call_center_operator",
        "administrator",
        "operator"
    ]
}
```

**Result examples:**

*default:*

```json
{
    "result": "68243e94540d1e5fe6c04a0f"
}
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidCompanyKey:*

```json
{
  "argumentError": "invalid-company-key"
}
```

*invalidEmailFormat:*

```json
{
  "argumentError": "invalid-email-format"
}
```

*passwordTooShort*

```json
{
  "argumentError": "password-too-short"
}
```

*passwordIsNotString*

```json
{
  "internalError": Illegal arguments: number, string"
}
```

*invalidRights*

```json
{
  "argumentError": "invalid-rights"
}
```

*userAlreadyExists:*

```json
{
  "argumentError": "user-already-exists"
}
```

</details>

<details>

<summary>delete-user - Delete a user</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/delete-user></mark>

**Description:**

Deletes a user from the Identomat platform (Manage).

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `userId` *(string, required)* - The unique idenfitier of the user.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST 'https://external-api.identomat.com/delete-user' \
    -H 'Content-Type: application/json' \
    -d'{
        "companyKey": "your-company-secret-key",
        "userId": "68243e94540d1e5fe6c04a0f"
    ]
}'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "userId": "68243e94540d1e5fe6c04a0f"
}
```

**Result examples:**

*default:*

```
{ }
```

*wrongParameters:*

```json
{
  "argumentError": "wrong-parameters"
}
```

*invalidCompanyKey:*

```json
{
  "argumentError": "invalid-company-key"
}
```

*userNotFound:*

```json
{
  "argumentError": "user-not-found"
}
```

</details>

<details>

<summary>get-session-config - Get session configuration</summary>

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/get-session-config></mark>

**Description:**

This endpoint retrieves the configuration details for a specific session configuration based on the given session config ID.

**Parameters:**

* `companyKey` *(string, required)* - The company's secret key.
* `sessionConfigId` *(string, required)* – The unique identifier for the session configuration.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/get-session-config \
    -H 'Content-Type: application/json' \
    -d '{
        "companyKey":"your-company-secret-key",
        "sessionConfigId":"6162636465666768696a6b6c"
}'
```

{% endcode %}

**Request parameter examples:**

```json
{
  "companyKey": "your-company-secret-key",
  "sessionConfigId": "6162636465666768696a6b6c"
}
```

**Result examples:**

*default:*

```json
{
  "result": {
    "id": "679c74e4d9725987e3879265",
    "name": "Configuration Template",
    "general": {
        "language": "en",
        "sessionLifetime": 15
        },
    "steps": [
      {
        "title": {
          "en": "ID Verification"
        },
        "type": "identity-document",
        "key": "select_document_id",
        "flags": {
          "documentTypes": [
            "id",
            "passport",
            "driver_license",
            "residence_permit"
          ]
        }
      },
      {
        "title": {
          "en": "Liveness Check"
        },
        "type": "liveness",
        "key": "liveness",
        "flags": {
          "liveness": true,
          "maxLivenessAttempts": 3
        }
      }
    ]
  }
}

```

*wrongParameters:*

```
{
  "argumentError": "wrong-parameters"
}
```

</details>

### Processing an image

Use these endpoints to extract data from identity document images independently of a verification session. Each endpoint accepts a JPEG image and returns structured data parsed from the document. The number of fields returned may vary depending on the document type and the quality of the image.

<details>

<summary>card/front/ - ID card front side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/card/front/></mark>

**Parameters:**

* `company_key` *(string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/card/front/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Given_Names_en_US": "JOHN",
    "Surname_en_US": "DOE",
    "citizenship": "USA",
    "Sex_en_US": "M",
    "Personal_Number_en_US": "1234567890",
    "Date_of_Birth_en_US": "1/1/1990",
    "Date_of_Expiry_en_US": "1/1/2030",
    "Document_Number_en_US": "USA1234567",
    "Issuing_State_Code_en_US": "USA",
    "Date_of_Birth_ISO": "1990-01-01T00:00:00.000Z",
    "Date_of_Expiry_ISO": "2030-01-01T00:00:00.000Z",
    "requestId": "abcdef1234567890abcdef1234567890",
    "person": {
        "first_name": "JOHN",
        "last_name": "DOE",
        "birthday": "1/1/1990",
        "birthday_time": "1990-01-01T00:00:00.000Z",
        "age": 34,
        "citizenship": "USA",
        "document_number": "USA1234567",
        "document_expires": "1/1/2030",
        "document_expires_time": "2030-01-01T00:00:00.000Z",
        "personal_number": "1234567890",
        "issuing_state": "USA",
        "sex": "M"
    }
}
```

</details>

<details>

<summary>card/back/ - ID card back side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/card/back/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/card/back/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example-image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Date_of_Issue_en_US": "6/28/2021",
    "Issuing_State_Code_en_US": "USA",
    "Place_of_Birth_en_US": "USA",
    "Date_of_Issued_ISO": "2021-06-28T00:00:00.000Z",
    "Given_Names_en_US": "JOHN DOE",
    "Surname_en_US": "DOE",
    "Nationality_Code_en_US": "USA",
    "Sex_en_US": "M",
    "Personal_Number_en_US": "1234567890",
    "Date_of_Birth_en_US": "1/1/1990",
    "Date_of_Expiry_en_US": "6/28/2031",
    "Document_Number_en_US": "USA1234567",
    "Nationality_en_US": "USA",
    "Date_of_Birth_ISO": "1990-01-01T00:00:00.000Z",
    "Date_of_Expiry_ISO": "2031-06-28T00:00:00.000Z",
    "mrz": "IDUSA1234567938001085718<<<<\n8001081M2606288USA<<<<<<<<<<<1\nDOE<<JOHN<<<<<<<<<<<<<<<<<<<<<",
    "requestId": "abcdef1234567890abcdef1234567890",
    "person": {
        "first_name": "JOHN DOE",
        "last_name": "DOE",
        "birthday": "1/1/1990",
        "birthday_time": "1990-01-01T00:00:00.000Z",
        "age": 34,
        "birth_place": "USA",
        "nationality": "USA",
        "document_number": "USA1234567",
        "document_issued": "6/28/2021",
        "document_expires": "6/28/2031",
        "document_expires_time": "2031-06-28T00:00:00.000Z",
        "document_issued_time": "2021-06-28T00:00:00.000Z",
        "personal_number": "1234567890",
        "issuing_state": "USA",
        "sex": "M",
        "mrz": "IDUSA1234567938001085718<<<<\n8001081M2606288USA<<<<<<<<<<<1\nDOE<<JOHN<<<<<<<<<<<<<<<<<<<<<"
    }
}
```

</details>

<details>

<summary>license/front/ - Driver license front side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/license/front/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/license/front/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Given_Names_en_US": "John",
    "Surname_en_US": "Doe",
    "Given_Names_ka_GE": "ჯონ",
    "Surname_ka_GE": "დო",
    "Personal_Number_en_US": "1234567890",
    "Date_of_Birth_en_US": "1/1/1985",
    "Date_of_Issue_en_US": "5/15/2015",
    "Document_Number_en_US": "ID1234567",
    "Issuing_State_Code_en_US": "USA",
    "Place_of_Birth_en_US": "Los Angeles",
    "Authority_en_US": "Department of Motor Vehicles",
    "Date_of_Birth_ISO": "1985-01-01T00:00:00.000Z",
    "Date_of_Issued_ISO": "2015-05-15T00:00:00.000Z",
    "Address_en_US": "456 Main St, Los Angeles, CA 90001",
    "Local_Address_en_US": "456 Main St, Los Angeles, CA 90001",
    "localAuthority": "Department of Motor Vehicles",
    "Drivers_License_Class_en_US": "C",
    "requestId": "a1b2c3d4e5f67890",
    "person": {
        "local_first_name": "ჯონ",
        "local_last_name": "დო",
        "first_name": "John",
        "last_name": "Doe",
        "birthday": "1/1/1985",
        "birthday_time": "1985-01-01T00:00:00.000Z",
        "age": 40,
        "birth_place": "Los Angeles",
        "document_number": "ID1234567",
        "document_issued": "5/15/2015",
        "document_issued_time": "2015-05-15T00:00:00.000Z",
        "personal_number": "1234567890",
        "authority": "Department of Motor Vehicles",
        "local_authority": "Department of Motor Vehicles",
        "issuing_state": "USA",
        "address": "456 Main St, Los Angeles, CA 90001",
        "local_address": "456 ქუჩა, ლოს ანჯელესი, CA 90001"
    }
}
```

</details>

<details>

<summary>license/back/ - Driver license back side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/license/back/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/license/back/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Issuing_State_Code_en_US": "USA",
    "requestId": "262f6ee39992e0a61769c5cc13b2f092",
    "person": {
        "issuing_state": "USA"
    }
}
```

</details>

<details>

<summary>residence/front/ - Residence permit front side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/residence/front/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/residence/front/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Given_Names_en_US": "John",
    "Surname_en_US": "Doe",
    "Nationality_Code_en_US": "USA",
    "Sex_en_US": "M",
    "Date_of_Birth_en_US": "5/15/1985",
    "Date_of_Expiry_en_US": "12/31/2030",
    "Document_Number_en_US": "D12345678",
    "Nationality_en_US": "USA",
    "Issuing_State_Code_en_US": "USA",
    "Date_of_Birth_ISO": "1985-05-15T00:00:00.000Z",
    "Date_of_Expiry_ISO": "2030-12-31T00:00:00.000Z",
    "requestId": "1234567890abcdef1234567890abcdef",
    "person": {
        "first_name": "John",
        "last_name": "Doe",
        "birthday": "5/15/1985",
        "birthday_time": "1985-05-15T00:00:00.000Z",
        "age": 40,
        "nationality": "USA",
        "document_number": "D12345678",
        "document_expires": "12/31/2030",
        "document_expires_time": "2030-12-31T00:00:00.000Z",
        "issuing_state": "USA",
        "sex": "M"
    }
}
```

</details>

<details>

<summary>residence/back/ - Residence permit back side</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/residence/back/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/residence/back/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "Date_of_Issue_en_US": "7/1/2020",
    "Issuing_State_Code_en_US": "ITA",
    "Place_of_Birth_en_US": "CITTA",
    "Date_of_Issued_ISO": "2020-07-01T00:00:00.000Z",
    "Given_Names_en_US": "John",
    "Surname_en_US": "Doe",
    "Nationality_Code_en_US": "USA",
    "Sex_en_US": "M",
    "Date_of_Birth_en_US": "5/15/1985",
    "Date_of_Expiry_en_US": "12/31/2030",
    "Document_Number_en_US": "D12345678",
    "Nationality_en_US": "USA",
    "Date_of_Birth_ISO": "1985-05-15T00:00:00.000Z",
    "Date_of_Expiry_ISO": "2030-12-31T00:00:00.000Z",
    "mrz": "P<USADOE<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<\nD12345678USA850515M3031232<<<<<<<<<<<<<<06",
    "requestId": "5924aa4e44eb394f7cd2377568c21859",
    "person": {
        "first_name": "John",
        "last_name": "Doe",
        "birthday": "5/15/1985",
        "birthday_time": "1985-05-15T00:00:00.000Z",
        "age": 40,
        "birth_place": "CITTA",
        "nationality": "USA",
        "document_number": "D12345678",
        "document_issued": "7/1/2020",
        "document_expires": "12/31/2030",
        "document_expires_time": "2030-12-31T00:00:00.000Z",
        "document_issued_time": "2020-07-01T00:00:00.000Z",
        "issuing_state": "ITA",
        "sex": "M",
        "mrz": "P<USADOE<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<\nD12345678USA850515M3031232<<<<<<<<<<<<<<06"
    }
}
```

</details>

<details>

<summary>passport/ - Passport photo page</summary>

**URL:**

<mark style="color:blue;"><https://widget.identomat.com/external-api/passport/></mark>

**Parameters:**

* `company_key` (*string, required)* - The company's secret key.
* `image` *(file, required)* – A JPEG image file to be uploaded.

**cURL example:**

{% code overflow="wrap" %}

```bash
curl https://widget.identomat.com/external-api/passport/ \
    -F 'company_key={your-company-secret-key}' \
    -F 'image=@{example_image.jpg}'
```

{% endcode %}

**Result example:**

*default:*

```json
{
    "mrzData": {
        "Given_Names_en_US": "JOHN",
        "Surname_en_US": "DOE",
        "Nationality_Code_en_US": "USA",
        "Sex_en_US": "M",
        "Date_of_Birth_en_US": "1/1/1990",
        "Date_of_Expiry_en_US": "1/1/2030",
        "Document_Number_en_US": "USA1234567",
        "Nationality_en_US": "USA",
        "Issuing_State_Code_en_US": "USA",
        "Date_of_Birth_ISO": "1990-01-01T00:00:00.000Z",
        "Date_of_Expiry_ISO": "2030-01-01T00:00:00.000Z",
        "mrz": "P<USADOE<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<\nUSA1234567USA9001019M3001019<<<<<<<<<<<<<<00"
    },
    "visualData": {
        "Given_Names_en_US": "JOHN",
        "Surname_en_US": "DOE",
        "Nationality_Code_en_US": "USA",
        "Sex_en_US": "M",
        "Personal_Number_en_US": "1234567890",
        "Date_of_Birth_en_US": "1/1/1990",
        "Date_of_Expiry_en_US": "1/1/2030",
        "Date_of_Issue_en_US": "1/1/2020",
        "Document_Number_en_US": "USA1234567",
        "Nationality_en_US": "USA",
        "Issuing_State_Code_en_US": "USA",
        "Place_of_Birth_en_US": "NEW YORK",
        "Authority_en_US": "USA AUTHORITY",
        "Date_of_Birth_ISO": "1990-01-01T00:00:00.000Z",
        "Date_of_Expiry_ISO": "2030-01-01T00:00:00.000Z",
        "Date_of_Issued_ISO": "2020-01-01T00:00:00.000Z"
    },
    "requestId": "1234567890abcdef1234567890abcdef",
    "person": {
        "first_name": "JOHN",
        "last_name": "DOE",
        "birthday": "1/1/1990",
        "birthday_time": "1990-01-01T00:00:00.000Z",
        "age": 34,
        "birth_place": "NEW YORK",
        "nationality": "USA",
        "document_number": "USA1234567",
        "document_issued": "1/1/2020",
        "document_expires": "1/1/2030",
        "document_expires_time": "2030-01-01T00:00:00.000Z",
        "document_issued_time": "2020-01-01T00:00:00.000Z",
        "personal_number": "1234567890",
        "authority": "USA AUTHORITY",
        "issuing_state": "USA",
        "sex": "M",
        "status": "FIELDS_MISMATCH",
        "mrz": "P<USADOE<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<\nUSA1234567USA9001019M3001019<<<<<<<<<<<<<<00"
    }
}
```

</details>

### Additional processing

Use these endpoints for standalone biometric operations outside of a verification session. Currently this includes face comparison, which returns a similarity score for two provided face images.

<details>

<summary>compare-faces/ - Get a similarity score for two faces</summary>

The minimum recommended face size in the picture is **80 pixels**. If the face size is between **65-79 pixels**, an error code will be returned along with the similarity score.

**URL:**

<mark style="color:blue;"><https://external-api.identomat.com/compare-faces></mark>

**Parameters:**

* `companyKey` (string, required) - The company's secret key.
* `face1` *(file, required)* - A JPEG image file for face1
* `face2` *(file, required)* - A JPEG image file for face2

**cURL example:**

{% code overflow="wrap" %}

```bash
curl -X POST https://external-api.identomat.com/compare-faces \
    -F 'companyKey={your-company-secret-key}' \
    -F 'face1=@{example_face1.jpg}' \
    -F 'face2=@{example_face2.jpg}'
```

{% endcode %}

**Result examples:**

*default:*

```json
{
    "result": {
        "similarity": 0.9399788229619534,
        "face1Statuses": [],
        "face2Statuses": []
    }
}
```

*error:*

```json
{
    "result": {
        "similarity": null,
        "face1Statuses": [
            "FACE_FAR_AWAY"
        ],
        "face2Statuses": []
    }
}
```

</details>


# Callbacks

Learn how to receive and handle real-time status updates and event notifications from the verification flow using callbacks.

## Overview

Callbacks allow your system to receive event notifications directly from the platform whenever specific actions occur, such as one-time password (OTP) creation, session sharing, or status updates.

Callbacks are sent as `POST` requests to the URL defined in your **company settings**. Each callback includes a `callbackApiKey` that can be used to verify authenticity.

## Prerequisites

To enable callbacks, clients must configure the following parameters in their **Company settings**:

* **Callback URL** – endpoint where the callback payloads will be sent.
* **Callback API key** – a unique key for authentication and verification.

***

## SMS provider callbacks

If the **Client’s own SMS provider** is selected in company settings, the system sends callback requests instead of delivering SMS directly. The client is then responsible for sending the SMS messages based on the received callback data.

### Callback event: **one-time-password**

**Description:**\
Triggered when a one-time password (OTP) is generated and must be sent to the end-user during phone number verification.

**Requirements:**

* Callback URL (mandatory)
* Callback API key (mandatory)

**Sample callback payload:**

```json
{
  "callbackApiKey": "callback-api-key-123",
  "type": "one-time-password-request",
  "sessionId": "wwb83rh1se22wd81z0tx8bqlerljq5kgf6rxem1q",
  "text": "Your code is 6867",
  "phoneNumber": "+995512345678"
}
```

### Callback event: **share-session-link-via-sms**

**Description:**\
Triggered when a session link is shared with a user via SMS from the Manage platform.

**Requirements:**

* Callback URL (mandatory)
* Callback API key (mandatory)

**Sample callback payload:**

```json
{
  "callbackApiKey": "apikey123",
  "type": "share-session-link-via-sms",
  "sessionId": "ku2a5ldv4i13go76ftkych1je055nvyjtvjuurkp",
  "text": "Hello John Doe, please complete your verification using the link below.",
  "phoneNumber": "+995512345678",
  "sessionLink": "https://widget.identomat.com/?session_token=ku2a5ldv4i13go76ftkych1je055nvyjtvjuurkp",
  "createdBy": "operator@example.com"
}
```

***

## Email provider callbacks

If your company uses **Client's own provider** in the Email provider settings, Identomat will send callbacks to your system for sending emails.

### Callback event: share-session-link-via-email

**Description:**\
Triggered when a verification session link is shared via email from the Manage platform.

**Client must provide:**

* Callback URL
* Callback API key

**Sample callback payload:**

```json
{
  "callbackApiKey": "apikey123",
  "type": "share-session-link-via-email",
  "sessionId": "5alhw0070l2gy82q0mqlfniv7gwgbqqs0rtctolg",
  "address": "john.doe@example.com",
  "subject": "Verification Required",
  "content": "Dear John Doe, please complete your verification using the link below.",
  "cc": "support@example.com",
  "sessionLink": "https://widget.identomat.com/?session_token=5alhw0070l2gy82q0mqlfniv7gwgbqqs0rtctolg",
  "createdBy": "operator@example.com"
}
```

### Callback Event: email-one-time-password-request

**Description:**\
Triggered when a one-time password (OTP) is generated and must be sent to the end-user during email verification.

**Requirements:**

* Callback URL (mandatory)
* Callback API key (mandatory)

**Sample callback payload:**

```json
{
    "callbackApiKey": "apikey123",
    "type": "email-one-time-password-request",
    "sessionId": "5alhw0070l2gy82q0mqlfniv7gwgbqqs0rtctolg",
    "address": "john.doe@example.com",
    "subject": "Mail Verification",
    "content": "Your code is 6867"
}
```

***

## Session status callbacks

This callback is independent of the provider settings.\
It notifies the client whenever a session’s status changes.

### Callback Event: session-change

**Client must provide:**

* Callback URL
* Callback API key

**Sample callback payload:**

```json
{
  "callbackApiKey": "apikey123",
  "type": "session-change",
  "sessionId": "ku2a5ldv4i13go76ftkych1je055nvyjtvjuurkp",
  "result": "APPROVED"
}
```

The `result` field in a `session-change` callback reflects the current session status. Possible values:

<table><thead><tr><th width="306.64453125">Value</th><th>Description</th></tr></thead><tbody><tr><td><code>APPROVED</code></td><td>The session was approved.</td></tr><tr><td><code>REJECTED</code></td><td>The session was rejected.</td></tr><tr><td><code>MANUAL_CHECK</code></td><td>The session requires manual review.</td></tr><tr><td><code>ADDITIONAL_INFORMATION_REQUESTED</code></td><td>The operator has requested further verification from the applicant.</td></tr></tbody></table>

**KYB sessions**

For KYB sessions, the payload includes an additional `sessionType` field:

```json
{
  "callbackApiKey": "apikey123",
  "type": "session-change",
  "sessionId": "65lfvkv1t2o25ozimqu3nh797umb1ydvkpltl3ib",
  "result": "APPROVED",
  "sessionType": "kyb"
}
```

> If `sessionType` is absent, the session is a standard KYC session.

***

## Video call callbacks

These callbacks are triggered during the video call process and notify the client about the availability or absence of recorded video files.

The callback is sent regardless of whether a video was successfully created.\
This allows clients to detect when a room ended **without media**, or when a video file becomes **ready for retrieval**.

### Callback event: **video-call-status-update**

**Description:**\
Sent whenever a video call room changes status.\
This includes cases where:

* the video call room ended with **no media recorded** (`roomStatus: "empty"`), or
* the video file has been successfully **created and uploaded** (`videoFileStatus: "available"`).

**Client must provide:**

* Callback URL
* Callback API key

{% hint style="info" %}
This callback is used for real-time notifications, but the complete and always up-to-date video call status is also available in the **`videoCallStatus`** field of the[ **`/result` endpoint.**](/developer-tools/api-reference#result-session-results) This allows clients to poll `/result` or perform state recovery if any callback is missed.\
\
When a recording becomes available, we strongly recommend retrieving it using the **`fileId`** parameter of the [**`/get-video-call-videos`**](/developer-tools/api-reference#get-video-call-videos-video-call-videos) endpoint.\
Using `fileId` allows your system to download video files **one-by-one**, provides better control over large recordings, and avoids fetching unnecessary files.

Downloading all files in a single request is still supported for backward compatibility but is **not recommended** for new integrations.
{% endhint %}

#### Case 1 — Room ended with no media recorded

**Sample callback payload:**

```json
{
  "callbackApiKey": "apikey123",
  "type": "video-call-status-update",
  "sessionId": "wtmfcr7tcj4q04co8mdg8yryou9glrcr2tbzm016",
  "roomId": "RM860d0a0272a619cdc0b4a855e75f8466",
  "roomStatus": "empty",
  "compositionStatus": null,
  "videoFileStatus": null,
  "videoFileId": null
}
```

#### Case 2 — Video file created and ready for retrieval

**Sample callback payload:**

```json
{
  "callbackApiKey": "apikey123",
  "type": "video-call-status-update",
  "sessionId": "ypsgyus3mosob3tugu3emgekqjykam5nvue1z1fu",
  "roomId": "RMc7eb8093d2461af50834f69e86692db3",
  "roomStatus": "ended",
  "compositionStatus": "available",
  "videoFileStatus": "available",
  "videoFileId": "hwenFYGlG54kRjmSruy3kxg54zV2pNPwHimseYao"
}
```

<table><thead><tr><th width="236.953125">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>callbackApiKey</strong></td><td>Key used for authentication.</td></tr><tr><td><strong>type</strong></td><td>Always <code>"video-call-status-update"</code>.</td></tr><tr><td><strong>sessionId</strong></td><td>The ID of the verification session.</td></tr><tr><td><strong>roomId</strong></td><td>Unique identifier of the video room.</td></tr><tr><td><strong>roomStatus</strong></td><td>Indicates the state of the room (<code>empty</code>, <code>ended</code>).</td></tr><tr><td><strong>compositionStatus</strong></td><td>Status of composition file, if any (<code>available</code>, <code>null</code>).</td></tr><tr><td><strong>videoFileStatus</strong></td><td>Indicates whether the video file is ready (<code>available</code>, <code>null</code>).</td></tr><tr><td><strong>videoFileId</strong></td><td>Identifier of the uploaded video file, if available.</td></tr></tbody></table>


# Additional information requests

Request additional verification steps from applicants within an existing session, without losing audit history.

### How it works

When an operator triggers an additional information request, a new verification link is generated for the applicant. The operator sends it via Manage — by SMS, email, or by copying and sharing the link manually. The session ID visible in Manage remains the same throughout all verification requests.

Upon opening the link, the applicant is presented only with **the steps defined in the new verification request.** Previously completed steps are not shown to the applicant and their data is not modified.

Decisions (automatic or manual) apply to the current verification request only. Once all steps in the request are completed, the standard decision flow runs as normal.

***

### Session status

A new session status is introduced for this feature:

<table><thead><tr><th width="302.0625">Status</th><th>Description</th></tr></thead><tbody><tr><td><code>additional_information_requested</code></td><td>The session has been returned to the applicant for further verification. Sits between a terminal state and <code>in_progress</code>.</td></tr></tbody></table>

#### **Status transitions:**

```
approved / rejected / manual_check / expired
        ↓
additional_information_requested
        ↓ (applicant opens the link)
in_progress
        ↓
approved / rejected / manual_check
```

***

### Verification history

A session can go through multiple verification requests over its lifetime. Each request generates its own set of steps based on the selected configuration. If a step type was completed in a previous request, it is generated again as a new attempt — full history is preserved and accessible for audit purposes. The latest attempt per step is used for review and decision-making.

***

### Enabling the feature

* **How to enable**: [Toggle this setting](/no-code-workflows/configuration-settings#request-additional-information) on in the **Configuration settings** tab of the configurations builder.&#x20;

```json
"sessionConfig": {
  "id": "6792031d9e97ea46872e190c",
  "name": "My Configuration",
  "additionalInformationRequest": true
}
```

When enabled, operators will see the **Request more information** button on eligible sessions in Manage.

Configurations available for selection when making a request are filtered by the operator's group membership, consistent with access control rules applied elsewhere in the platform.


# Document data review

Enable end-users and operators to review and correct OCR-extracted document data within a verification session, with a full audit trail of all changes.

### Overview

When a document is scanned during verification, data is extracted automatically via OCR. The Document data review feature allows this extracted data to be reviewed and corrected — by the applicant, the operator, or both — before a final decision is made.

All edits are fully logged with timestamps and actor information, preserving a complete audit trail accessible via session activities.

***

#### Data source trust hierarchy

Not all fields are editable. The system enforces a strict trust hierarchy based on how data was read:

| Source           | Editable     |
| ---------------- | ------------ |
| NFC              | Never        |
| QR               | Never        |
| MRZ              | Never        |
| OCR              | Configurable |
| Manually entered | Configurable |

Fields populated from NFC, QR, or MRZ are **permanently read-only** regardless of configuration. This rule is enforced at the backend level and cannot be overridden.

***

#### Configurable fields

The following fields can be enabled for review and correction:

* First Name (English)
* First Name (Local)
* Middle Name (English)
* Middle Name (Local)
* Last Name (English)
* Last Name (Local)
* Father's Name (English)
* Father's Name (Local)
* Date of Birth
* Place of Birth
* Sex
* Citizenship
* Nationality
* Document Number
* Authority
* Document Expiry Date
* Document Issue Date
* Document Issuing State
* Personal Number\*
* Address
* State

***

#### Enabling the feature

The feature is controlled by the **Enable document data editing** toggle inside the **ID verification step** of your configuration.

* **Via the No-code workflow builder:** Enable the toggle in the [ID verification step settings](/no-code-workflows/kyc-steps#id-verification). Once enabled, additional options become available:
  * **Who can edit** — applicant only, operator only, or both
  * **Which fields are editable** — per field, with editable and mandatory settings
* **Via API — step configuration:** The review behavior is configured inside the `identity-document` step using the `review` object. See [ID Verification step](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification) in the **Developer guide** for the full configuration reference.

***

#### End-user flow

When the review step is enabled, the applicant is shown a review page after document scanning where they can verify and correct the extracted data.

**When the review page is shown:** The review page is only presented if at least one field is editable and at least one of those fields is either empty or not sourced from MRZ, NFC, or QR. If all editable fields were populated from trusted sources, **the review step is skipped automatically.**

**Field visibility rules:**

* Editable fields are always shown, prefilled if data was extracted
* Non-editable fields that are filled are shown as read-only
* Non-editable empty fields are not shown

**Mandatory fields:** if a field is marked mandatory, the applicant must fill it before proceeding.

**Reset behavior:** review page data resets only if the applicant re-scans the document. Navigating back and forward without rescanning does not reset entered data.

***

#### Operator flow

If operator editing is enabled, operators can review and correct document data directly from the session in Manage.

**Edit mode:** Sessions open in read-only mode by default. The operator clicks **Edit details** to enter edit mode, makes corrections, then clicks **Save** to store changes. A **Cancel** button reverts any unsaved edits.

**Manual check:** Saving an edit automatically moves the session to **Manual check**, requiring a final decision from the operator. The **Edit** button is only available when the session is not in an **Approved** or **Rejected** state. If the session has already been decided, the operator must first move it back to Manual check before editing is possible.

***

#### Audit trail

Every field stores a full history of changes including the original OCR value, any user or operator edits, the final value, and timestamps with actor information for each change.

Each field in the session UI displays a **source tag** indicating where the current value came from — for example `OCR`, `MRZ`, `NFC`, `User`, or `Operator`. Hovering over the tag shows the full edit history for that field.

The complete activity log, including all data edits, can be retrieved via the[ `list-session-activities` endpoint.](/developer-tools/api-reference#list-session-activities-list-of-session-activities)


# Person data mapping

Collect and map identity fields to Person data through a User questionnaire step.

### **How it works**

Person data fields — such as name, date of birth, and personal number — are normally populated automatically via the ID document step through OCR, MRZ, NFC, or QR/Barcode extraction. Person data mapping allows clients to populate these same fields through a User questionnaire step instead, covering flows **where document scanning is not required** or **where the client already holds some of the applicant's data.**

When mapping is enabled on a User questionnaire step, individual questions can be linked to specific Person data fields. Answers submitted by the applicant populate those fields in the session's Person data section and become available for downstream identity verification checks.

This is a general-purpose feature and is not tied to any specific verification provider.

***

#### **Field sources and precedence**

Person data fields can originate from multiple sources within the same session. Each field displays a source tag so operators can identify where the value came from:

<table><thead><tr><th width="199.984375">Tag</th><th>Source</th></tr></thead><tbody><tr><td><strong>OCR /</strong> <strong>MRZ</strong> / <strong>NFC / QR</strong> </td><td>Extracted automatically from the document via OCR, MRZ, NFC, or QR</td></tr><tr><td><strong>User review</strong></td><td>Edited by the applicant during document data review after scanning</td></tr><tr><td><strong>User input</strong></td><td>Entered by the applicant in the User questionnaire</td></tr><tr><td><strong>Client provided</strong></td><td>Preset by the client via API or Configuration before the session started</td></tr><tr><td><strong>Operator</strong></td><td>Entered or corrected by the operator during review</td></tr></tbody></table>

When a session includes both an ID verification step and a mapped User questionnaire step, the following precedence applies:

* Document data takes precedence over questionnaire-mapped values for any overlapping field.
* Fields not populated by the document step are filled from the questionnaire-mapped values.
* Both values are stored and visible in session details.

Field change history is accessible via tooltip on each field and is preserved across all edits for audit purposes.

***

#### **Session routing**

Sessions with "Map to Person data" enabled are automatically routed to **Manual check** on completion, regardless of other step outcomes.&#x20;

***

#### **Enabling the feature**

**How to enable:** Turn on **Map to Person data** in the User questionnaire step settings in the Configuration builder.

When enabled, a Person data field selector appears beneath each compatible question. Not every question needs to be mapped — mapping is optional per question.

**Compatible question and field types:**

<table><thead><tr><th width="299.40625">Question type</th><th>Mappable Person Data fields</th></tr></thead><tbody><tr><td>Short answer (Free text or Number)</td><td>First Name, Last Name, Middle Name, Father's Name (Eng./Local), Place of Birth, Document Number, Personal Number, Authority, Address, State</td></tr><tr><td>Date</td><td>Date of Birth, Document Expires On, Document Issuing Date</td></tr><tr><td>Radio</td><td>Sex</td></tr><tr><td>Dropdown</td><td>Citizenship, Nationality, Document Issuing State</td></tr></tbody></table>

Checkbox, File Upload, and Attachment question types cannot be mapped to Person data fields.

A Person Data field can **only be mapped to one question** within the same configuration.


# Android SDK

Welcome to the Identomat Android SDK documentation! Here, you'll find everything you need to integrate our ID verification and KYC/AML solutions into your Android application seamlessly.

{% hint style="info" %}
Latest release: **Version 1.1.187**
{% endhint %}

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-type="content-ref"></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td>For a detailed guide, please refer to our <strong>GitLab</strong> documentation.</td><td></td><td></td><td></td><td><a href="https://gitlab.identomat.com/world/identomat-example-app-android">https://gitlab.identomat.com/world/identomat-example-app-android</a></td><td><a href="/files/xHuhaeW4cqdRsKdqrauG">/files/xHuhaeW4cqdRsKdqrauG</a></td></tr></tbody></table>

## Integration Document

The Identomat library offers a user identification flow composed of various steps, combining document types with user images or videos.

### The following steps are necessary to start a session using Identomat API

{% stepper %}
{% step %}
[Get a session token and configure session](#id-1.-get-a-session-token-and-configure-session)
{% endstep %}

{% step %}
[Get the instance of Identomat SDK](#id-2.-get-the-instance-of-identomat-sdk-and-pass-data)
{% endstep %}

{% step %}
[Pass Session Token and handle callback](#id-3.-pass-session-token-and-handle-callback)
{% endstep %}

{% step %}
[Start Identomat SDK](#id-4.-start-identomat-sdk)
{% endstep %}

{% step %}
[Pass additional variables](#id-5.-pass-additional-variables)
{% endstep %}
{% endstepper %}

## 1. Get a session token and configure session

To start a session, you first need to acquire a `session_token` by calling the `begin/` endpoint and configuring your verification flow.

> ⚠️ **Note:** This process is identical across Web and SDK integrations.

For full details on how to generate a session token, configure steps and flags, and start a session, please refer to the [**Web integration guide – Session Initialization**](/developer-tools/developer-guide#procedure).

Once you’ve obtained the session token, you can proceed with integrating it into your SDK flow.

## 2. Get the instance of Identomat SDK and pass data

The main class of the Identomat SDK is the `IdentomatManager` class.\
`IdentomatManager` is a singleton class in the Identomat SDK (using Kotlin's `Object` class).

To get the SDK instance, you can do the following:

* **For Java:**\
  You can get the instance by using:

```java
IdentomatManager identomatSdk = IdentomatManager.INSTANCE;
```

* **For Kotlin:**\
  You can use it as `IdentomatManager`, which refers to Kotlin's `Object` class.

## 3. Pass session token and handle callback

* **sessionToken** – Response from the API: `String` type.

To pass the session token, we use the `setUp` function, which can be called like this:

```java
IdentomatManager.INSTANCE.setUp(token: sessionToken);
```

The last step is to pass the callback function, which will be triggered after the user finishes interacting with the library. To do this, use the `.setCallback` function, which takes a function as an argument:

```java
IdentomatManager.INSTANCE.setCallback(() -> {
    // Go to result page;
});
```

## 4. Start Identomat SDK

The library will provide us with the `Intent` for the SDK's main activity, which we can start like this:

```java
startActivity(IdentomatManager.INSTANCE.getIdentomatActivity(MainActivity.this));
```

## 5. Pass additional variables

To customize Identomat library for the app, we have some additional functions:

1. `setColors(colors: Map)` - sets specific colors
2. `setStrings(dict : Map)` - sets specific text strings
3. `setVariables(variables : Map<String, Any?>)` - sets many customizable variables
4. `setLogo(() -> View?)` - sets loading animation, takes function type, which returns view, example usage:
5. `back_button_icon`- Changes the back button icon.
6. `primary_button_width` – Adjusts the width of the primary button.
7. `primary_button_height` – Adjusts the height of the primary button.
8. `liveness_smile_icon`– Changes the liveness smile icon. Example: *UIImage(named: "liveness\_smile\_icon")*

### Deprecated functions (Post version 1.0.21)

Following functions are deprecated after version 1.0.21:

5.0 `skipLivenessInstructions()` - skips liveness instructions

5.1 `setLivenessIcons(neutralFace: Int, smileFace: Int)` - sets liveness icons, send resource int like this: `R.drawable.ic_liveness_neutral_icon`

5.2 `setLivenessRetryIcon(retryIcon: Int?, size : Int)` - sets liveness retry panel's main icon, size sets size of icon

5.3 `setRetryIcon(retryIcon: Int?, size : Int)` - sets document scan view's retry panel's main icon, size sets size of icon

5.4 `setCameraDenyIcon(cameraDenyIcon: Int?, size : Int)` - sets document scan view's retry panel's main icon

5.5 `setButtonCornerRadius(radius : Int)` - sets every button corner radius

5.6 `setPanelElevation(elevation : Int)` - sets panels elevations

***

### 1. Customizing Colors

Use the `setColors` function to adjust the colors in the library to match the app's theme. Pass a dictionary containing the relevant color keys and their corresponding hex values:

```
"background",
"text_primary",
"text_secondary",
"text_placeholder",
"text_disabled",
"text_inverse",
"text_link",
"primary_color",
"neutral_color",
"danger_color",
"success_color",
"warning_color",
"black",
"white"
```

Example of dictionary&#x20;

* **for Java:**

```java
static HashMap colors = new HashMap(){{
    put("background", "#222222");
    put("text_primary", "#A4A4A4");
    put("text_secondary", "#676767");
    put("text_placeholder", "#7848FF");
    put("text_disabled", "#A4A4A4");
    put("text_inverse", "#676767");
    put("text_link", "#7848FF");
    put("primary_color", "#FFFFFF");
    put("neutral_color", "#222222");
    put("danger_color", "#FFFFFF");
    put("success_color", "#2D2D2D");
    put("warning_color", "#FFFFFF");
}};
```

* **for Kotlin:**

```kotlin
var colors : Map<String, String> = mapOf(
    "background" to "#222222",
    "text_primary" to "#FFFFFF",
    ...
    )
```

Way to pass colors to library: `IdentomatManager.setColors(colors: colors)`

### 2. Customizing strings

To customize the strings that the library displays at specific places, we have the function `setStrings(string: Map)`.

The `setStrings` function takes a `Map` where the keys correspond to the string identifiers used in the library, and the values are the strings you want to display for different languages. The structure looks like this:

**Example for Java:**

```java
static HashMap strings = new HashMap(){{
    put("en",  new HashMap<String, String>() {{
        put("identomat_agree", "Yes I agree");
        put("identomat_disagree", "Disagree");
    }});
    put("ru",  new HashMap<String, String>() {{
        put("identomat_agree", "Согласен");
        put("identomat_disagree", "Не согласен");
    }});
    put("es",  new HashMap<String, String>() {{
        put("identomat_agree", "Acepto");
        put("identomat_disagree", "No acepto");
    }});
    put("ka",  new HashMap<String, String>() {{
        put("identomat_agree", "ვეთანხმები");
        put("identomat_disagree", "არ ვეთანხმები");
    }});
}};
```

**for Kotlin:**

```kotlin
 var strings : Map<String, Map<String,String>> = mapOf(
            "en" to mapOf(
                    "identomat_agree" to "Yes I agree",
                    "identomat_disagree" to "Disagree",
            ),
            "ru" to mapOf(
                    "identomat_agree" to "Согласен",
                    "identomat_disagree" to "Не согласен",
            ),
            "es" to mapOf(
                    "identomat_agree" to "Acepto",
                    "identomat_disagree" to "No acepto",
            ),
            "ka" to mapOf(
                "identomat_agree" to "ვეთანხმები",
                "identomat_disagree" to "არ ვეთანხმები",
            )
    )
```

Every string has its own key in library and it can be changed. String keys list is at the end.

### 3. Customizing Variables

For every other customization, we use the `setVariables(variables: Map<String, Any?>)` function, where we pass a key-value pair map of variables.

The map structure looks like this:

```
var variables : MutableMap<String, Any?> = mutableMapOf(
   
    "liveness_neutral_icon" to R.drawable.ic_liveness_neutral_icon,     -- sets liveness neutral face icon.     type -> int
    "liveness_smile_icon" to R.drawable.ic_liveness_smile_icon,         -- sets liveness smile face icon.       type -> int

    "liveness_retry_icon" to R.drawable.image,                          -- sets liveness retry page icon.       type -> int
    "liveness_retry_text_icon_1" to R.drawable.image,                   -- sets liveness retry page instruction icon 1.       type -> int
    "liveness_retry_text_icon_2" to R.drawable.image,                   -- sets liveness retry page instruction icon 2.       type -> int
    "liveness_retry_text_icon_3" to R.drawable.image,                   -- sets liveness retry page instruction icon 3.       type -> int
    "liveness_retry_text_icon_4" to R.drawable.image,                   -- sets liveness retry page instruction icon 4.       type -> int

    "scan_retry_icon" to R.drawable.image,                              -- sets scan document retry page icon.  type -> int
    "camera_deny_icon" to R.drawable.image,                             -- sets camera deny page icon.          type -> int
    "upload_retry_icon" to R.drawable.image,                            -- sets upload retry page icon.         type -> int

    "liveness_retry_icon_size" to 200,                                  -- sets save icon sizes.                type -> int
    "scan_retry_icon_size" to 200,
    "camera_deny_icon_size" to 200,
    "upload_retry_icon_size" to 200,
    
    "location_instruction_icon_1" to R.drawable.image,  
    "location_instruction_icon_2" to R.drawable.image,  

    "geolocation_icon" to R.drawable.image,  
    "geolocation_success_icon" to R.drawable.image,  
    "geolocation_deny_icon" to R.drawable.image,  

    "liveness_retry_count" to 3,                        -- new liveness video upload retry count

    "skip_liveness_instructions" to false,              -- skips liveness instructions                          type -> boolean
    "liveness_type" to 1,                               -- chooses liveness icons display type values 1 or 2    type -> int
    "button_corner_radius" to null,                     -- sets button corner radious, if it's null button will be round cornered              
    "panel_elevation" to 1,                             -- sets panels elevation,                               type -> int

    "liveness_info_main_icon" or "liveness_info_main_anim",      -- instruction page  
    "liveness_frame_face_icon" or "liveness_frame_face_anim",    -- frame page
    "instruction_smile_icon" or "instruction_smile_anim"         -- Liveness processing page 
    
    //Sets  font sizes
    "title_medium_size" to 16,
    "title_small_size" to 14,
    "headline_medium_size" to 28,
    "headline_small_size" to 24,
    "body_medium_size" to 16,
    "body_small_size" to 14
 
    //Sets font
    "title_font" to "font-name",
    "headline_font" to "font-name",
    "body_font" to "font-name"
    
    "default_country_code" to "GE"                      -- sets default country for country code picker
)
```

String keys:

```xml
<resources>

  //ID verification
  <string name="identomat_select_document">Select document</string>
 
  <string name="identomat_card">ID card</string>
  <string name="identomat_card_front_instructions">Scan FRONT SIDE of ID CARD</string>
  <string name="identomat_card_front_upload">Upload FRONT SIDE of ID CARD</string>
  <string name="identomat_card_rear_instructions">Scan BACK SIDE of ID CARD</string>
  <string name="identomat_card_rear_upload">Upload BACK SIDE of ID CARD</string>
 
  <string name="identomat_driver_license">Driver license</string>
  <string name="identomat_driver_license_front_instructions">Scan FRONT SIDE of DRIVER LICENSE</string>
  <string name="identomat_driver_license_front_upload">Upload FRONT SIDE of DRIVER LICENSE</string>
  <string name="identomat_driver_license_rear_instructions">Scan BACK SIDE of DRIVER LICENSE</string>
  <string name="identomat_driver_license_rear_upload">Upload BACK SIDE of DRIVER LICENSE</string>
   
  <string name="identomat_passport">Passport</string>
  <string name="identomat_passport_instructions">Passport photo page</string>
  <string name="identomat_passport_upload">Upload passport photo page</string>
   
  <string name="identomat_residence_permit">Residence permit</string>
  <string name="identomat_residence_permit_front_instructions">Scan FRONT SIDE of RESIDENCE PERMIT</string>
  <string name="identomat_residence_permit_front_upload">Upload FRONT SIDE of RESIDENCE PERMIT</string>
  <string name="identomat_residence_permit_rear_instructions">Scan BACK SIDE of RESIDENCE PERMIT</string>
  <string name="identomat_residence_permit_rear_upload">Upload BACK SIDE of RESIDENCE PERMIT</string>
   
  <string name="identomat_capture_method_title">Choose a method</string>
  <string name="identomat_take_photo">Take a photo</string>
  <string name="identomat_upload_file">Upload a file</string>
  <string name="identomat_upload_another_file">Upload another file</string>
   
  <string name="identomat_upload_instructions_1">Upload a color image of the entire document</string>
  <string name="identomat_upload_instructions_2">JPG or PNG format only</string>
  <string name="identomat_upload_instructions_3">Screenshots are not allowed</string>
  <string name="identomat_choose_file">Choose a file</string>
   
  <string name="identomat_verifying">Verifying...</string>
  <string name="identomat_uploading">Uploading...</string>
   
  <string name="identomat_scan_retry_title">Capture failed</string>
  <string name="identomat_scan_retry_instruction">Please try again in better lighting</string>
  <string name="identomat_scan_retry_again">Try again</string>
  <string name="identomat_upload_success">Successfully uploaded!</string>
   
  <string name="identomat_no_document_in_image">Frame your document</string>
  <string name="identomat_document_align">Frame your document</string>
  <string name="identomat_document_blurry">Document is blurry</string>
  <string name="identomat_document_face_blurry">Face on document is blurry</string>
  <string name="identomat_document_face_require_brighter">Low light</string>
  <string name="identomat_document_face_too_bright">Avoid direct light</string>
  <string name="identomat_document_move_away">Please move document away</string>
  <string name="identomat_document_move_closer">Please move document closer</string>
  <string name="identomat_document_move_down">Please move document down</string>
  <string name="identomat_document_move_left">Please move document to the left</string>
  <string name="identomat_document_move_right">Please move document to the right</string>
  <string name="identomat_document_move_up">Please move document up</string>
  <string name="identomat_document_covered">Document is covered</string>
  <string name="identomat_document_grayscale">Document is grayscale</string>
  <string name="identomat_document_type_mismatch">Wrong document</string>
  <string name="identomat_document_not_readable">Document not readable</string>
  <string name="identomat_document_face_align">Document face align</string>
  <string name="identomat_document_spoofing_detected2">Document spoofing detected</string>
  <string name="identomat_document_page_mismatch">Wrong page</string>
  <string name="identomat_document_nfc_chip_damaged">Document NFC chip damaged</string>
   
   
  //Passive liveness
  <string name="identomat_face_instructions">Place your FACE within OVAL</string>
  <string name="identomat_processing">Processing, please wait</string>
   
   
  // Active liveness
  <string name="identomat_record_begin_section_1">Take a neutral expression</string>
  <string name="identomat_record_begin_section_2">Smile on this sign</string>
  <string name="identomat_record_begin_section_3">Take a neutral expression again</string>
  <string name="identomat_record_begin_title">Get ready for your video selfie</string>
  <string name="identomat_record_instructions">Place your FACE within OVAL and follow the on-screen instructions</string>
  <string name="identomat_im_ready">I\'m ready</string>
  <string name="identomat_neutral_expression">Neutral face</string>
  <string name="identomat_smile">Smile</string>
   
   
  // Adaptive liveness
 <string name="identomat_passive_record_begin_title">Get ready for your video selfie</string>
 <string name="identomat_passive_record_begin_subtitle">Follow the on-screen instructions when prompted.</string>
 <string name="identomat_passive_record_begin_subtitle_smile">When prompted, repeat the facial expression shown on the icons.</string>
 <string name="identomat_passive_record_begin_section_title">Tips</string>
 <string name="identomat_passive_record_begin_section_1">Frame your face</string>
 <string name="identomat_passive_record_begin_section_2">Hold still until success notify</string>
 <string name="identomat_smile">Smile</string>
 <string name="identomat_im_ready">I\'m ready</string>
   
   
  //Cascading liveness
  <string name="identomat_cascading_instructions">When prompted, repeat the facial expression shown on the icons: \n\n<b>• Keep neutral face \n• Smile</b></string>
  <string name="identomat_cascading_instructions_title">When prompted, repeat the facial expression shown on the icons:</string>
  <string name="identomat_cascading_instructions_1">• Keep neutral face</string>
  <string name="identomat_cascading_instructions_2">• Smile</string>
  <string name="identomat_cascading_button">Start Liveness Check</string>
  <string name="identomat_cascading_neutral_face">Keep neutral face</string>
  <string name="identomat_cascading_start">Position your face!</string>
  <string name="identomat_cascading_smile">Smile!</string>
  <string name="identomat_cascading_fail">Liveness Failed</string>
  <string name="identomat_cascading_success">That\'s it!</string>
   
  <string name="identomat_liveness_retry_title">We can\'t detect your face</string>
  <string name="identomat_liveness_retry_instruction">But first, please take a look at the instructions</string>
  <string name="identomat_liveness_retry_again">Try again</string>
  <string name="identomat_liveness_retry_instruction_1">Make sure to be in a place with good lighting</string>
  <string name="identomat_liveness_retry_instruction_2">Make sure your eyes are clearly visible</string>
  <string name="identomat_liveness_retry_instruction_3">Make sure to remove masks or other items that cover your face. Eyeglasses are okay</string>
  <string name="identomat_liveness_retry_instruction_4">Make sure to only show your face, we don’t need to see your ID</string>
   
  <string name="identomat_lets_try">Let\'s try</string>
   
  <string name="identomat_low_neutral_frequency">Untimely smile detected</string>
  <string name="identomat_not_smile">Smile not detected</string>
  <string name="identomat_eyes_closed">Eyes are closed</string>
  <string name="identomat_face_hold">Hold still</string>
  <string name="identomat_no_face">Face is missing</string>
  <string name="identomat_face_covered">Face is covered</string>
  <string name="identomat_face_align">Frame your face</string>
  <string name="identomat_face_away_from_center">Center your Face</string>
  <string name="identomat_face_blurry">Face is blurry</string>
  <string name="identomat_face_far_away">Move closer</string>
  <string name="identomat_face_require_brighter">Low light</string>
  <string name="identomat_face_too_bright">Avoid direct light</string>
  <string name="identomat_face_too_close">Move away</string>
  <string name="identomat_smile_detected">Get neutral face</string>
  <string name="identomat_multiple_face">Keep only your face visible</string>
   
   
  //Camera permission
  <string name="identomat_camera_deny_title">Camera access denied</string>
  <string name="identomat_camera_deny_settings">Allow access</string>
  <string name="identomat_camera_deny_cancel">Cancel process</string>
   
   
  //Phone number collect&verify
  <string name="identomat_resend_code">Resend Code</string>
  <string name="identomat_get_code">Get Code</string>
  <string name="identomat_sms_title">Verify Phone Number</string>
  <string name="identomat_sms_subtitle">Enter your correct phone number\nto get verification code</string>
  <string name="identomat_resend_in">Resend code in </string>
  <string name="identomat_invalid_number">Please enter valid number</string>
  <string name="identomat_invalid_code">The code is not valid</string>
  <string name="identomat_sms_code_sent">Enter the 4-digit verification code sent to </string>
  <string name="identomat_enter_sms_code">Enter SMS code</string>
  <string name="identomat_phone_number_hint">Phone number</string>
  <string name="identomat_enter_phone_number">Enter phone number</string>
  <string name="identomat_enter_correct_number">Enter your correct phone number</string>
  <string name="identomat_confirm">Confirm</string>
  <string name="identomat_search">Search</string>
  <string name="identomat_verify_enter_code_hint">Enter code</string>
   
   
  // Email collect & verify
  <string name="identomat_enter_email_address">Enter email address</string>
  <string name="identomat_enter_correct_email">Enter your correct email address</string>
  <string name="identomat_enter_valid_email">Please enter valid email</string>
  <string name="identomat_email_hint">Email address</string>
  <string name="identomat_confirm">Confirm</string>
  <string name="identomat_email_check_title">Verify Email</string>
  <string name="identomat_email_check_subtitle">Enter your correct email address\nto get verification code</string>
  <string name="identomat_get_code">Get Code</string>
  <string name="identomat_resend_in">Resend code in </string>
  <string name="identomat_resend_code">Resend Code</string>
  <string name="identomat_verify_email_code_title">Enter code</string>
  <string name="identomat_verify_email_code_subtitle">Enter the 6-digit verification code sent to </string>
  <string name="identomat_verify_email_invalid_code">The code is not valid</string>
  <string name="identomat_verify_enter_code_hint">Enter code</string>
   
   
  //Page titles
  <string name="identomat_require_email_header"> </string>
  <string name="identomat_require_phone_number_header"> </string>
  <string name="identomat_require_phone_number_check_header"> </string>
  <string name="identomat_enter_sms_code_header"> </string>
  <string name="identomat_select_documents_header"> </string>
  <string name="identomat_capture_methods_header"> </string>
  <string name="identomat_upload_header"> </string>
  <string name="identomat_new_liveness_header"> </string>
  <string name="identomat_camera_access_header"> </string>
  <string name="identomat_select_country">Select country</string>
  <string name="identomat_retry_header"> </string>
   
   
  //Geolocation
  <string name="identomat_send_location_button">Send Location</string>
  <string name="identomat_geolocation_title">Allow location access</string>
  <string name="identomat_geolocation_subtitle">To continue the verification, we need access to your device\'s location.</string>
  <string name="identomat_geolocation_success">Your profile has been verified.</string>
   
  <string name="identomat_geolocation_deny_title">Location access denied</string>
  <string name="identomat_geolocation_deny_subtitle">We can’t identify you without your location</string>
  <string name="identomat_geolocation_deny_instruction_1">You can recover location access through your device settings</string>
  <string name="identomat_geolocation_deny_instruction_2">Go to app settings and enable location access for this app</string>
  <string name="identomat_geolocation_enable_button">Enable in settings</string>
  <string name="identomat_geolocation_cancel_button">Cancel process</string>
   
   
  //Proof of Address
  <string name="identomat_bank_statement">Bank Statement</string>
  <string name="identomat_utility_bill">Utility bill</string>
  <string name="identomat_vehicle_registration_certificate">Vehicle registration certificate</string>
  <string name="identomat_yellow_slip">Yellow slip</string>
  <string name="identomat_drivers_license">Driver\'s license</string>
   
  <string name="identomat_upload_bank_statement">Upload Bank Statement</string>
  <string name="identomat_upload_utility_bill">Upload Utility bill</string>
  <string name="identomat_upload_vehicle_registration_certificate">Upload Vehicle registration certificate</string>
  <string name="identomat_upload_yellow_slip">Upload Yellow slip</string>
  <string name="identomat_upload_drivers_license">Upload Driver\'s license</string>
  <string name="identomat_upload_document_subtitle">Make sure that all the information on the photo is visible and easy to read</string>
   
  <string name="identomat_select_document_title">Select Document</string>
  <string name="identomat_proof_of_address_title">Proof of Address</string>
  <string name="identomat_proof_of_address_subtitle">Please upload a document that confirms your residential address.</string>
  <string name="identomat_uploaded">Uploaded</string>
  <string name="identomat_document_errors">Document Errors</string>
   
  <string name="identomat_expired_date_was_not_found">Expiry date was not found in the document</string>
  <string name="identomat_issued_date_was_not_found">Issue date was not found in the document</string>
  <string name="identomat_full_name_does_not_match">Full name does not match</string>
  <string name="identomat_full_name_was_not_found">Full name was not found in the document</string>
  <string name="identomat_issuing_authority_name_was_not_found">Issuing authority name was not found in the document</string>
  <string name="identomat_street_address_was_not_found">Street address was not found in the document</string>
  <string name="identomat_document_expired">Document is expired</string>
  <string name="identomat_address_not_valid">Address not valid</string>
  <string name="identomat_document_date_is_in_the_future">Document date is in the future</string>
  <string name="identomat_document_not_matched">Document not matched</string>
  <string name="identomat_oversized_file">Oversized File: Maximum file size is 5MB</string>
  <string name="identomat_unsupported_file_type">File Format Mismatch</string>
  <string name="identomat_too_many_pages">Too many Pages: Maximum pages is 20</string>
   
  <string name="identomat_continue">Continue</string>
  <string name="identomat_no_connection">No internet connection</string>
  
  
  <string name="identomat_nfc_next">Next</string>
  <string name="identomat_nfc_start_scanning">Start Scanning</string>
  <string name="identomat_nfc_check_id">Check for the NFC chip in your ID</string>
  <string name="identomat_nfc_check_passport">Check for the NFC chip in your Passport</string>
  <string name="identomat_nfc_subtitle_id">Make sure the ID card has appropriate symbols on it</string>
  <string name="identomat_nfc_subtitle_id_1">Flip the ID card and scan the back side</string>
  <string name="identomat_nfc_subtitle_passport">Make sure the passport has appropriate symbols on it</string>
  <string name="identomat_nfc_subtitle_passport_1">Open the passport to the photo page and scan it</string>
  <string name="identomat_nfc_scan_the_document">Scan the document</string>
  <string name="identomat_nfc_read_id_error_1">Remove your document and phone covers</string>
  <string name="identomat_nfc_read_id_error_2">Ensure that your document has NFC capability</string>
  <string name="identomat_nfc_read_id_error_3">Keep your document and phone still until the progress bar is filled</string>
  <string name="identomat_nfc_read_error_key_missmatch">Please scan the document again or choose another method</string>
  <string name="identomat_nfc_read_error_button_1">Retry reading</string>
  <string name="identomat_nfc_read_error_button_2">Try another method</string>
  <string name="identomat_nfc_read_id_title">Read the NFC chip on your ID</string>
  <string name="identomat_nfc_read_desc">Follow instructions below</string>
  <string name="identomat_nfc_read_warning">Do not separate the document and the phone during the reading process</string>
  <string name="identomat_nfc_read_warning_1">Keep your phone and document still</string>
  <string name="identomat_nfc_reading">Reading...</string>
  <string name="identomat_nfc_dialog_title">NFC not enabled</string>
  <string name="identomat_nfc_dialog_message">To enable it, please navigate to the NFC settings and toggle the switch to on.</string>
  <string name="identomat_nfc_dialog_settings">Settings</string>
  <string name="identomat_nfc_dialog_cancel">Cancel</string>
  
  <string name="identomat_nfc_scan_passport_title">Passport photo page</string>
  <string name="identomat_nfc_error_title">We couldn\'t read NFC on your document</string>
  <string name="identomat_nfc_ready_to_read">Ready to read</string>
  <string name="identomat_nfc_id_place_phone">Place your phone on your ID</string>
  <string name="identomat_nfc_passport_place_phone">Place your phone on your passport</string>
  <string name="identomat_nfc_read_passport_title">Read the NFC chip on your Passport</string>
  <string name="identomat_nfc_read_id_inst_1">Place your ID card at the back of your phone</string>
  <string name="identomat_nfc_read_passport_inst_1">Place your passport at the back of your phone</string>
  <string name="identomat_nfc_read_inst_2">Slowly slide your document up and down</string>
  <string name="identomat_nfc_read_inst_3">Once the reading starts, hold your document and phone still</string>
  <string name="identomat_nfc_button_start_reading">Start reading</string>
  <string name="identomat_nfc_scan">NFC Scan</string>
  
  <string name="identomat_nfc_header"> </string>
  <string name="identomat_nfc_reading_complete">Reading Complete</string>
  
  //Social Security Number verification
  <string name="identomat_ssn_consent_header">SSN verification</string>
  <string name="identomat_ssn_consent_title">Authorization for the Social Security Administration to disclose your social security number verification</string>
  <string name="identomat_ssn_consent_document">I authorize the Social Security Administration (SSA) to verify and disclose to the requesting party whether the name, Social Security Number (SSN), and date of birth I have submitted matches information in SSA records.</string>
  <string name="identomat_ssn_consent_agree">Agree</string>
  <string name="identomat_ssn_verification_header"> </string>
  <string name="identomat_ssn_title">Confirm your identity</string>
  <string name="identomat_ssn_subtitle">Enter your details exactly as they appear on your government-issued ID.</string>
  <string name="identomat_ssn_first_name_hint">First Name</string>
  <string name="identomat_ssn_last_name_hint">Last Name</string>
  <string name="identomat_ssn_dob_hint">Choose date</string>
  <string name="identomat_ssn_hint">000-00-0000</string>
  <string name="identomat_ssn_confirm_hint">000-00-0000</string>
  <string name="identomat_ssn_mismatch_error">The numbers you entered don\'t match. Please try again.</string>
  <string name="identomat_ssn_api_error">An error occurred. Please try again.</string>
  <string name="identomat_ssn_verify">Verify</string>
  <string name="identomat_ssn_consent_declined_title">Verification Declined</string>
  <string name="identomat_ssn_consent_declined_description">SSN consent was declined. This verification session has ended.</string>
  <string name="identomat_ssn_mismatch_title">Verification Failed</string>
  <string name="identomat_ssn_mismatch_description">Your information did not match SSA records. This session has ended.</string>
  <string name="identomat_ssn_deceased_title">Verification Failed</string>
  <string name="identomat_ssn_deceased_description">We Couldn\'t validate your SSN</string>

  <string name="identomat_ssn_confirm_identity_title">Confirm your identity</string>
  <string name="identomat_ssn_confirm_identity_subtitle">Enter your details exactly as they appear on your government-issued ID.</string>
  <string name="identomat_ssn_first_name_label">First name</string>
  <string name="identomat_ssn_middle_name_label">First name (optional)</string>
  <string name="identomat_ssn_middle_name_hint">Middle name</string>
  <string name="identomat_ssn_last_name_label">Last name</string>
  <string name="identomat_ssn_dob_label">Date of birth</string>
  <string name="identomat_ssn_choose_date">Choose date</string>
  <string name="identomat_ssn_section_title">Enter your Social Security Number</string>
  <string name="identomat_ssn_section_subtitle">Provide your 9-digit SSN for identity verification. Your number is used solely to confirm your identity and is not stored on our servers.</string>
  <string name="identomat_ssn_number_label">Social Security Number</string>
  <string name="identomat_ssn_confirm_number_label">Confirm Social Security Number</string>
  <string name="identomat_ssn_mismatch_detail_error">The numbers you entered don\'t match. Please try again.</string>
  <string name="identomat_ssn_encrypted_title">Your data is encrypted</string>
  <string name="identomat_ssn_encrypted_message">Your information is encrypted in transit using 256-bit SSL and sent directly to the SSA. We do not store your full SSN.</string>
  <string name="identomat_ssn_consent_disclosure_title">One-time disclosure consent</string>
  <string name="identomat_ssn_consent_disclosure_body">This consent is for a one-time disclosure and is valid for 90 days from the date of signature.</string>
  <string name="identomat_ssn_success_title">Verification successful</string>
  <string name="identomat_ssn_success_description">Your SSN has been validated</string>
  
</resources>
```

### 4. Setting a custom logo

`setLogo(() -> View?)` This function is used for setting a custom logo in the library. You can pass your own custom view, and display anything on that view (animations, images, etc.). This logo will be displayed when the library is processing something.

***


# Android SDK changelog

Keep track of changes and upgrades to the Identomat Android SDK.

{% hint style="info" %}
**Breaking changes are marked in bold.**
{% endhint %}

### Version 1.1.187

*Released on Jul 17, 2026*

* **Added: Social Security Number verification step**\
  This step allows users to securely submit and verify their Social Security Number as part of the identity verification flow, helping validate their identity and meet compliance requirements.

### Version 1.1.186

*Released on Jul 03, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.185

*Released on Jun 24, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.184

*Released on Jun 11, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.183

*Released on May 08, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.182

*Released on May 01, 2026*

* **Added: Document data review page.** \
  Users can now review and edit extracted document data before submission. For implementation details, please refer to our [Developer guide](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification).

### Version 1.1.181

*Released on Apr 16, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.180

*Released on Apr 15, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.179

*Released on Mar 25, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.178

*Released on Mar 17, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.177

*Released on Mar 11, 2026*

* **Added: Ability to include a Email verification step.**

### Version 1.1.176

*Released on Feb 25, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.175

*Released on Feb 13, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.174

*Released on Feb 12, 2026*

* **Added:** Ability to override specific element colors for enhanced UI customization:
  * `input_active_border_color` – Active state border color for input fields.
  * `input_default_border_color` – Default border color for input fields.
  * `button_secondary_outline_color` – Outline color for secondary buttons.
  * `button_secondary_text_color` – Text color for secondary buttons.

### Version 1.1.173

*Released on Feb 09, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.172

*Released on Feb 02, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.171

*Released on Jan 29, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.170

*Released on Jan 28, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.169

*Released on Jan 14, 2026*

* **Added**: **NFC reader support**.&#x20;

To enable NFC in the [ID document step](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification), the `allow_nfc_capture: true` flag must be provided.&#x20;

### Version 1.1.168

*Released on Jan 12, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.167

*Released on Dec 30, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.166

*Released on Dec 22, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.165

*Released on Dec 19, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.164

*Released on Dec 15, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.163

*Released on Dec 08, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.162

*Released on Nov 27, 2025*

* **Improved**: Existing security checks now detect altered system integrity more accurately.

### Version 1.1.160

*Released on Oct 13, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.159

*Released on Oct 07, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.158

*Released on Sep 29, 2025*

* **Added: Ability to include a Proof of Address (POA) step.**

### Version 1.1.157

*Released on Sep 17, 2025*

* **Added: Ability to include a Geolocation step.**

### Version 1.1.156

*Released on Sep 16, 2025*

* **Added**: Ability to customize icons on the adaptive liveness instruction page.

### Version 1.1.155

*Released on Sep 09, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.154

*Released on Sep 01, 2025*

* **Added**: Support for 16 KB page size, resulting in various performance improvements.
* **Fixed**: Liveness issue caused by camera resolution settings.

### Version 1.1.153

*Released on Aug 22, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.151

*Released on Aug 18, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.150

*Released on Aug 05, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.147

*Released on July 29, 2025*

* **Fixed:** Various bugs related to the user questionnaire step.

### Version 1.1.146

*Released on July 23, 2025*

* **Added: Ability to include a user questionnaire step.**

For implementation details, please refer to our [Developer guide](/developer-tools/developer-guide#user-questionnaire).

### Version 1.1.145

*Released on July 11, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.144

*Released on July 03, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.143

*Released on July 02, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.142

*Released on June 26, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.139

*Released on June 04, 2025*

* **Updated:** Security by preventing access from devices with altered system integrity.

### Version 1.1.138

*Released on May 23, 2025*

* **Fixed:** Various bugs and performance improvements.
* **Updated:** Kotlin version to 2.1.21.

### Version 1.1.136

*Released on March 29, 2025*

* **Added**: Ability to capture full HD photos.
* **Changed**: Parameters for fonts, font sizes, and colors.
  * **Set font**&#x20;
    * `head1_font` changed to `headline_font`
    * `head2_font` was <mark style="color:red;">removed</mark>.
  * **Set font size**
    * `title_font_size` changed to `title_medium_size`
    * `head1_font_size` changed to `headline_medium_size`
    * `body_font_size` changed to `body_medium_size`
    * `title_small_size` was <mark style="color:green;">added</mark>.&#x20;
    * `headline_small_size` was <mark style="color:green;">added</mark>.&#x20;
    * `body_small_size` was <mark style="color:green;">added</mark>.&#x20;
  * **Set font colors**
    * `text_color_header` changed to `text_primary`
    * `text_color_title` was <mark style="color:red;">removed</mark>.
    * `text_color` was <mark style="color:red;">removed</mark>.
    * `text_secondary` was <mark style="color:green;">added</mark>.&#x20;
    * `text_placeholder` was <mark style="color:green;">added</mark>.&#x20;
    * `text_disabled` was <mark style="color:green;">added</mark>.&#x20;
    * `text_inverse` was <mark style="color:green;">added</mark>.&#x20;
    * `text_link` was <mark style="color:green;">added</mark>.&#x20;

### Version 1.1.134

*Released on March 26, 2025*

* **Fixed**: Icon on the retry page wasn't updating according to the primary color.

### Version 1.1.133

*Released on March 20, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.132

*Released on March 18, 2025*

* **Fixed:** Phone number and email verification fields were incorrectly cleared when clicking back button.

### Version 1.1.129

*Released on March 12, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.127 (Beta release)

*Released on March 04, 2025*

* **Added:** Automatic mobile brightness adjustment during liveness detection for a better user experience.

### Version 1.1.126 (Beta release)

*Released on February 25, 2025*

* **Added**: New liveness detection feature for enhanced identity verification.

### Version 1.1.125

*Released on February 17, 2025*

* **Added**: New variables for UI customization:
  * `back_button_icon` – Changes the back button icon.
  * `primary_button_width` – Adjusts the width of the primary button.
  * `primary_button_height` – Adjusts the height of the primary button.
  * `liveness_smile_icon`– Changes the liveness smile icon. Example: *UIImage(named: "liveness\_smile\_icon")*

### Version 1.1.123

*Released on February 12, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.123

*Released on February 7, 2025*

* **Added**: Country code selection for phone number collection and verification steps.
* **Added**: Ability to customize the back button icon.

### Version 1.1.122

* **Fixed**: Input and text alignment issues on phone number collection, phone number verification, email collection, and email verification steps.

### Version 1.1.120

* **Added**: **New liveness detection feature for enhanced identity verification.**&#x20;

### Version 1.1.119

* **Fixed**: Crash issue on Android 7 during verification process.

### Version 1.1.118

* **Internal** changes only

### Version 1.1.117

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.116

* **Fixed**: "Eyes closed" error was displayed incorrectly.

### Version 1.1.115

* **Changed**: Flag name for phone number verification.&#x20;
  * `require_sms_verification` changed to `require_phone_number_check`

### Version 1.1.114

* **Updated**: Material library version upgraded.&#x20;

### Version 1.1.113

* **Updated**: Material library version upgraded.

### Version 1.1.112

* **Fixed**: Text alignment adjusted on the retry page, now centered towards emojis.

### Version 1.1.111

* **Changed**: UI of the liveness retry page updated for improved user experience.

### Version 1.1.110

* **Fixed**: Various bugs in document capture functionality.

### Version 1.1.109

* **Added**: Vehicle registration certificate reader in the Proof of Address step.

### Version 1.1.104

* **Improved**: Reduced passive liveness capturing time for faster verification.

### Version 1.1.103

* **Fixed**: Session lifetime issue in SDK sessions, ensuring proper session expiration.

### Version 1.1.102

* **Fixed**: Blurring issue on Samsung Galaxy S24 and Samsung Galaxy S24 Ultra cameras.

### Version 1.1.101

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version 1.1.100

* **Added**: Ability to change the country code on phone number collection and verification steps.

### Version 1.1.99

* **Changed**: Liveness icon and uploading text color are now separately customizable.

### Version 1.1.98

* **Added**: Ability to translate texts on phone number collection and verification steps.

### Version 1.1.97

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version 1.1.96

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version 1.1.95

* **Fixed**: Bugs related to the cascading functionality retry update.

### Version 1.1.94

* **Added**: Design customization options for phone number collection and verification steps.

### Version 1.1.93

* **Added**: Retry functionality to the cascading process.

### Version 1.1.92

* **Changed:** Passive liveness and cascading functionality combined for improved performance.

### Version 1.1.91

* **Fixed**: Application crash issue during video calls.

### Version 1.1.90

* **Added**: Ability to show or hide camera and mic buttons for the user.

### Version 1.1.89

* **Added**: Camera permission logs for better troubleshooting and debugging.
  * `camera-access-request`
  * `camera-access-acquire`
  * `camera-access-reject`


# iOS SDK

Welcome to the Identomat iOS SDK documentation! Here, you'll find everything you need to integrate our ID verification and KYC/AML solutions into your iOS application seamlessly.

{% hint style="info" %}
Latest release: **Version 1.1.171**
{% endhint %}

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td></td><td>For a detailed guide, please refer to our <strong>GitLab</strong> documentation.</td><td></td><td><a href="/files/xHuhaeW4cqdRsKdqrauG">/files/xHuhaeW4cqdRsKdqrauG</a></td><td><a href="https://gitlab.identomat.com/world/identomat-ios-framework-spm">https://gitlab.identomat.com/world/identomat-ios-framework-spm</a></td></tr></tbody></table>

## Integration Document

The Identomat library provides a user identification flow consisting of various steps that combine document type and user image/video for verification.

### Following steps are necessary to start a session using Identomat API

{% stepper %}
{% step %}
[Get a session token and configure session](#id-1.-get-a-session-token-and-configure-session)
{% endstep %}

{% step %}
[Get the instance of Identomat SDK](#id-3.-get-the-instance-of-identomat-sdk-and-pass-data)
{% endstep %}

{% step %}
[Pass Session Token and handle callback](#id-4.-pass-session-token-and-handle-callback)
{% endstep %}

{% step %}
[Start Identomat SDK](#id-5.-start-identomat-sdk)
{% endstep %}

{% step %}
[Pass additional variables](#id-6.-pass-additional-variables)
{% endstep %}
{% endstepper %}

## 1. Get a session token and configure session

To start a session, you first need to acquire a `session_token` by calling the `begin/` endpoint and configuring your verification flow.

> ⚠️ **Note:** This process is identical across Web and SDK integrations.

For full details on how to generate a session token, configure steps and flags, and start a session, please refer to the [**Web integration guide – Session Initialization**](/developer-tools/developer-guide#procedure).

Once you’ve obtained the session token, you can proceed with integrating it into your SDK flow.

## 2. Get the instance of Identomat SDK and pass data

The main class of the Identomat SDK is the `IdentomatManager` class.\
`IdentomatManager` is a singleton class in the Identomat SDK.

To obtain the SDK variable, you can use the following code:

```swift
let indetomatSdk = IdentomatManager.getInstance();
```

Alternatively, you can call `IdentomatManager.getInstance()` each time, and it will return the same Identomat SDK instance.

## 3. Pass session token and handle callback <a href="#id-4.-pass-session-token-and-handle-callback" id="id-4.-pass-session-token-and-handle-callback"></a>

* **sessionToken** – Response from the API: `String` type.

To pass the session token, we use the `setUp` function, which can be called like this:

```swift
IdentomatManager.getInstance().setUp(token: sessionToken)
```

The last step is to pass the callback function, which will be triggered after the user finishes interacting with the library. To do this, use the `.callback` function, which takes a function as an argument:

```swift
IdentomatManager.getInstance().callBack(callback: anyfunc)
//anyfunc is (()->Void)? type
//or
IdentomatManager.getInstance().callBack {
   print("finished")
}

IdentomatManager.getInstance().backButtonCallBack(callback: anyfunc)
/anyfunc is (()->Void)? type
//or
IdentomatManager.getInstance().backButtonCallBack {
   print("finished with back button")
}
```

## 4. Start Identomat SDK

First, you should obtain the library's starter view, and then present it to the user.

{% code overflow="wrap" %}

```swift
let identomatView = IdentomatManager.getInstance().getIdentomatView()
identomatView.modalPresentationStyle = .fullScreen
self.present(identomatView, animated: true, completion: nil)  //self is UIViewController type class
```

{% endcode %}

## 5. Pass additional variables

To customize Identomat library for the app, we have some additional functions:

1. `setColors(colors: [String : String])` - sets specific colors 2.1 `setStringsTableName(tableNme : String)` - sets string by the languages file 2.2 `setStrings(dict : [String : Any?])` - sets specific text strings
2. `setVariables(variables : [String : Any?])` - sets many customizable varaible
3. `setLogo(view: UIView)` - sets loading indicator

Following functions in 5 are DEPRECATED after 0.0.73 version&#x20;

5.1  `setTitleFont(fontname: String, size : Int)` - sets header font in library

5.2 `setHeadlineFont(fontname: String, size : Int)` - sets header font in library

5.3 `setBodyFont(fontname: String, size : Int )` - sets body text font in library

5.4 `skipLivenessInstructions()` - skips liveness instructions

5.5 `setLivenessIcons(neutralFace: UIImage?, smileFace: UIImage?)` - sets liveness icons

5.6 `setLivenessRetryIcon(retryIcon: Int?, size : Int)` - sets liveness retry panel's main icon, size sets size of icon

5.7 `setRetryIcon(retryIcon: Int?, size : Int)` - sets document scan view's retry panel's main icon, size sets size of icon

5.8 `setCameraDenyIcon(cameraDenyIcon: Int?, size : Int)` - sets document scan view's retry panel's main icon&#x20;

5.9 `hideStatusBar(_ bool : Bool), setStatusBarStyle(style : UIStatusBarStyle)` - customize status bar

***

### 1. Customizing colors

Use the `setColors` function to adjust the colors in the library to match the app's theme. Pass a dictionary containing the relevant color keys and their corresponding hex values:

```
"background",
"text_primary",
"text_secondary",
"text_placeholder",
"text_disabled",
"text_inverse",
"text_link",
"primary_color",
"neutral_color",
"danger_color",
"success_color",
"warning_color",
"black",
"white"
```

Way to pass colors to library:&#x20;

```swift
IdentomatManager.getInstance().setColors(colors: colors)
```

### 2. Customizing strings <a href="#user-content-2" id="user-content-2"></a>

To customize the strings displayed by the library at specific places, you can use two functions:

1. `setStrings(dict: [String: Any?])`
2. `setStringsTableName(tableNme : String)`

These are two different methods to customize strings.

The `setStrings` function takes a dictionary with specific keys for different languages. The structure looks like this:

```swift

static var strings : [String : Any?] = [
    "en" : [
        "identomat_agree" : "Yes I Agree",
    ],
    "ru" : [
        "identomat_agree": "Согласен",
    ],
    "es" : [
        "identomat_agree": "Acepto",
    ],
    "ka" : [
        "identomat_agree": "ვეთანხმები",
    ]
]
```

In the second approach, you use the `setStringsTableName(tableName: String)` function, where you create a `.strings` file in your project and localize it for different languages, just like you would do for your app.

Here's how you can use this method:

1. Create a `.strings` file, for example, `languages.strings`.
2. Localize the file for different languages as you normally would in your project.
3. Pass the name of the `.strings` file (without the extension) to the library, like this:

```swift
setStringsTableName(tableNme : "languages")
```

### 3. Customizing variables <a href="#id-3.-customizing-variables" id="id-3.-customizing-variables"></a>

For every other customization, we use the `setVariables(variables: Map<String, Any?>)` function, where we pass a key-value pair map of variables.

The map structure looks like this:

```swift
static var variables : [String : Any?] = [
    "back_button_icon": UIImage(named: "image_name"),                         -- sets back button icon. type -> UIImage
    "liveness_neutral_icon" : UIImage(named: "liveness_neutral_icon"),        -- sets liveness neutral face icon. type -> UIImage
    "liveness_smile_icon" : UIImage(named: "liveness_smile_icon"),            -- sets liveness smile face icon.       type -> UIImage
    "liveness_neutral_icon_record" : UIImage(named: "liveness_neutral_icon"), -- sets liveness neutral face icon while recording. type -> UIImage
    "liveness_smile_icon_record" : UIImage(named: "liveness_smile_icon"),     -- sets liveness smile face icon  while recording. type -> UIImage

    "liveness_retry_icon" : UIImage(named: "image_name"),           -- sets liveness retry page icon. type -> UIImage
    "liveness_retry_text_icon_1" : UIImage(named: "image_name"),    -- sets liveness retry first instruction icon.  type -> UIImage
    "liveness_retry_text_icon_2" : UIImage(named: "image_name"),    -- sets liveness retry second instruction icon. type -> UIImage
    "liveness_retry_text_icon_3" : UIImage(named: "image_name"),    -- sets liveness retry third instruction icon. type -> UIImage
    "liveness_retry_text_icon_4" : UIImage(named: "image_name"),    -- sets liveness retry fourth instruction icon. type -> UIImage
    "scan_retry_icon" : UIImage(named: "image_name"),               -- sets scan document retry page icon. type -> UIImage
    "camera_deny_icon" : UIImage(named: "image_name"),              -- sets camera deny page icon. type -> UIImage
    "upload_retry_icon" : UIImage(named: "image_name"),             -- sets upload retry page icon. type -> UIImage

    "liveness_retry_icon_size" : 200,     -- sets save icon sizes. type -> int
    "scan_retry_icon_size" : 200,
    "camera_deny_icon_size" : 200,
    "upload_retry_icon_size" : 200,
    "liveness_retry_text_icon_1_size": 24,
    "liveness_retry_text_icon_2_size": 24,
    "liveness_retry_text_icon_3_size": 24,
    "liveness_retry_text_icon_4_size": 24,
    
    "location_instruction_icon_1",
    "location_instruction_icon_2",
    
    "geolocation_icon",
    "geolocation_success_icon",
    "geolocation_deny_icon",

    "primary_button_width": nil,           -- sets primary button width, if nil its width is maximum
    "primary_button_height": 50,           -- sets primary button height,

    "skip_liveness_instructions" : false,  -- skips liveness instructions. type -> boolean
    "liveness_type" : 1,                   -- chooses liveness icons display type values 1 or 2.  type -> int
    "button_corner_radius" : nil,          -- sets button corner radious, if it's nil button will be round cornered
    "panel_elevation" : 1,                 -- sets panels elevation. type -> int

    "liveness_info_main_icon" or "liveness_info_main_anim",      -- instruction page  
    "liveness_frame_face_icon" or "liveness_frame_face_anim",    -- frame page
    "instruction_smile_icon" or "instruction_smile_anim"         -- Liveness processing page 
    
    Sets  font sizes
    "title_medium_size": 20,
    "title_small_size":
    "headline_medium_size": 20,
    "headline_small_size"
    "body_medium_size": 11
    "body_small_size"
 
    Sets font
    "title_font":"font-name",
    "body_font": "font-name",
    "headline_font":"font-name",

    "default_country_code": "GE"   -- sets default country for country code picker
]
```

### 4. Setting a custom logo

`setLogo(view: UIView)` This function is used for setting a custom logo in the library. You can pass your own custom view, and display anything on that view (animations, images, etc.). This logo will be displayed when the library is processing something.

***

### String keys and default values <a href="#liveness-retry-string-keys" id="liveness-retry-string-keys"></a>

String keys and their default value for English language:

```ini
 /* ID verification */
 "identomat_select_document" = "Select document";
  
 "identomat_card" = "ID card";
 "identomat_card_front_instructions" = "Scan FRONT SIDE of ID CARD";
 "identomat_card_front_upload" = "Upload FRONT SIDE of ID CARD";
 "identomat_card_rear_instructions" = "Scan BACK SIDE of ID CARD";
 "identomat_card_rear_upload" = "Upload BACK SIDE of ID CARD";
  
 "identomat_driver_license" = "Driver license";
 "identomat_driver_license_front_instructions" = "Scan FRONT SIDE of DRIVER LICENSE";
 "identomat_driver_license_front_upload" = "Upload FRONT SIDE of DRIVER LICENSE";
 "identomat_driver_license_rear_instructions" = "Scan BACK SIDE of DRIVER LICENSE";
 "identomat_driver_license_rear_upload" = "Upload BACK SIDE of DRIVER LICENSE";
  
 "identomat_passport" = "Passport";
 "identomat_passport_instructions" = "Passport photo page";
 "identomat_passport_upload" = "Upload passport photo page";
  
 "identomat_residence_permit" = "Residence permit";
 "identomat_residence_permit_front_instructions" = "Scan FRONT SIDE of RESIDENCE PERMIT";
 "identomat_residence_permit_front_upload" = "Upload FRONT SIDE of RESIDENCE PERMIT";
 "identomat_residence_permit_rear_instructions" = "Scan BACK SIDE of RESIDENCE PERMIT";
 "identomat_residence_permit_rear_upload" = "Upload BACK SIDE of RESIDENCE PERMIT";
  
 "identomat_capture_method_title" = "Choose a method";
 "identomat_take_photo" = "Take a photo";
 "identomat_upload_file" = "Upload a file";
 "identomat_upload_another_file" = "Upload another file";
  
 "identomat_upload_instructions_1" = "Upload a color image of the entire document";
 "identomat_upload_instructions_2" = "JPG or PNG format only";
 "identomat_upload_instructions_3" = "Screenshots are not allowed";
 "identomat_choose_file" = "Choose a file";
  
 "identomat_verifying" = "Verifying...";
 "identomat_uploading" = "Uploading...";
  
 "identomat_scan_retry_title" = "Capture failed";
 "identomat_scan_retry_instruction" = "Please try again in better lighting";
 "identomat_scan_retry_again" = "Try again";
 "identomat_upload_success" = "Successfully uploaded!";
  
 "identomat_no_document_in_image" = "Frame your document";
 "identomat_document_align" = "Frame your document";
 "identomat_document_blurry" = "Document is blurry";
 "identomat_document_face_blurry" = "Face on document is blurry";
 "identomat_document_face_require_brighter" = "Low light";
 "identomat_document_face_too_bright" = "Avoid direct light";
 "identomat_document_move_away" = "Please move document away";
 "identomat_document_move_closer" = "Please move document closer";
 "identomat_document_move_down" = "Please move document down";
 "identomat_document_move_left" = "Please move document to the left";
 "identomat_document_move_right" = "Please move document to the right";
 "identomat_document_move_up" = "Please move document up";
 "identomat_document_covered" = "Document is covered";
 "identomat_document_grayscale" = "Document is grayscale";
 "identomat_document_type_mismatch" = "Wrong document";
 "identomat_document_not_readable" = "Document not readable";
 "identomat_document_face_align" = "Document face align";
 "identomat_document_spoofing_detected2" = "Document spoofing detected";
 "identomat_document_page_mismatch" = "Wrong page";
 "identomat_document_nfc_chip_damaged" = "Document NFC chip damaged";
  
  
 /* Passive liveness */
 "identomat_face_instructions" = "Place your FACE within OVAL";
 "identomat_processing" = "Processing, please wait";
  
  
 /* Active liveness */
 "identomat_record_begin_section_1" = "Take a neutral expression";
 "identomat_record_begin_section_2" = "Smile on this sign";
 "identomat_record_begin_section_3" = "Take a neutral expression again";
 "identomat_record_begin_title" = "Get ready for your video selfie";
 "identomat_record_instructions" = "Place your FACE within OVAL and follow the on-screen instructions";
 "identomat_im_ready" = "I'm ready";
 "identomat_neutral_expression" = "Neutral face";
 "identomat_smile" = "Smile";
  
  
 /* Adaptive liveness */
"identomat_passive_record_begin_title" = "Get ready for your video selfie";
"identomat_passive_record_begin_subtitle" = "Follow the on-screen instructions when prompted.";
"identomat_passive_record_begin_subtitle_smile" = "When prompted, repeat the facial expression shown on the icons.";
"identomat_passive_record_begin_section_title" = "Tips";
"identomat_passive_record_begin_section_1" = "Frame your face";
"identomat_passive_record_begin_section_2" = "Hold still until success notify";
"identomat_smile" = "Smile""identomat_im_ready" = "I'm ready";
  
  
 /* Cascading liveness */
 "identomat_cascading_instructions" = "When prompted, repeat the facial expression shown on the icons: \n\n• Keep neutral face \n• Smile";
 "identomat_cascading_instructions_title" = "When prompted, repeat the facial expression shown on the icons:";
 "identomat_cascading_instructions_1" = "• Keep neutral face";
 "identomat_cascading_instructions_2" = "• Smile";
 "identomat_cascading_button" = "Start Liveness Check";
 "identomat_cascading_neutral_face" = "Keep neutral face";
 "identomat_cascading_start" = "Position your face!";
 "identomat_cascading_smile" = "Smile!";
 "identomat_cascading_fail" = "Liveness Failed";
 "identomat_cascading_success" = "That's it!";
  
 "identomat_liveness_retry_title" = "We can't detect your face";
 "identomat_liveness_retry_instruction" = "But first, please take a look at the instructions";
 "identomat_liveness_retry_again" = "Try again";
 "identomat_liveness_retry_instruction_1" = "Make sure to be in a place with good lighting";
 "identomat_liveness_retry_instruction_2" = "Make sure your eyes are clearly visible";
 "identomat_liveness_retry_instruction_3" = "Make sure to remove masks or other items that cover your face. Eyeglasses are okay";
 "identomat_liveness_retry_instruction_4" = "Make sure to only show your face, we don’t need to see your ID";
  
 "identomat_lets_try" = "Let's try";
  
 "identomat_low_neutral_frequency" = "Untimely smile detected";
 "identomat_not_smile" = "Smile not detected";
 "identomat_eyes_closed" = "Eyes are closed";
 "identomat_face_hold" = "Hold still";
 "identomat_no_face" = "Face is missing";
 "identomat_face_covered" = "Face is covered";
 "identomat_face_align" = "Frame your face";
 "identomat_face_away_from_center" = "Center your Face";
 "identomat_face_blurry" = "Face is blurry";
 "identomat_face_far_away" = "Move closer";
 "identomat_face_require_brighter" = "Low light";
 "identomat_face_too_bright" = "Avoid direct light";
 "identomat_face_too_close" = "Move away";
 "identomat_smile_detected" = "Get neutral face";
 "identomat_multiple_face" = "Keep only your face visible";
  
 /* Camera permission */
 "identomat_camera_deny_title" = "Camera access denied";
 "identomat_camera_deny_settings" = "Allow access";
 "identomat_camera_deny_cancel" = "Cancel process";
  
  
 /* Phone number collection and verification */
 "identomat_resend_code" = "Resend Code";
 "identomat_get_code" = "Get Code";
 "identomat_sms_title" = "Verify Phone Number";
 "identomat_sms_subtitle" = "Enter your correct phone number\nto get verification code";
 "identomat_resend_in" = "Resend code in ";
 "identomat_invalid_number" = "Please enter valid number";
 "identomat_invalid_code" = "The code is not valid";
 "identomat_sms_code_sent" = "Enter the 4-digit verification code sent to ";
 "identomat_enter_sms_code" = "Enter SMS code";
 "identomat_phone_number_hint" = "Phone number";
 "identomat_enter_phone_number" = "Enter phone number";
 "identomat_enter_correct_number" = "Enter your correct phone number";
 "identomat_confirm" = "Confirm";
 "identomat_search" = "Search";
 "identomat_verify_enter_code_hint" = "Enter code";
  
  
 /* Email collection and verification*/
 "identomat_enter_email_address" = "Enter email address";
 "identomat_enter_correct_email" = "Enter your correct email address";
 "identomat_enter_valid_email" = "Please enter valid email";
 "identomat_email_hint" = "Email address";
 "identomat_confirm" = "Confirm";
 "identomat_email_check_title" = "Verify Email";
 "identomat_email_check_subtitle" = "Enter your correct email address\nto get verification code";
 "identomat_get_code" = "Get Code";
 "identomat_resend_in" = "Resend code in ";
 "identomat_resend_code" = "Resend Code";
 "identomat_verify_email_code_title" = "Enter code";
 "identomat_verify_email_code_subtitle" = "Enter the 6-digit verification code sent to ";
 "identomat_verify_email_invalid_code" = "The code is not valid";
 "identomat_verify_enter_code_hint" = "Enter code";
  
  
 /* Page titles */
 "identomat_require_email_header" = "";
 "identomat_require_phone_number_header" = "";
 "identomat_require_phone_number_check_header" = "";
 "identomat_enter_sms_code_header" = "";
 "identomat_select_documents_header" = "";
 "identomat_capture_methods_header" = "";
 "identomat_upload_header" = "";
 "identomat_new_liveness_header" = "";
 "identomat_camera_access_header" = "";
 "identomat_select_country" = "Select country";
 "identomat_retry_header" = "";
  
  
 /* Geolocation */
 "identomat_send_location_button" = "Send Location";
 "identomat_geolocation_title" = "Allow location access";
 "identomat_geolocation_subtitle" = "To continue the verification, we need access to your device's location.";
 "identomat_geolocation_success" = "Your profile has been verified.";
  
 "identomat_geolocation_deny_title" = "Location access denied";
 "identomat_geolocation_deny_subtitle" = "We can’t identify you without your location";
 "identomat_geolocation_deny_instruction_1" = "You can recover location access through your device settings";
 "identomat_geolocation_deny_instruction_2" = "Go to app settings and enable location access for this app";
 "identomat_geolocation_enable_button" = "Enable in settings";
 "identomat_geolocation_cancel_button" = "Cancel process";
  
  
 /* Proof of address */
 "identomat_bank_statement" = "Bank Statement";
 "identomat_utility_bill" = "Utility bill";
 "identomat_vehicle_registration_certificate" = "Vehicle registration certificate";
 "identomat_yellow_slip" = "Yellow slip";
 "identomat_drivers_license" = "Driver's license";
  
 "identomat_upload_bank_statement" = "Upload Bank Statement";
 "identomat_upload_utility_bill" = "Upload Utility bill";
 "identomat_upload_vehicle_registration_certificate" = "Upload Vehicle registration certificate";
 "identomat_upload_yellow_slip" = "Upload Yellow slip";
 "identomat_upload_drivers_license" = "Upload Driver's license";
 "identomat_upload_document_subtitle" = "Make sure that all the information on the photo is visible and easy to read";
  
 "identomat_select_document_title" = "Select Document";
 "identomat_proof_of_address_title" = "Proof of Address";
 "identomat_proof_of_address_subtitle" = "Please upload a document that confirms your residential address.";
 "identomat_uploaded" = "Uploaded";
 "identomat_document_errors" = "Document Errors";
  
 "identomat_expired_date_was_not_found" = "Expiry date was not found in the document";
 "identomat_issued_date_was_not_found" = "Issue date was not found in the document";
 "identomat_full_name_does_not_match" = "Full name does not match";
 "identomat_full_name_was_not_found" = "Full name was not found in the document";
 "identomat_issuing_authority_name_was_not_found" = "Issuing authority name was not found in the document";
 "identomat_street_address_was_not_found" = "Street address was not found in the document";
 "identomat_document_expired" = "Document is expired";
 "identomat_address_not_valid" = "Address not valid";
 "identomat_document_date_is_in_the_future" = "Document date is in the future";
 "identomat_document_not_matched" = "Document not matched";
 "identomat_oversized_file" = "Oversized File: Maximum file size is 5MB";
 "identomat_unsupported_file_type" = "File Format Mismatch";
 "identomat_too_many_pages" = "Too many Pages: Maximum pages is 20";
  
 "identomat_continue" = "Continue";
 "identomat_no_connection" = "No internet connection";
 
```


# iOS SDK changelog

Keep track of changes and upgrades to the Identomat iOS SDK.

{% hint style="info" %}
**Breaking changes are marked in bold.**
{% endhint %}

### Version 1.1.171

*Released on Jul 06, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.165

*Released on Jun 25, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.164

*Released on Jun 24, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.163

*Released on Jun 16, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.162

*Released on May 27, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.161

*Released on May 15, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.160

*Released on May 01, 2026*

* **Added: Document data review page.** \
  Users can now review and edit extracted document data before submission. For implementation details, please refer to our [Developer guide](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification).

### Version 1.1.158

*Released on Mar 25, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.157

*Released on Mar 11, 2026*

* **Added: Ability to include a Email verification step.**

### Version 1.1.156

*Released on Feb 18, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.155

*Released on Feb 17, 2026*

* **Added:** Ability to override specific element colors for enhanced UI customization:
  * `input_active_border_color` – Active state border color for input fields.
  * `input_default_border_color` – Default border color for input fields.
  * `button_secondary_outline_color` – Outline color for secondary buttons.
  * `button_secondary_text_color` – Text color for secondary buttons.

### Version 1.1.154

*Released on Feb 10, 2026*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.153

*Released on Feb 02, 2026*

* **Added**: **NFC reader support**.&#x20;

To enable NFC in the [ID document step](/developer-tools/developer-guide/kyc-know-your-customer#identity-document-verification), the `allow_nfc_capture: true` flag must be provided.&#x20;

### Version 1.1.152

*Released on Dec 05, 2025*

* **Fixed**: Liveness bug affecting iOS 15.

### Version 1.1.151

*Released on Nov 25, 2025*

* **Added**: [New color variables](https://docs.identomat.com/sdks/ios-sdk/pages/sMnYHKpPfQuXczMlnIHB#id-1.-customizing-colors) in design customization.
* **Fixed**: User interface bug in adaptive liveness.

### Version 1.1.149

*Released on Oct 20, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.148

*Released on Oct 13, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.147

*Released on Oct 07, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.145

*Released on Sep 30, 2025*

* **Added: Ability to include a Proof of Address (POA) step.**

### Version 1.1.142

*Released on Sep 23, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.141

*Released on Sep 19, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.140

*Released on Sep 12, 2025*

* **Added: Ability to include a Geolocation step.**

### Version 1.1.139

*Released on Sep 09, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.138

*Released on Aug 26, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.135

*Released on Aug 07, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.133

*Released on July 30, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.131

*Released on July 24, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.130

*Released on Jun 25, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.129

*Released on May 21, 2025*

* **Fixed:** Various bugs and performance improvements.
* **Fixed:** Issue with language display—only keys were visible instead of actual titles.
* **Changed**: Hyperlink color customization—previously tied to the primary color; now controlled by a separate `text_link` parameter.

### Version 1.1.127

*Released on March 29, 2025*

* **Added**: Ability to capture full HD photos.
* **Changed**: Parameters for fonts, font sizes, and colors.
  * **Set font**&#x20;
    * `head1_font` changed to `headline_font`
    * `head2_font` was <mark style="color:red;">removed</mark>.
  * **Set font size**
    * `title_font_size` changed to `title_medium_size`
    * `head1_font_size` changed to `headline_medium_size`
    * `body_font_size` changed to `body_medium_size`
    * `title_small_size` was <mark style="color:green;">added</mark>.&#x20;
    * `headline_small_size` was <mark style="color:green;">added</mark>.&#x20;
    * `body_small_size` was <mark style="color:green;">added</mark>.&#x20;
  * **Set font colors**
    * `text_color_header` changed to `text_primary`
    * `text_color_title` was <mark style="color:red;">removed</mark>.
    * `text_color` was <mark style="color:red;">removed</mark>.
    * `text_secondary` was <mark style="color:green;">added</mark>.&#x20;
    * `text_placeholder` was <mark style="color:green;">added</mark>.&#x20;
    * `text_disabled` was <mark style="color:green;">added</mark>.&#x20;
    * `text_inverse` was <mark style="color:green;">added</mark>.&#x20;
    * `text_link` was <mark style="color:green;">added</mark>.&#x20;

### Version 1.1.126

*Released on March 27, 2025*

* **Fixed**: Icon on the retry page wasn't updating according to the primary color.

### Version 1.1.124

*Released on March 17, 2025*

* **Fixed**: Crash issue on the retry page when setting an icon.

### Version 1.1.121

*Released on March 12, 2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.121

*Released on February 17, 2025*

* **Added**: New variables for UI customization:
  * `back_button_icon` – Changes the back button icon.
  * `primary_button_width` – Adjusts the width of the primary button.
  * `primary_button_height` – Adjusts the height of the primary button.
  * `liveness_smile_icon`– Changes the liveness smile icon. Example: *UIImage(named: "liveness\_smile\_icon")*

### Version 1.1.120

*Released on February 12.2025*

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.119

&#x20;*Released on February 7, 2025*

* **Added**: Country code selection for phone number collection and verification steps.
* **Added**: Ability to customize the back button icon.

### Version 1.1.118

* **Fixed**: Text alignment issues on phone number collection and phone number verification pages.

### Version 1.1.116

* **Fixed**: Text alignment issues on phone number collection and phone number verification pages.

### Version 1.1.115

* **Internal** changes only

### Version 1.1.114

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.113

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.112

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.111

* **Fixed:** Various bugs and performance improvements.

### Version 1.1.110

* **Fixed**: Various bugs on the retry page.

### Version 1.1.109

* **Changed**: UI of the liveness retry page updated for improved user experience.

### Version 1.1.108

* **Added**: Vehicle registration certificate reader in the Proof of Address step.

### Version 1.1.96

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version 1.1.94

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version 1.1.93

* **Fixed**: Issues related to design customization updates for phone number collection and verification steps.

### Version

* **Changed**: Liveness icon and uploading text color are now separately customizable.
* **Fixed**: Loader issue at the end of phone number verification.
* **Fixed**: Agreement translation issue when changing languages.
* **Fixed**: Dark and light mode issues - some colors were changing incorrectly.

### Version 1.1.91

* **Added**: Ability to customize link colors in agreements.

### Version 1.1.90

* **Added**: Ability to translate texts on phone number collection and verification steps.

### Version 1.1.89

* **Added**: Design customization options for phone number collection and verification steps.

### Version 1.1.88

* **Changed:** Passive liveness and cascading functionality combined for improved performance.

### Version 1.1.87

* **Changed**: Flag name for phone number verification.
  * `verify_phone_number changed` to `require_phone _number_check`

### Version 1.1.86

* **Fixed**: Issue with selecting the correct camera on iPhone 14 and later models.

### Version 1.1.85

* **Fixed**: Bugs related to adding links in agreements.

### Version 1.1.84

* **Added**: Ability to include links in agreements.
* **Fixed**: Bugs related to phone number verification functionality.

### Version 1.1.83

* **Added**: Phone number verification functionality.


# React Native SDK

Welcome to the Identomat React Native SDK documentation! Here, you'll find everything you need to integrate our ID verification and KYC/AML solutions into your React Native application seamlessly.

{% hint style="info" %}
Latest release: **Version 1.1.47**
{% endhint %}

## Getting started

```
$ npm install '@identomat-inc/react-native-identomat'
```

### For iOS:

Run `pod-install` in your iOS directory.

### For Android:

Insert the following lines inside the dependencies block in `android/build.gradle`:

```
    allprojects {
        repositories {
            google ()
            jcenter ()
            maven {
                url = uri("https://gitlab.identomat.com/api/v4/projects/674/packages/maven/")
            }
        }
    }
       ...
```

## Usage

```
     import identomat from '@identomat-inc/react-native-identomat';
// Callback for when the process finishes
    class Callback {
        callback() {
        console.log('finished')
        }
    }

// Callback for back button
class Back {
    callback() {
      console.log('back')
    
    }
  }
    identomat.setCallback(new Callback());
    identomat.setBackButtonCallback(new Back());
    identomat.setBaseUrl(config.baseUrl);
    identomat.setColors(config.colors);
    identomat.setStrings(config.strings);
    identomat.start(config.sessionKey);
```

## Config

```
module.exports = {
  sessionKey : '',
  baseUrl : 'https://widget.identomat.com/api/',
  colors: {
    "background",
    "text_primary",
    "text_secondary",
    "text_placeholder",
    "text_disabled",
    "text_inverse",
    "text_link",
    "primary_color",
    "neutral_color",
    "danger_color",
    "success_color",
    "warning_color",
    "black",
    "white"
  },
  variables:{
    "liveness_retry_icon_size": 200,                  
    "scan_retry_icon_size": 200,
    "camera_deny_icon_size": 200,
    "upload_retry_icon_size": 200,
    "liveness_retry_text_icon_1_size": 24,
    "liveness_retry_text_icon_2_size": 24,
    "liveness_retry_text_icon_3_size": 24,
    "liveness_retry_text_icon_4_size": 24

    "title_medium_size": 16,
    "title_small_size": 14,
    "headline_medium_size": 28,
    "headline_small_size": 24, 
    "body_medium_size": 16,
    "body_small_size": 14

    "title_font":"font-name",
    "headline_font":"font-name",
    "body_font":"font-name",
},
  strings:{
    "en":{
      //ID verification
         
      "identomat_select_document": "Select document",
         
      "identomat_card": "ID card",
      "identomat_card_front_instructions": "Scan FRONT SIDE of ID CARD",
      "identomat_card_front_upload": "Upload FRONT SIDE of ID CARD",
      "identomat_card_rear_instructions": "Scan BACK SIDE of ID CARD",
      "identomat_card_rear_upload": "Upload BACK SIDE of ID CARD",
       
      "identomat_driver_license": "Driver license",
      "identomat_driver_license_front_instructions": "Scan FRONT SIDE of DRIVER LICENSE",
      "identomat_driver_license_front_upload": "Upload FRONT SIDE of DRIVER LICENSE",
      "identomat_driver_license_rear_instructions": "Scan BACK SIDE of DRIVER LICENSE",
      "identomat_driver_license_rear_upload": "Upload BACK SIDE of DRIVER LICENSE",
       
      "identomat_passport": "Passport",
      "identomat_passport_instructions": "Passport photo page",
      "identomat_passport_upload": "Upload passport photo page",
       
      "identomat_residence_permit": "Residence permit",
      "identomat_residence_permit_front_instructions": "Scan FRONT SIDE of RESIDENCE PERMIT",
      "identomat_residence_permit_front_upload": "Upload FRONT SIDE of RESIDENCE PERMIT",
      "identomat_residence_permit_rear_instructions": "Scan BACK SIDE of RESIDENCE PERMIT",
      "identomat_residence_permit_rear_upload": "Upload BACK SIDE of RESIDENCE PERMIT",
       
      "identomat_capture_method_title": "Choose a method",
      "identomat_take_photo": "Take a photo",
      "identomat_upload_file": "Upload a file",
      "identomat_upload_another_file": "Upload another file",
       
      "identomat_upload_instructions_1": "Upload a color image of the entire document",
      "identomat_upload_instructions_2": "JPG or PNG format only",
      "identomat_upload_instructions_3": "Screenshots are not allowed",
      "identomat_choose_file": "Choose a file",
       
      "identomat_verifying": "Verifying...",
      "identomat_uploading": "Uploading...",
       
      "identomat_scan_retry_title": "Capture failed",
      "identomat_scan_retry_instruction": "Please try again in better lighting",
      "identomat_scan_retry_again": "Try again",
      "identomat_upload_success": "Successfully uploaded!",
       
      "identomat_no_document_in_image": "Frame your document",
      "identomat_document_align": "Frame your document",
      "identomat_document_blurry": "Document is blurry",
      "identomat_document_face_blurry": "Face on document is blurry",
      "identomat_document_face_require_brighter": "Low light",
      "identomat_document_face_too_bright": "Avoid direct light",
      "identomat_document_move_away": "Please move document away",
      "identomat_document_move_closer": "Please move document closer",
      "identomat_document_move_down": "Please move document down",
      "identomat_document_move_left": "Please move document to the left",
      "identomat_document_move_right": "Please move document to the right",
      "identomat_document_move_up": "Please move document up",
      "identomat_document_covered": "Document is covered",
      "identomat_document_grayscale": "Document is grayscale",
      "identomat_document_type_mismatch": "Wrong document",
      "identomat_document_not_readable": "Document not readable",
      "identomat_document_face_align": "Document face align",
      "identomat_document_spoofing_detected2": "Document spoofing detected",
      "identomat_document_page_mismatch": "Wrong page",
      "identomat_document_nfc_chip_damaged": "Document NFC chip damaged";
       
       
      //Passive liveness
      "identomat_face_instructions": "Place your FACE within OVAL",
      "identomat_processing": "Processing, please wait";
       
       
      // Active liveness
      "identomat_record_begin_section_1": "Take a neutral expression",
      "identomat_record_begin_section_2": "Smile on this sign",
      "identomat_record_begin_section_3": "Take a neutral expression again",
      "identomat_record_begin_title": "Get ready for your video selfie",
      "identomat_record_instructions": "Place your FACE within OVAL and follow the on-screen instructions",
      "identomat_im_ready": "I'm ready",
      "identomat_neutral_expression": "Neutral face",
      "identomat_smile": "Smile",
       
       
      // Adaptive liveness
      "identomat_passive_record_begin_title": "Get ready for your video selfie",
      "identomat_passive_record_begin_subtitle": "Follow the on-screen instructions when prompted.",
      "identomat_passive_record_begin_subtitle_smile": "When prompted, repeat the facial expression shown on the icons."
      "identomat_passive_record_begin_section_title": "Tips",
      "identomat_passive_record_begin_section_1": "Frame your face",
      "identomat_passive_record_begin_section_2": "Hold still until you see a success notification.",
      "identomat_smile": "Smile",
      "identomat_im_ready": "I'm ready";
       
       
      // Cascading liveness
      "identomat_cascading_instructions": "When prompted, repeat the facial expression shown on the icons:\n\n• Keep neutral face\n• Smile",
      "identomat_cascading_instructions_title": "When prompted, repeat the facial expression shown on the icons:",
      "identomat_cascading_instructions_1": "• Keep neutral face",
      "identomat_cascading_instructions_2": "• Smile",
      "identomat_cascading_button": "Start Liveness Check",
      "identomat_cascading_neutral_face": "Keep neutral face",
      "identomat_cascading_start": "Position your face!",
      "identomat_cascading_smile": "Smile!",
      "identomat_cascading_fail": "Liveness Failed",
      "identomat_cascading_success": "That's it!",
       
      "identomat_liveness_retry_title": "We can't detect your face",
      "identomat_liveness_retry_instruction": "But first, please take a look at the instructions",
      "identomat_liveness_retry_again": "Try again",
      "identomat_liveness_retry_instruction_1": "Make sure to be in a place with good lighting",
      "identomat_liveness_retry_instruction_2": "Make sure your eyes are clearly visible",
      "identomat_liveness_retry_instruction_3": "Remove masks or items covering your face. Eyeglasses are okay",
      "identomat_liveness_retry_instruction_4": "Show only your face, we don’t need to see your ID",
       
      "identomat_lets_try": "Let's try",
       
      "identomat_low_neutral_frequency": "Untimely smile detected",
      "identomat_not_smile": "Smile not detected",
      "identomat_eyes_closed": "Eyes are closed",
      "identomat_face_hold": "Hold still",
      "identomat_no_face": "Face is missing",
      "identomat_face_covered": "Face is covered",
      "identomat_face_align": "Frame your face",
      "identomat_face_away_from_center": "Center your Face",
      "identomat_face_blurry": "Face is blurry",
      "identomat_face_far_away": "Move closer",
      "identomat_face_require_brighter": "Low light",
      "identomat_face_too_bright": "Avoid direct light",
      "identomat_face_too_close": "Move away",
      "identomat_smile_detected": "Get neutral face",
      "identomat_multiple_face": "Keep only your face visible",
       
       
      //Camera permission
      "identomat_camera_deny_title": "Camera access denied",
      "identomat_camera_deny_settings": "Allow access",
      "identomat_camera_deny_cancel": "Cancel process",
       
       
      //Phone number collection & verification
      "identomat_resend_code": "Resend Code",
      "identomat_get_code": "Get Code",
      "identomat_sms_title": "Verify Phone Number",
      "identomat_sms_subtitle": "Enter your correct phone number\nto get verification code",
      "identomat_resend_in": "Resend code in ",
      "identomat_invalid_number": "Please enter valid number",
      "identomat_invalid_code": "The code is not valid",
      "identomat_sms_code_sent": "Enter the 4-digit verification code sent to ",
      "identomat_enter_sms_code": "Enter SMS code",
      "identomat_phone_number_hint": "Phone number",
      "identomat_enter_phone_number": "Enter phone number",
      "identomat_enter_correct_number": "Enter your correct phone number",
      "identomat_confirm": "Confirm",
      "identomat_search": "Search",
      "identomat_verify_enter_code_hint": "Enter code",
       
       
      // Email collection & verification
      "identomat_enter_email_address": "Enter email address",
      "identomat_enter_correct_email": "Enter your correct email address",
      "identomat_enter_valid_email": "Please enter valid email",
      "identomat_email_hint": "Email address",
      "identomat_confirm": "Confirm",
      "identomat_email_check_title": "Verify Email",
      "identomat_email_check_subtitle": "Enter your correct email address\nto get verification code",
      "identomat_get_code": "Get Code",
      "identomat_resend_in": "Resend code in ",
      "identomat_resend_code": "Resend Code",
      "identomat_verify_email_code_title": "Enter code",
      "identomat_verify_email_code_subtitle": "Enter the 6-digit verification code sent to ",
      "identomat_verify_email_invalid_code": "The code is not valid",
      "identomat_verify_enter_code_hint": "Enter code",
       
       
      // Page titles
      "identomat_require_email_header": "",
      "identomat_require_phone_number_header": "",
      "identomat_require_phone_number_check_header": "",
      "identomat_enter_sms_code_header": "",
      "identomat_select_documents_header": "",
      "identomat_capture_methods_header": "",
      "identomat_upload_header": "",
      "identomat_new_liveness_header": "",
      "identomat_camera_access_header": "",
      "identomat_select_country": "Select country",
      "identomat_retry_header": "",
       
       
      //Geolocation
      "identomat_send_location_button": "Send Location",
      "identomat_geolocation_title": "Allow location access",
      "identomat_geolocation_subtitle": "To continue the verification, we need access to your device's location.",
      "identomat_geolocation_success": "Your profile has been verified.",
       
      "identomat_geolocation_deny_title": "Location access denied",
      "identomat_geolocation_deny_subtitle": "We can’t identify you without your location",
      "identomat_geolocation_deny_instruction_1": "You can recover location access through your device settings",
      "identomat_geolocation_deny_instruction_2": "Go to app settings and enable location access for this app",
      "identomat_geolocation_enable_button": "Enable in settings",
      "identomat_geolocation_cancel_button": "Cancel process",
       
       
      //Proof of address
      "identomat_bank_statement": "Bank Statement",
      "identomat_utility_bill": "Utility bill",
      "identomat_vehicle_registration_certificate": "Vehicle registration certificate",
      "identomat_yellow_slip": "Yellow slip",
      "identomat_drivers_license": "Driver's license",
       
      "identomat_upload_bank_statement": "Upload Bank Statement",
      "identomat_upload_utility_bill": "Upload Utility bill",
      "identomat_upload_vehicle_registration_certificate": "Upload Vehicle registration certificate",
      "identomat_upload_yellow_slip": "Upload Yellow slip",
      "identomat_upload_drivers_license": "Upload Driver's license",
      "identomat_upload_document_subtitle": "Make sure that all the information on the photo is visible and easy to read",
       
      "identomat_select_document_title": "Select Document",
      "identomat_proof_of_address_title": "Proof of Address",
      "identomat_proof_of_address_subtitle": "Please upload a document that confirms your residential address.",
      "identomat_uploaded": "Uploaded",
      "identomat_document_errors": "Document Errors",
       
      "identomat_expired_date_was_not_found": "Expiry date was not found in the document",
      "identomat_issued_date_was_not_found": "Issue date was not found in the document",
      "identomat_full_name_does_not_match": "Full name does not match",
      "identomat_full_name_was_not_found": "Full name was not found in the document",
      "identomat_issuing_authority_name_was_not_found": "Issuing authority name was not found in the document",
      "identomat_street_address_was_not_found": "Street address was not found in the document",
      "identomat_document_expired": "Document is expired",
      "identomat_address_not_valid": "Address not valid",
      "identomat_document_date_is_in_the_future": "Document date is in the future",
      "identomat_document_not_matched": "Document not matched",
      "identomat_oversized_file": "Oversized File: Maximum file size is 5MB",
      "identomat_unsupported_file_type": "File Format Mismatch",
      "identomat_too_many_pages": "Too many pages: The maximum is 20",
       
      "identomat_continue": "Continue",
      "identomat_no_connection": "No internet connection"
    }
  }
}
```


# React Native SDK changelog

Keep track of changes and upgrades to the React Native SDK.

{% hint style="info" %}
**Breaking changes are marked in bold.**
{% endhint %}

### Version 1.1.47

*Released on Jul 06, 2026*

* **Updated**: iOS version increased to 1.1.171.

### Version 1.1.45

*Released on Jun 24, 2026*

* **Updated**: iOS version increased to 1.1.165.

### Version 1.1.44

*Released on Jun 24, 2026*

* **Updated**: iOS version increased to 1.1.164 and Android version increased to 1.1.185.

### Version 1.1.43

*Released on May 13, 2026*

* **Updated**: iOS version increased to 1.1.161 and Android version increased to 1.1.183.

### Version 1.1.42

*Released on Apr 22, 2026*

* **Updated**: iOS version increased to 1.1.159 and Android version increased to 1.1.181.

### Version 1.1.41

*Released on Mar 25, 2026*

* **Updated**: iOS version increased to 1.1.158 and Android version increased to 1.1.179.

### Version 1.1.40

*Released on Mar 11, 2026*

* **Updated**: iOS version increased to 1.1.157 and Android version increased to 1.1.177.
* **Added: Ability to include Email verification step.**

### Version 1.1.38

*Released on Feb 18, 2026*

* **Updated**: iOS version increased to 1.1.156.

### Version 1.1.37

*Released on Feb 17, 2026*

* **Updated**: iOS version increased to 1.1.155, **Adding** ability to override specific element colors for enhanced UI customization:
  * `input_active_border_color` – Active state border color for input fields.
  * `input_default_border_color` – Default border color for input fields.
  * `button_secondary_outline_color` – Outline color for secondary buttons.
  * `button_secondary_text_color` – Text color for secondary buttons.

### Version 1.1.36

*Released on Feb 13, 2026*

* **Updated**: Android version increased to 1.1.175, **Adding** ability to override specific element colors for enhanced UI customization:
  * `input_active_border_color` – Active state border color for input fields.
  * `input_default_border_color` – Default border color for input fields.
  * `button_secondary_outline_color` – Outline color for secondary buttons.
  * `button_secondary_text_color` – Text color for secondary buttons.

### Version 1.1.34

*Released on Feb 02, 2026*

* **Updated**: iOS version increased to 1.1.153, **adding NFC reader support.** Android version increased to 1.1.172.

### Version 1.1.33

*Released on Jan 29, 2026*

* **Updated**: Android version increased to 1.1.171.

### Version 1.1.32

*Released on Jan 21, 2026*

* **Updated**: Android version increased to 1.1.166, **adding NFC reader support.**

### Version 1.1.30

*Released on Dec 08, 2025*

* **Added**: [New color variables](https://docs.identomat.com/sdks/react-native-sdk/pages/sMnYHKpPfQuXczMlnIHB#id-1.-customizing-colors) in design customization.
* **Updated**: iOS version increased to 1.1.152 and Android version increased to 1.1.163.

### Version 1.1.28

*Released on Sep 19, 2025*

* **Updated**: iOS version increased to 1.1.141.

### Version 1.1.26

*Released on Sep 10, 2025*

* **Updated**: iOS version increased to 1.1.139 and Android version increased to 1.1.155.

### Version 1.1.25

*Released on July 29, 2025*

* **Updated**: iOS version increased to 1.1.132 and Android version increased to 1.1.147.
* **Added: Ability to include a user questionnaire step.**
* **Added: Ability to start sessions using a predefined configuration.**

### Version 1.1.24

*Released on July 24, 2025*

* **Updated**: iOS version increased to 1.1.131 and Android version increased to 1.1.146.

### Version 1.1.23

*Released on Jun 26, 2025*

* **Updated**: iOS version increased to 1.1.130 and Android version increased to 1.1.142.

### Version 1.1.21

*Released on May 23, 2025*

* **Updated**: iOS version increased to 1.1.129 and Android version increased to 1.1.138 due to Kotlin version update (2.1.21).

### Version 1.1.19

*Released on March 27, 2025*

* **Updated**: iOS version increased to 1.1.126 and Android version increased to 1.1.134.

### Version 1.1.18

*Released on March 17, 2025*

* **Updated**: Android version increased to 1.1.133.

### Version 1.1.17

*Released on March 17, 2025*

* **Updated**: iOS version increased to 1.1.124 and Android version increased to 1.1.132.

### Version 1.1.13

*Released on March 12, 2025*

* **Updated**: iOS version increased to 1.1.122 and Android version increased to 1.1.129.

### Version 1.1.13

* **Fixed**: Various bugs and performance improvements.

### Version 1.1.13

* **Added**: Callback for unfinished sessions.
* **Updated**: iOS version increased to 1.1.120 and Android version increased to 1.1.124.

### Version 1.1.12

* **Updated**: iOS version increased to 1.1.119 and Android version increased to 1.1.123.

### Version 1.1.11

* **Updated**: Android version increased to 1.1.122.

### Version 1.1.10

* **Updated**: iOS version increased to 1.1.116.

### Version 1.1.8

* **Updated**: Upgraded to the latest version of React Native.


# Flutter SDK

Welcome to the Identomat Flutter SDK documentation! Here, you'll find everything you need to integrate our ID verification and KYC/AML solutions into your Flutter application seamlessly.

{% hint style="info" %}
Latest release: **Version** **0.0.16**
{% endhint %}

## Overview

The Identomat Flutter SDK provides a Flutter interface for starting an Identomat verification session in a mobile application using a session key.

The SDK is responsible for:

* Initializing the Identomat verification flow
* Launching the verification UI
* Communicating with the native Identomat implementation

## Getting started

### Depend on it

Run this command:

```sh
 $ flutter pub add identomat_flutter
```

This will add a line like this to your package's `pubspec.yaml` (and run an implicit `flutter pub get`):

```
dependencies:
  identomat_flutter: ^0.0.11
```

Alternatively, your editor might support `flutter pub get`. Check the docs for your editor to learn more.

### Import it

In your Dart code, you can use:

```
import 'package:identomat_flutter/identomat.dart';
import 'package:identomat_flutter/identomat_flutter_method_channel.dart';
import 'package:identomat_flutter/identomat_flutter_platform_interface.dart';
```

## Example

**example/lib/main.dart**

```
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:identomat_flutter/identomat.dart';
import 'package:identomat_flutter_example/data.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final identomat = Identomat();
  TextEditingController myController = TextEditingController();
  final formKey = GlobalKey<FormState>();

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState(String sesstionKey) async {
    identomat.setCallback(
      () {
        print('===========>>> ONCALL');
      },
    );
    await identomat.setBaseUrl(data['baseUrl']);
    await identomat.setColors(data['colors']);
    await identomat.setStrings(data['strings']);
    await identomat.start(sesstionKey);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Form(
              key: formKey,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  TextFormField(
                    controller: myController,
                    decoration:
                        const InputDecoration(hintText: 'Enter session key'),
                    validator: (text) {
                      if (text == null || text.trim().isEmpty) {
                        return 'Session key is empty';
                      }
                      return null;
                    },
                  ),
                  const SizedBox(
                    height: 20,
                  ),
                  ElevatedButton(
                    onPressed: () {
                      FocusManager.instance.primaryFocus?.unfocus();
                      if (formKey.currentState!.validate()) {
                        initPlatformState(myController.text.trim());
                      }
                    },
                    child: const Text('Click'),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
```


# Flutter SDK changelog

Keep track of changes and upgrades to the Flutter SDK.

{% hint style="info" %}
**Breaking changes are marked in bold.**
{% endhint %}

### Version 0.0.16

*Released on Mar 25, 2026*

* **Updated**: iOS version increased to 1.1.158 and Android version increased to 1.1.179.

### Version 0.0.15

*Released on Feb 16, 2026*

* **Updated**: Android version increased to 1.1.175.

### Version 0.0.14

*Released on Feb 13, 2026*

* **Updated**: iOS version increased to 1.1.154 and Android version increased to 1.1.174.

### Version 0.0.13

*Released on Feb 03, 2026*

* **Updated**: iOS version increased to 1.1.153, **adding NFC reader support.**&#x20;
* **Updated**: Android version increased to 1.1.172, **adding NFC reader support**.

### Version 0.0.11

*Released on Dec 23, 2025*

* **Updated**: Android version increased to 1.1.166.

### Version 0.0.10

*Released on Dec 18, 2025*

* **Updated**: iOS version increased to 1.1.152 and Android version increased to 1.1.164.

### Version 0.0.9

*Released on Oct 13, 2025*

* **Updated**: iOS version increased to 1.1.148 and Android version increased to 1.1.160.
* **Added: Ability to include a Geolocation step.**
* **Added: Ability to include a Proof of Address step.**

### Version 0.0.7

*Released on July 30, 2025*

* **Updated**: iOS version increased to 1.1.133 and Android version increased to 1.1.147.
* **Added: Ability to include a user questionnaire step.**
* **Added: Ability to start sessions using a predefined configuration.**

### Version 0.0.6

* **Updated**: To latest Android library 1.1.122

### Version 0.0.5 <a href="#id-005" id="id-005"></a>

* **Updated:** To latest iOS library 1.1.114, removing WebRTC dependency.

### Version 0.0.4 <a href="#id-005" id="id-005"></a>

* **Added:** Proof of Address functionally support.

### Version 0.0.3 <a href="#id-005" id="id-005"></a>

* **Fixed**: Basic tests.

### Version 0.0.2 <a href="#id-005" id="id-005"></a>

* **Added**: API and package documentation.
* **Added**: Example.
* **Added**: Supported license.

### Version 0.0.1 <a href="#id-005" id="id-005"></a>

* **Updated**: Mapped most of the important API methods.


# Overview

Live single participant and multi-participant video call solution with built-in eKYC modules.

## Overview

[Video KYC](https://www.identomat.com/products/video-kyc) allows identity verification through live, operator-assisted video calls. It ensures compliance with KYC regulations while providing a fast, remote onboarding experience.

Identomat supports both [one-on-one](#one-on-one-call) and [multi-participant](#multi-user-call) video KYC sessions, each adaptable to your workflow and regulatory needs.

#### One-on-one call

A one-on-one Video KYC session connects a customer directly with a verification operator.\
During the call, the operator performs verification actions in real time — such as:

* Document verification
* Liveness checks
* Data review and questionnaires

Once the verification is complete, the operator can approve or reject the session according to predefined rules.

#### Multi-user call

Multi-user sessions allow multiple participants to be verified within the same video KYC session.\
Each participant follows an independent, configurable workflow.\
This setup is commonly used for business or legal processes that involve several parties, such as:

* Corporate onboarding
* Mortgage or joint account applications
* Title or property registration

***

#### Video KYC may include these steps:

* Identity document verification
* Liveness detection
* AML (Anti-Money Laundering) and adverse media checks
* Proof of Address
* SMS and email verifications
* User and operator questionnaires

These features collectively ensure robust and comprehensive identity verification during the video KYC process.

***

#### Key Features

* **Configurable workflows** — Define the exact verification path per use case.
* **Multi-user support** — Verify multiple individuals in a single session.
* **Real-time operator actions** — Operators can trigger verification steps live during the call.
* **Audit and compliance** — Every call and verification event is logged for audit purposes.
* **Scalable architecture** — Built to handle large volumes of concurrent sessions securely.

***

#### Key benefits:

* **Enhanced security**: Video KYC offers a secure platform for verifying customers' identities, reducing the risk of identity theft and fraudulent activities.
* **Cost-effective**: It reduces operational costs associated with traditional in-person KYC processes, such as travel expenses and infrastructure costs.
* **Convenience**: Customers can undergo the KYC process remotely from anywhere with an internet connection, eliminating the need to visit physical locations.
* **Compliance**: Video KYC helps businesses comply with regulatory requirements by ensuring thorough identity verification processes.
* **Scalability**: Video KYC can easily scale to accommodate a large number of customers, making it suitable for businesses of all sizes.
* **Improved customer experience**: By offering a convenient and efficient verification process, video KYC enhances the overall customer experience, leading to higher satisfaction and retention rates.
* **Flexibility**: Video KYC can be integrated into existing systems and workflows, providing flexibility for businesses to customize the process according to their specific requirements.
* **Reduced manual errors**: Automation features within video KYC help minimize manual errors, ensuring accurate and reliable results.
* **Audit trails**: Video KYC platforms often provide audit trails and detailed records of the verification process, offering transparency and accountability for regulatory purposes.


# Create video KYC session

This guide walks you through creating and sharing a Video KYC session in Identomat Manage — from signing in to sending the verification link to your end user.

## Before you begin

Make sure you have the following in place:

* **An Identomat Manage account.** If you don't have one yet, contact your administrator or reach out to the Identomat team.
* **A Video KYC configuration.** Configurations define the verification steps your end user will go through. Your administrator sets these up. If none is available yet, request one before proceeding.

***

### Sign in to Manage

1. Go to Identomat [Manage](https://manage.identomat.com/).
2. Enter your **email** and **password**.
3. Click **Sign in** to access your account.

### Create a new session

Once you're signed in and a configuration is available:

1. Navigate to the **Sessions** page from the left sidebar.
2. Click **+ New session** in the top-right corner.
3. In the dialog that appears, fill in the following:
   * **Configuration** *(required)* – Select the Video KYC workflow you want to use.
   * **Session Name** *(optional)* – Add an internal label to help you identify this session later.
4. Click **Generate link**.

### Share the session link

After the link is generated, you have a few options for getting it to your end user:

* **Copy and share manually** — Copy the URL and send it via your preferred channel.
* **Send via SMS or email** — Identomat can trigger delivery through your own messaging service. To enable this, configure callback URLs in your **Company settings**. Once set up, you'll receive callbacks for link delivery and user actions. See [Callbacks](/developer-tools/callbacks) for setup instructions.

A few things to keep in mind:

* The link remains accessible from the session detail view if you need to retrieve it later.
* Link expiry is controlled by your workflow configuration. Check with your administrator if you're unsure how long a link stays active.


# End-user side

This page explains what end users will experience during a Video KYC session — from opening the link to completing verification.

## Requirements

Before starting, users should have the following ready:

<table data-header-hidden><thead><tr><th width="176.46484375"></th><th></th></tr></thead><tbody><tr><td>💻 <strong>Device</strong></td><td>A device with a working camera and microphone</td></tr><tr><td>🪪 <strong>Document</strong></td><td>A valid identity document — Passport, Identity Card, Residence Permit, or Driver's License</td></tr><tr><td>🌞 <strong>Lighting</strong></td><td>A well-lit environment</td></tr><tr><td>🛜 <strong>Connection</strong></td><td>A stable internet connection</td></tr></tbody></table>

## One-on-one session

### Joining the call

When the user opens their Video KYC link:

1. Identomat's verification widget launches automatically in their default browser.
2. Depending on the configuration, the user may need to complete preliminary steps — such as reviewing and agreeing to terms — before proceeding.
3. Once ready, the **video call frame** appears with a bottom panel containing:

<table><thead><tr><th width="157.7265625">Control</th><th width="452.93359375">Function</th></tr></thead><tbody><tr><td><strong>Audio</strong></td><td>Mute / unmute microphone</td></tr><tr><td><strong>Video</strong></td><td>Turn camera on / off</td></tr><tr><td><strong>Flip</strong></td><td>Mirror the camera view</td></tr><tr><td><strong>Switch</strong></td><td>Toggle between front and back camera <em>(if available)</em></td></tr><tr><td><strong>Join</strong></td><td>Connect to the operator and start the call</td></tr></tbody></table>

4. The user clicks **Join** to initiate the call. A **Connecting** screen is shown until the operator answers.

Once connected, a top panel becomes visible with:

* **Call duration** — displayed in the top-left corner
* **Device settings** — adjust camera, microphone, and speaker mid-call
* **Full screen** — toggle the video frame size

The operator's video appears in the corner of the frame, outlined in yellow to indicate an active connection.

### During the call

The operator conducts the verification interview in real time. Depending on the configured workflow, the user may be asked to:

* Present their identity document
* Complete a liveness check
* Answer additional verification questions

All steps take place within the video call frame — no separate screens or redirects.

### Ending the call

Once verification is complete, the operator will typically share the result. Either party can end the call:

1. Click **End**.
2. Confirm in the dialog that appears.

### Multi-user session

Multi-user sessions follow the same flow as one-on-one sessions, with two key differences:

* **Participants can see and hear each other**, in addition to interacting with the operator.
* **Each participant completes their own verification workflow simultaneously** — steps are independent, even within the shared call.


# Operator side

What happens after operator receives the call

## Requirements

To conduct Video KYC sessions, operators must have:

<table data-header-hidden><thead><tr><th width="151.78515625"></th><th width="410.5390625"></th></tr></thead><tbody><tr><td>💻 <strong>Device</strong></td><td>A device with a working camera and microphone</td></tr><tr><td>🌞 <strong>Lighting</strong></td><td>A well-lit environment</td></tr><tr><td>🛜 <strong>Connection</strong></td><td>A stable internet connection</td></tr></tbody></table>

### Receiveing the call

Operators create or schedule sessions through the Manage interface. Once a session is set up, it can be coordinated with the applicant for a specific time or left open for them to join when ready.

When the applicant opens their link and clicks **Join**, the operator receives the incoming call and answers to begin the Video KYC process.

## One-on-one session

### **Video call frame**

Once connected, the operator sees a video call frame displaying both parties. The frame has two control panels.

**Top panel**

<table><thead><tr><th width="200.8671875">Control</th><th width="428.1953125">Function</th></tr></thead><tbody><tr><td><strong>Call duration</strong></td><td>Shows elapsed call time</td></tr><tr><td><strong>Virtual backgrounds</strong></td><td>Apply or adjust a custom background during the call</td></tr><tr><td><strong>Device settings</strong></td><td>Adjust camera, microphone, and speaker</td></tr><tr><td><strong>Full screen</strong></td><td>Expand or minimize the video call frame</td></tr></tbody></table>

> Virtual backgrounds are configured by the company administrator in **Company settings**.

**Bottom panel**

<table><thead><tr><th width="127.8125">Control</th><th>Function</th></tr></thead><tbody><tr><td><strong>Audio</strong></td><td>Mute / unmute microphone</td></tr><tr><td><strong>Video</strong></td><td>Turn camera on / off</td></tr><tr><td><strong>Capture</strong></td><td>Take a live screenshot of the applicant — saved automatically to the session</td></tr><tr><td><strong>Steps</strong></td><td>Select which verification steps the applicant should complete</td></tr><tr><td><strong>Start</strong></td><td>Initiate the selected step on the applicant's screen</td></tr></tbody></table>

Operators can repeat steps as needed. Steps can also be re-initiated if a result needs to be retaken.

### **Completing the session**

Once all steps are finished:

1. Review the applicant's information and verification results.
2. Make a decision to **Approve** or **Reject** the session.

> Decisions should follow your company's verification protocols. The system provides recommendations based on completed checks — including document scans, liveness detection, and any additional steps in the workflow.

***

### Multi-user session

Multi-user sessions follow the same flow as one-on-one sessions, with the following additions:

* Up to **10 participants** can join a single session, depending on your business process configuration.
* The operator sees all participants simultaneously in the video call frame.
* Verification steps can be initiated **per participant individually** — each participant completes their own workflow within the shared call.
* At the end, the operator approves or rejects the consolidated **parent session**, following company protocol.


