# Методы API Lite

{% hint style="info" %}
Начиная с версии 1.1.0, Oz API Lite может принимать изображения и шаблоны в формате base64, а также возвращать в этом формате шаблоны биометрических проверок. Для включения этой опции необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

### **version – проверка версии компонентов**

С помощью этого метода можно узнать, какие версии компонентов используются (начиная с версии 1.1.1).

Call `GET /version`&#x20;

**Входные параметры**

\-

#### **Пример запроса**

`GET localhost/version`

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает сообщение со следующими параметрами.&#x20;

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип**   | **Описание**                                                                                |
| -------------------------- | --------- | ------------------------------------------------------------------------------------------- |
| core                       | String    | Версия API Lite.                                                                            |
| tfss                       | String    | Версия TFSS.                                                                                |
| models                     | \[String] | Массив версий моделей, где каждая запись содержит информацию о названии модели и ее версии. |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{
2	"core": "core_version",
3	"tfss": "tfss_version",
4	"models": [
5		{
6			"name": "model_name",
7			"version": "model_version"
8		}
9	]
10}
```

## Биометрия

### **health – проверка состояния биометрического процессора biometry**

С помощью этого метода можно проверить, корректно ли работает процессор.

Вызов метода: `GET /v1/face/pattern/health`

**Входные параметры**

\-

#### **Пример запроса**

`GET localhost/v1/face/pattern/health`

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает сообщение со следующими параметрами.&#x20;

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                 |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| status                     | Int     | <p>0 – биометрический процессор работает корректно.</p><p>3 – биометрический процессор неработоспособен.</p> |
| message                    | String  | Сообщение.                                                                                                   |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{“status”: 0, message: “”}
```

### **extract – извлечение биометрического шаблона**

Метод предназначен для извлечения биометрического шаблона из изображения.\
Тип контента HTTP-запроса: “image/jpeg” или “image/png”

Вызов метода: `POST /v1/face/pattern/extract`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                 |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Не указывается\*           | Stream  | <p>Обязательный параметр. Изображение для извлечения биометрического шаблона.<br><br>В заголовочном поле “Content-Type” должен быть указан тип контента.</p> |

<details>

<summary>*</summary>

Для параметров типа Stream имя указывать не нужно.

</details>

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/extract
Content-Type: image/jpeg
{Поток байт изображения}
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает биометрический шаблон.

Тип контента HTTP-ответа: “application/octet-stream”.

{% hint style="info" %}
Если в headers запроса передавалось поле Content-Transfer-Encoding со значением base64, то шаблон тоже вернется в base64.
{% endhint %}

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                     |
| -------------------------- | ------- | ------------------------------------------------ |
| Не указывается\*           | Stream  | Биометрический шаблон, полученный из изображения |

<details>

<summary>*</summary>

Для параметров типа Stream имя указывать не нужно.

</details>

#### **Пример ответа**

```json
200 OK
Content-Type: application/octet-stream
{Поток байт биометрического шаблона}
```

### **compare – сравнение биометрических шаблонов**

Метод предназначен для сравнения двух биометрических шаблонов.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/compare`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                   |
| -------------------------- | ------- | -------------------------------------------------------------- |
| bio\_feature               | Stream  | <p>Обязательный параметр.<br>Первый биометрический шаблон.</p> |
| bio\_template              | Stream  | <p>Обязательный параметр.<br>Второй биометрический шаблон.</p> |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/compare
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”bio_feature”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”bio_template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результат сравнения двух шаблонов.

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| score                      | Float   | Результат сравнения двух шаблонов                                                                                                                                                                                                                          |
| decision                   | String  | <p>Рекомендуемое решение по полученному score.<br></p><p>approved – положительный результат. Лица совпадают.<br></p><p>operator\_required – требуется дополнительная проверка оператора.<br></p><p>declined – негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}
```

### **verify – биометрическая верификация**

Метод объединяет два описанных выше метода **extract** и **compare** – извлекает биометрический шаблон из изображения и сравнивает его с другим биометрическим шаблоном, который также передается в запросе.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/verify`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                              |
| -------------------------- | ------- | ----------------------------------------------------------------------------------------- |
| sample                     | Stream  | <p>Обязательный параметр.<br>Изображение для извлечения биометрического шаблона.</p>      |
| bio\_template              | Stream  | <p>Обязательный параметр.<br>Биометрический шаблон, с которым производится сравнение.</p> |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/verify
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”bio_template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”sample”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результат сравнения двух биометрических шаблонов.

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| score                      | Float   | Результат сравнения двух шаблонов                                                                                                                                                                                                                          |
| decision                   | String  | <p>Рекомендуемое решение по полученному score.<br></p><p>approved – положительный результат. Лица совпадают.<br></p><p>operator\_required – требуется дополнительная проверка оператора.<br></p><p>declined – негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}
```

### **extract\_and\_compare – извлечение из двух изображений и сравнение полученных шаблонов**

Метод объединяет два описанных выше метода **extract** и **compare**. Он извлекает биометрические шаблоны из двух изображений, сравнивает их и в качестве ответа передает результат сравнения.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/extract_and_compare`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                         |
| -------------------------- | ------- | ---------------------------------------------------- |
| sample\_1                  | Stream  | <p>Обязательный параметр.<br>Первое изображение.</p> |
| sample\_2                  | Stream  | <p>Обязательный параметр.<br>Второе изображение</p>  |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/extract_and_compare
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”sample_2”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результат сравнения двух извлеченных биометрических шаблонов.

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| score                      | Float   | Результат сравнения двух извлеченных шаблонов                                                                                                                                                                                                              |
| decision                   | String  | <p>Рекомендуемое решение по полученному score.<br></p><p>approved – положительный результат. Лица совпадают.<br></p><p>operator\_required – требуется дополнительная проверка оператора.<br></p><p>declined – негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}
```

### **compare\_n – сравнение биометрических шаблонов 1:N**

Метод предназначен для сравнения биометрических шаблонов в режиме 1:N.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/compare_n`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                                           |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| template\_1                | Stream  | <p>Обязательный параметр.<br></p><p>Биометрический шаблон – кандидат(1).</p>                                                                                                                                                                           |
| templates\_n               | Stream  | <p>Обязательный параметр.<br></p><p>Список(N) биометрических шаблонов. Каждый биометрический шаблон должен быть передан отдельно, но необходимо чтобы имя параметра было templates\_n. Также требуется, чтобы в заголовке был передан filename.   </p> |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/compare_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”template_1”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”1.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”2.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”3.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип**     | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| results                    | List\[JSON] | Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:                                                                                                                                   |
| \*filename                 | String      | Значение filename в заголовке соответствующего шаблона из списка(N).                                                                                                                                                                                       |
| \*score                    | Float       | Результат сравнения кандидата с соответствующим шаблоном из списка(N).                                                                                                                                                                                     |
| \*decision                 | String      | <p>Рекомендуемое решение по полученному score.<br></p><p>approved - положительный результат. Лица совпадают.<br></p><p>operator\_required - требуется дополнительная проверка оператора.<br></p><p>declined - негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.template', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.template', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.template', 'score': 0.21, 'decision': 'declined'}
]}
```

### **verify\_n – биометрическая верификация 1:N**

Метод объединяет два описанных выше метода **extract** и **compare\_n**. Метод извлекает биометрический шаблон из изображения и сравнивает его cо списком биометрических шаблонов, которые также передаются в запросе.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/verify_n`&#x20;

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                                           |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| sample\_1                  | Stream  | <p>Обязательный параметр.<br></p><p>Изображение - кандидат(1).</p>                                                                                                                                                                                     |
| templates\_n               | Stream  | <p>Обязательный параметр.<br></p><p>Список(N) биометрических шаблонов. Каждый биометрический шаблон должен быть передан отдельно, но необходимо чтобы имя параметра было templates\_n. Также требуется, чтобы в заголовке был передан filename.   </p> |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/verify_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”1.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”2.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”3.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип**     | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| results                    | List\[JSON] | Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:                                                                                                                                   |
| \*filename                 | String      | Значение filename в заголовке соответствующего шаблона из списка(N).                                                                                                                                                                                       |
| \*score                    | Float       | Результат сравнения кандидата с соответствующим шаблоном из списка(N).                                                                                                                                                                                     |
| \*decision                 | String      | <p>Рекомендуемое решение по полученному score.<br></p><p>approved - положительный результат. Лица совпадают.<br></p><p>operator\_required - требуется дополнительная проверка оператора.<br></p><p>declined - негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.template', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.template', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.template', 'score': 0.21, 'decision': 'declined'}
]}
```

### **extract\_and\_compare\_n – извлечение и сравнение полученных шаблонов 1:N**

Метод объединяет два описанных выше метода **extract** и **compare\_n**. Он извлекает биометрические шаблоны из изображения-кандидата и изображений из списка, а затем сравнивает их в режиме 1:N.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: `POST /v1/face/pattern/extract_and_compare_n`

#### **Входные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                                                                                                                                    |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sample\_1                  | Stream  | <p>Обязательный параметр.<br></p><p>Изображение – кандидат(1).</p>                                                                                                                                                              |
| samples\_n                 | Stream  | <p>Обязательный параметр.<br></p><p>Список(N) изображений. Каждое изображение должно быть передано отдельно, но необходимо чтобы имя параметра было samples\_n. Также требуется, чтобы в заголовке был передан filename.   </p> |

{% hint style="info" %}
Для передачи данных в base64 необходимо в headers запроса передать `Content-Transfer-Encoding = base64`.
{% endhint %}

#### **Пример запроса**

```json
POST localhost/v1/face/pattern/extract_and_compare_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”1.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”2.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”3.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
```

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип**     | **Описание**                                                                                                                                                                                                                                               |
| -------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| results                    | List\[JSON] | Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:                                                                                                                                   |
| \*filename                 | String      | Значение filename в заголовке соответствующего изображения из списка(N).                                                                                                                                                                                   |
| \*score                    | Float       | Результат сравнения кандидата с соответствующим изображением из списка(N).                                                                                                                                                                                 |
| \*decision                 | String      | <p>Рекомендуемое решение по полученному score.<br></p><p>approved – положительный результат. Лица совпадают.<br></p><p>operator\_required – требуется дополнительная проверка оператора.<br></p><p>declined – негативный результат. Лица не совпадают.</p> |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.jpeg', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.jpeg', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.jpeg', 'score': 0.21, 'decision': 'declined'}
]}
```

### **Ошибки методов**

Тип контента HTTP-ответа: “application/json”.

| **Коды ответов HTTP** | **Значение параметра “code”** | **Описание**                                               |
| --------------------- | ----------------------------- | ---------------------------------------------------------- |
| 400                   | BPE-002001                    | Неверный Content-Type HTTP-запроса                         |
| 400                   | BPE-002002                    | Неверный метод HTTP-запроса                                |
| 400                   | BPE-002003                    | Не удалось прочитать \*биометрический образец              |
| 400                   | BPE-002004                    | Не удалось прочитать биометрический шаблон                 |
| 400                   | BPE-002005                    | Неверный Content-Type части multiparted HTTPзапроса        |
| 400                   | BPE-003001                    | Не удалось извлечь биометрический шаблон                   |
| 400                   | BPE-003002                    | На биометрическом образце\* отсутствует лицо               |
| 400                   | BPE-003003                    | На биометрическом образце\* присутствует более одного лица |
| 500                   | BPE-001001                    | Внутренняя ошибка биопроцессора                            |
| 400                   | BPE-001002                    | Ошибка TFSS. Необходимо вызвать метод biometry health.     |

<details>

<summary>*</summary>

Биометрический образец – входное изображение.

</details>

## Liveness

### health – п**роверка состояния биометрического процессора liveness**

Вызов метода: `GET /v1/face/liveness/health`

Входные параметры отсутствуют.

#### **Пример запроса**

`GET localhost/v1/face/liveness/health`

#### **Успешный ответ метода**

В случае успешного ответа метод возвращает сообщение со следующими параметрами.&#x20;

Тип контента HTTP-ответа: “application/json”.

#### **Выходные параметры**

| **Наименование параметра** | **Тип** | **Описание**                                                                                                 |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| status                     | Int     | <p>0 - биометрический процессор работает корректно.</p><p>3 - биометрический процессор неработоспособен.</p> |
| message                    | String  | Сообщение.                                                                                                   |

#### **Пример ответа**

```json
200 OK
Content-Type: application/json
{“status”: 0, message: “”}
```

### **detect – о**бнаружение презентационных атак

Метод `detect` предназначен для обнаружения презентационных атак. Он ищет лицо на каждом изображении или видео (с версии 1.2.0), отправляет найденные лица на анализ и возвращает результат.&#x20;

Поддерживаются следующие Content-Type:

* `image/jpeg` или `image/png` для изображения;
* `multipart/form-data` для изображений, видео или архивов. Для добавления дополнительных параметров, влияющих на анализ, используйте `payload`.

Запуск метода:`POST /{version}/face/liveness/detect`.

#### Изображение

Принимает изображение в формате JPEG или PNG; без `payload`.

<details>

<summary>Пример запроса</summary>

```json
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Type: image/jpeg
Content-Length: [длина тела сообщения]
[поток байт изображения]
```

</details>

<details>

<summary>Пример успешного ответа</summary>

```json
HTTP/1.1 200 OK
Content-Type: application/json
{
  "passed": false,
  "score": 0.999484062
}
```

</details>

#### Multipart/form-data <a href="#multipart-form-data" id="multipart-form-data"></a>

Принимает запрос multipart/form-data.

* Название каждого медиафайла должно быть уникальным, например, `media_key1`, `media_key2`.
* Параметры `payload` должны быть в виде JSON, помещенного в поле `payload`.

{% hint style="info" %}
Временные идентификаторы будут удалены после выполнения запроса.
{% endhint %}

<details>

<summary>Пример запроса</summary>

```json
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Length: [длина тела сообщения]
Content-Type: multipart/form-data; boundary=--BOUNDARY--

--BOUNDARY--
Content-Disposition: form-data; name="media_key1"; filename="video.mp4"
Content-Type: multipart/form-data; 

[поток байт медиафайла]
--BOUNDARY--
Content-Disposition: form-data; name="payload"

    {
        "folder:meta_data": {
            "partner_side_folder_id": "partner_side_folder_id_if_needed",
            "person_info": {
                "first_name": "John",
                "middle_name": "Jameson",
                "last_name": "Doe"
            }
        },
        "resolution_endpoint": "https://www.your-custom-endpoint.com",
        "media:meta_data": {
            "media_key1": {
                "foo": "bar2"
            }
        },
        "media:tags": {
            "media_key1": [
                "video_selfie",
                "video_selfie_blank"
            ]
        },
        "analyses": [
          {
            "type": "quality",
            "meta_data": {
              "example1": "some_example1"
            },
            "params": {
                "threshold_spoofing": 0.6,
                "extract_best_shot": false
            }
          }
]
    }
--BOUNDARY--
```

</details>

<details>

<summary>Пример успешного ответа</summary>

```json
{
    "company_id": null,
    "time_created": 1720180784.769608,
    "folder_id": "folder_id", // временный ID
    "user_id": null,
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "resolution_status": "FINISHED",
    "resolution_comment": "[]",
    "system_resolution": "SUCCESS",
    "resolution_time": null,
    "resolution_author_id": null,
    "resolution_state_hash": null,
    "operator_comment": null,
    "operator_status": null,
    "is_cleared": null,
    "meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }
    },
    "technical_meta_data": {},
    "time_updated": 1720180787.531983,
    "media": [
        {
            "folder_id": "folder_id", // временный ID
            "media_id": "video_id", // временный ID
            "media_type": "VIDEO_FOLDER",
            "info": {
                "thumb": null,
                "video": {
                    "duration": 3.76,
                    "FPS": 22.83,
                    "width": 960,
                    "height": 720,
                    "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                    "size": 6017119,
                    "mime-type": "video/mp4"
                }
            },
            "tags": [
                "video_selfie",
                "video_selfie_blank",
                "orientation_portrait"
            ],
            "original_name": "video-5mb.mp4",
            "original_url": null,
            "company_id": null,
            "technical_meta_data": {},
            "time_created": 1719573752.78253,
            "time_updated": 1720180787.531801,
            "meta_data": {
                "foo4": "bar5"
            },
            "thumb_url": null,
            "folder_time_created": null,
            "video_id": "video_id", // временный ID
            "video_url": null
        }
    ],
    "analyses": [
        {
            "analyse_id": null,
            "analysis_id": null,
            "folder_id": "folder_id", // временный ID
            "folder_time_created": null,
            "type": "QUALITY",
            "state": "FINISHED",
            "company_id": null,
            "group_id": null,
            "results_data": null,
            "confs": {
                "threshold_replay": 0.5,
                "extract_best_shot": false,
                "threshold_liveness": 0.5,
                "threshold_spoofing": 0.42
            },
            "error_message": null,
            "error_code": null,
            "resolution_operator": null,
            "technical_meta_data": {},
            "time_created": 1720180784.769944,
            "time_updated": 1720180787.531877,
            "meta_data": {
                "some_key": "some_value"
            },
            "source_media": [
                {
                    "folder_id": "folder_id", // временный ID
                    "media_id": "video_id", // временный ID
                    "media_type": "VIDEO_FOLDER",
                    "info": {
                        "thumb": null,
                        "video": {
                            "duration": 3.76,
                            "FPS": 22.83,
                            "width": 960,
                            "height": 720,
                            "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                            "size": 6017119,
                            "mime-type": "video/mp4"
                        }
                    },
                    "tags": [
                        "video_selfie",
                        "video_selfie_blank",
                        "orientation_portrait"
                    ],
                    "original_name": "video-5mb.mp4",
                    "original_url": null,
                    "company_id": null,
                    "technical_meta_data": {},
                    "time_created": 1719573752.78253,
                    "time_updated": 1720180787.531801,
                    "meta_data": {
                        "foo4": "bar5"
                    },
                    "thumb_url": null,
                    "folder_time_created": null,
                    "video_id": "video_id", // временный ID
                    "video_url": null
                }
            ],
            "results_media": [
                {
                    "company_id": null,
                    "media_association_id": "video_id", // временный ID
                    "analysis_id": null,
                    "results_data": {
                        "confidence_spoofing": 0.000541269779
                    },
                    "source_media_id": "video_id", // временный ID
                    "output_images": [],
                    "collection_persons": [],
                    "folder_time_created": null
                }
            ],
            "resolution_status": "SUCCESS",
            "resolution": "SUCCESS"
        }
    ]
}
```

</details>

#### Multipart/form-data с Best Shot <a href="#multipart-form-data-with-best-shot" id="multipart-form-data-with-best-shot"></a>

Для извлечения лучшего кадра укажите в блоке `analyses` в `payload` `extract_best_shot` = `true` (как в примере запроса ниже). В таком случае API Lite после анализа ваших медиафайлов вернет в ответе лучший кадр – изображение в base64 будет в `analysis->output_images->image_b64`. Лучший кадр можно извлекать только из видео или архивов.

Также в блоке `analyses` вы можете изменить порог для прохождения Liveness в параметре `threshold_spoofing`: если итоговая оценка выше значения этого параметра, результат анализа будет DECLINED, в ином случае проверка Liveness будет считаться пройденной.

<details>

<summary>Пример запроса</summary>

```json
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Length: [длина тела сообщения]
Content-Type: multipart/form-data; boundary=--BOUNDARY--

--BOUNDARY--
Content-Disposition: form-data; name="media_key1"; filename="video.mp4"
Content-Type: multipart/form-data; 

[поток байт медиафайла]
--BOUNDARY--
Content-Disposition: form-data; name="payload"

    {
        "folder:meta_data": {
            "partner_side_folder_id": "partner_side_folder_id_if_needed",
            "person_info": {
                "first_name": "John",
                "middle_name": "Jameson",
                "last_name": "Doe"
            }
        },
        "resolution_endpoint": "https://www.your-custom-endpoint.com",
        "media:meta_data": {
            "media_key1": {
                "foo": "bar2"
            }
        },
        "media:tags": {
            "media_key1": [
                "video_selfie",
                "video_selfie_blank"
            ]
        },
        "analyses": [
          {
            "type": "quality",
            "meta_data": {
              "example1": "some_example1"
            },
            "params": {
                "threshold_spoofing": 0.6,
                "extract_best_shot": true
            }
          }
]
    }
--BOUNDARY--
```

</details>

<details>

<summary>Пример успешного ответа</summary>

```json
{
    "company_id": null,
    "time_created": 1720177371.120899,
    "folder_id": "folder_id", // временный ID
    "user_id": null,
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "resolution_status": "FINISHED",
    "resolution_comment": "[]",
    "system_resolution": "SUCCESS",
    "resolution_time": null,
    "resolution_author_id": null,
    "resolution_state_hash": null,
    "operator_comment": null,
    "operator_status": null,
    "is_cleared": null,
    "meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }
    },
    "technical_meta_data": {},
    "time_updated": 1720177375.531137,
    "media": [
        {
            "folder_id": "folder_id", // временный ID
            "media_id": "media_id", // временный ID
            "media_type": "VIDEO_FOLDER",
            "info": {
                "thumb": null,
                "video": {
                    "duration": 3.76,
                    "FPS": 22.83,
                    "width": 960,
                    "height": 720,
                    "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                    "size": 6017119,
                    "mime-type": "video/mp4"
                }
            },
            "tags": [
                "video_selfie",
                "video_selfie_blank",
                "orientation_portrait"
            ],
            "original_name": "video-5mb.mp4",
            "original_url": null,
            "company_id": null,
            "technical_meta_data": {},
            "time_created": 1719573752.781861,
            "time_updated": 1720177373.772401,
            "meta_data": {
                "foo4": "bar5"
            },
            "thumb_url": null,
            "folder_time_created": null,
            "video_id": "media_id", // временный ID
            "video_url": null
        }
    ],
    "analyses": [
        {
            "analyse_id": null,
            "analysis_id": null,
            "folder_id": "folder_id", // временный ID
            "folder_time_created": null,
            "type": "QUALITY",
            "state": "FINISHED",
            "company_id": null,
            "group_id": null,
            "results_data": null,
            "confs": {
                "threshold_replay": 0.5,
                "extract_best_shot": true,
                "threshold_liveness": 0.5,
                "threshold_spoofing": 0.42
            },
            "error_message": null,
            "error_code": null,
            "resolution_operator": null,
            "technical_meta_data": {},
            "time_created": 1720177371.121241,
            "time_updated": 1720177375.531043,
            "meta_data": {
                "some_key": "some_value"
            },
            "source_media": [
                {
                    "folder_id": "folder_id", // временный ID
                    "media_id": "media_id", // временный ID
                    "media_type": "VIDEO_FOLDER",
                    "info": {
                        "thumb": null,
                        "video": {
                            "duration": 3.76,
                            "FPS": 22.83,
                            "width": 960,
                            "height": 720,
                            "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                            "size": 6017119,
                            "mime-type": "video/mp4"
                        }
                    },
                    "tags": [
                        "video_selfie",
                        "video_selfie_blank",
                        "orientation_portrait"
                    ],
                    "original_name": "video-5mb.mp4",
                    "original_url": null,
                    "company_id": null,
                    "technical_meta_data": {},
                    "time_created": 1719573752.781861,
                    "time_updated": 1720177373.772401,
                    "meta_data": {
                        "foo4": "bar5"
                    },
                    "thumb_url": null,
                    "folder_time_created": null,
                    "video_id": "media_id", // временный ID
                    "video_url": null
                }
            ],
            "results_media": [
                {
                    "company_id": null,
                    "media_association_id": "media_id", // временный ID
                    "analysis_id": null,
                    "results_data": {
                        "confidence_spoofing": 0.000541269779
                    },
                    "source_media_id": "media_id", // temporary ID
                    "output_images": [
                        {
                            "folder_id": "folder_id", // временный ID
                            "media_id": "media_id", // временный ID
                            "media_type": "IMAGE_RESULT_ANALYSIS_SINGLE",
                            "info": {
                                "thumb": null,
                                "original": {
                                    "md5": "e6effeceb94e79b8cb204c6652283b57",
                                    "width": 720,
                                    "height": 960,
                                    "size": 145178,
                                    "mime-type": "image/jpeg"
                                }
                            },
                            "tags": [],
                            "original_name": "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=720x960 at 0x766811DF8E90>",
                            "original_url": null,
                            "company_id": null,
                            "technical_meta_data": {},
                            "time_created": 1719573752.781861,
                            "time_updated": 1719573752.781871,
                            "meta_data": null,
                            "folder_time_created": null,
                            "image_b64": "",
                            "media_association_id": "media_id" // временный ID
                        }
                    ],
                    "collection_persons": [],
                    "folder_time_created": null
                }
            ],
            "resolution_status": "SUCCESS",
            "resolution": "SUCCESS"
        }
    ]
}
```

</details>

<details>

<summary>Поле <code>payload</code></summary>

```json
{
    "folder:meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }   },
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "media:meta_data": {
        "media_key1": {
            "foo": "bar2",
            "additional_info": "additional_info" // может влиять на оценку
        },
        "media_key2": {
            "foo2": "bar3"
        },
        "media_key3": {
            "foo4": "bar5"
        }
    },
    "media:tags": {
        "media_key1": [
            "video_selfie",
            "video_selfie_blank",
            "orientation_portrait"
        ],
        "media_key2": [
            "photo_selfie"
        ],
        "media_key3": [
            "video_selfie",
            "video_selfie_blank",
            "orientation_portrait"
        ]
    },
"analyses": [
    {
      "type": "quality",
      "meta_data": {
        "some_key": "some_value"
      },
      "params": {
      	"threshold_spoofing": 0.42, // влияет на результат
      	"extract_best_shot":true // вернется лучший кадр
      }
    }
  ]
}
```

</details>

### **Ошибки методов**

Тип контента HTTP-ответа: “application/json”.

| **Коды ответов HTTP** | **Значение параметра “code”** | **Описание**                                           |
| --------------------- | ----------------------------- | ------------------------------------------------------ |
| 400                   | LDE-002001                    | Неверный Content-type HTTP-запроса                     |
| 400                   | LDE-002002                    | Неверный метод HTTP-запроса                            |
| 400                   | LDE-002004                    | Не удалось прочитать биометрический образец\*          |
| 400                   | LDE-002005                    | Неверный Content-Type части multiparted HTTP-запроса   |
| 500                   | LDE-001001                    | Внутренняя ошибка БП обнаружения витальности           |
| 400                   | LDE-001002                    | Ошибка TFSS. Необходимо вызвать метод liveness health. |

<details>

<summary>*</summary>

Биометрический образец – входное изображение.

</details>
