> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Статусы верификации: жизненный цикл сессии и коды

> Все статусы сессий Didit: одобрена, отклонена, на проверке, истекла, прервана, KYC истекла. Обработка решений, повторных попыток и webhooks в Didit.

Каждая сессия верификации проходит через последовательность статусов. Понимание этих статусов помогает отслеживать прогресс пользователя, автоматизировать решения по комплаенсу и повышать конверсию.

Этот перечень является единственным источником истины для строк, возвращаемых `GET /v3/session/<id>/decision/` и каждым webhook'ом Didit.

***

## Все значения статусов

> [!NOTE]
>
> Каждый статус представляет собой **точную строку**, которую возвращают API и webhook'и Didit. Всегда используйте строгое сравнение строк (например, `=== "In Review"`) в своём коде: эти значения чувствительны к регистру и содержат пробелы. Значение `Kyc Expired` также написано с одной заглавной буквой `K` (а не `KYC`).

| Статус | Строковое значение | Описание |
| - | - | - |
| Не начата | `"Not Started"` | Сессия создана, пользователь ещё не открыл ссылку |
| В процессе | `"In Progress"` | Пользователь активно проходит верификацию |
| Одобрена | `"Approved"` | Все проверки пройдены, личность подтверждена |
| Отклонена | `"Declined"` | Одна или несколько проверок не пройдены |
| На проверке | `"In Review"` | Помечена для ручной проверки комплаенса |
| Ожидание пользователя | `"Awaiting User"` | Ожидание, пока одна или несколько сторон завершат верификацию (KYB) |
| Отправлена повторно | `"Resubmitted"` | Пользователь попросил повторить определённые шаги |
| Истекла | `"Expired"` | Время сессии истекло до того, как пользователь открыл ссылку |
| Прервана | `"Abandoned"` | Пользователь начал, но не завершил верификацию в срок |
| Истёк KYC | `"Kyc Expired"` | Ранее одобренная сессия, документ которой, прошедший верификацию, утратил силу |

***

## Статусы сессий

> [accordion] Не начата ("Not Started")
>
> **API-значение:** `"Not Started"`
>
> Сессия создана через API, но пользователь **ещё не открыл ссылку на верификацию**.
>
> * **Что делать:** Дождитесь, пока пользователь начнёт верификацию, или отправьте напоминание, если прошло много времени.
> * **Переходит в:** `"In Progress"`, `"Expired"`

> [accordion] В процессе ("In Progress")
>
> **API-значение:** `"In Progress"`
>
> Пользователь открыл ссылку и **активно выполняет шаги верификации** (съёмка документа, проверка живости и т. д.).
>
> * **Что делать:** Действий не требуется: пользователь проходит процесс.
> * **Переходит в:** `"Approved"`, `"Declined"`, `"In Review"`, `"Abandoned"`

> [accordion] Одобрена ("Approved")
>
> **API-значение:** `"Approved"`
>
> Все проверки **успешно пройдены**. Личность пользователя подтверждена.
>
> * **Что делать:** Предоставьте пользователю доступ, обновите его профиль и сохраните данные решения.
> * **Webhook содержит:** Полный объект `decision` со всеми результатами функций.
> * **Переходит в:** `"Kyc Expired"` (когда истекает срок действия подтверждённого документа). Это поведение по умолчанию, если для этой страны и типа документа **Expiration mode** не установлен в **Allow expired**. Проверяющий или эндпоинт обновления статуса также может перевести сессию в `"Declined"` или `"Resubmitted"`.

> [accordion] Отклонена ("Declined")
>
> **API-значение:** `"Declined"`
>
> Одна или несколько проверок **завершились с ошибкой**. Пользователь не прошёл верификацию.
>
> * **Что делать:** Уведомите пользователя. При возможности исправить проблему можно запросить повторную отправку.
> * **Webhook содержит:** Полный объект `decision` с предупреждениями, которые объясняют причину ошибки.
> * **Переходит в:** `"Resubmitted"` (если проверяющий запросит повторную отправку). Проверяющий или эндпоинт обновления статуса также может перевести сессию в `"Approved"`.

> [accordion] На проверке ("In Review")
>
> **API-значение:** `"In Review"`
>
> Автоматические проверки выявили **предупреждения, которые требуют проверки человеком**. Окончательное решение должен принять проверяющий по вопросам комплаенса.
>
> * **Что делать:** Проверяющий должен открыть сессию в Консоли и одобрить, отклонить или запросить повторную отправку.
> * **Webhook содержит:** Полный объект `decision` с предупреждениями.
> * **Переходит в:** `"Approved"`, `"Declined"`, `"Resubmitted"`

> [accordion] Ожидает пользователя ("Awaiting User")
>
> **API-значение:** `"Awaiting User"`
>
> Используется в **KYB-сессиях (верификация бизнеса)**, когда на шаге Key People отправлен список участников и созданы дочерние KYC- и KYB-сессии. Родительская сессия ждёт, пока **все обязательные участники не завершат индивидуальную верификацию**.
>
> * **Что делать:** Следите за статусами дочерних KYC-сессий. Когда все обязательные участники завершат проверку (получили статус «Approved», «Declined» или «Expired»), родительская сессия автоматически пересчитает свой итоговый статус.
> * **Webhook содержит:** Текущий список участников и статусы их дочерних сессий.
> * **Переходит в:** `"Approved"`, `"Declined"`, `"In Review"` (когда все дочерние сессии перешли в терминальный статус)
> * **Переходит из:** `"In Progress"` (после отправки шага Key People)
> * **Примечание:** Если дочерняя KYC-сессия отправлена повторно, родительская сессия возвращается в `"Awaiting User"` до завершения повторно отправленной сессии. Статус `"Declined"` у проверки KYB Registry Check имеет приоритет над `"Awaiting User"`.

> [accordion] Требуется повторная отправка ("Resubmitted")
>
> **API-значение:** `"Resubmitted"`
>
> Проверяющий запросил, чтобы пользователь **повторно выполнил определённые шаги верификации** (например, переснял размытое фото документа).
>
> * **Что делать:** Дождитесь, пока пользователь повторно выполнит эти шаги. Система автоматически выполнит повторную оценку.
> * **Webhook содержит:** Объект `resubmit_info` со списком функций для повторного выполнения и причинами.
> * **Переходит в:** `"Approved"`, `"Declined"`, `"In Review"` или `"Abandoned"`, если срок сессии истекает до того, как пользователь повторно выполнит шаги.

> [accordion] Истекла ("Expired")
>
> **API-значение:** `"Expired"`
>
> Сессия **истекла до того, как пользователь открыл ссылку на верификацию**.
>
> * **Что делать:** Создайте новую сессию и отправьте пользователю новую ссылку.
> * **Терминальный статус:** дальнейших переходов нет.

> [accordion] Прервана ("Abandoned")
>
> **API-значение:** `"Abandoned"`
>
> Пользователь **начал верификацию, но не завершил её** в отведённое время.
>
> * **Что делать:** Отправьте напоминание или создайте новую сессию.
> * **Автоматических переходов нет.** Проверяющий или `PATCH /v3/session/{sessionId}/update-status/` по-прежнему может перевести сессию в `"Approved"`, `"Declined"` или `"Resubmitted"`.

> [accordion] Истёк срок действия KYC ("Kyc Expired")
>
> **API-значение:** `"Kyc Expired"`
>
> Срок действия документа, проверенного в ходе сессии, истёк. Триггером является эта дата, а не период, отсчитываемый от одобрения, и предупреждение заранее не отправляется.
>
> * **Что делать:** Попросите пользователя пройти повторную верификацию в новой сессии. `status.updated` передаёт этот переход, а результат верификации личности содержит предупреждение `DOCUMENT_EXPIRED`.
> * **Управляется:** **Expiration mode** для этой страны и типа документа в *ID verification → Additional settings by country & document type*. **Reject expired** (по умолчанию) отслеживает документ, а **Allow expired** означает, что сессия никогда сюда не переходит.
> * **Автоматических переходов нет.** Проверяющий или `PATCH /v3/session/{sessionId}/update-status/` по-прежнему может перевести сессию в `"Approved"`, `"Declined"` или `"Resubmitted"`.

***

## Переходы статусов

| Откуда | Куда | Триггер |
| - | - | - |
| `"Not Started"` | `"In Progress"` | Пользователь открывает ссылку на верификацию |
| `"Not Started"` | `"Expired"` | Истекает TTL сессии до того, как пользователь открывает ссылку |
| `"In Progress"` | `"Approved"` | Все автоматические проверки пройдены |
| `"In Progress"` | `"Declined"` | Одна или несколько проверок не пройдены |
| `"In Progress"` | `"In Review"` | Проверки выдали предупреждения, требующие ручной проверки |
| `"In Progress"` | `"Awaiting User"` | Отправлен шаг KYB «Ключевые лица»; родительская сессия ждёт дочерние стороны KYC |
| `"In Progress"` | `"Abandoned"` | Пользователь не завершил верификацию в отведённое время |
| `"Awaiting User"` | `"Approved"` | Все обязательные стороны KYB завершили верификацию, и агрегированные проверки пройдены |
| `"Awaiting User"` | `"Declined"` | Обязательная сторона отклонена или проверка по реестру KYB не пройдена |
| `"Awaiting User"` | `"In Review"` | Агрегированный результат KYB требует ручной проверки |
| `"In Review"` | `"Approved"` | Проверяющий вручную одобряет верификацию |
| `"In Review"` | `"Declined"` | Проверяющий вручную отклоняет верификацию |
| `"In Review"` | `"Resubmitted"` | Проверяющий запрашивает повторное прохождение определённых шагов |
| `"Declined"` | `"Resubmitted"` | Проверяющий запрашивает повторное прохождение определённых шагов |
| `"Approved"` | `"Resubmitted"` | Проверяющий запрашивает повторное прохождение определённых шагов |
| `"Approved"` | `"Declined"` | Проверяющий или API устанавливает другое решение |
| `"Declined"` | `"Approved"` | Проверяющий или API устанавливает другое решение |
| `"Abandoned"`, `"Kyc Expired"` | `"Approved"`, `"Declined"`, `"Resubmitted"` | Проверяющий или API принимает решение по сессии, которая завершилась без решения |
| `"Resubmitted"` | `"Abandoned"` | Окно сессии истекает до того, как пользователь повторно пройдёт шаги |
| `"Resubmitted"` | `"Approved"` | Повторно отправленные шаги проходят все проверки |
| `"Resubmitted"` | `"Declined"` | Повторно отправленные шаги не проходят проверки |
| `"Resubmitted"` | `"In Review"` | Повторно отправленные шаги выдают новые предупреждения |
| `"Resubmitted"` (дочерняя KYB) | `"Awaiting User"` (родительская KYB) | Родительская сессия возвращается в состояние ожидания, пока дочерняя сессия не завершится |
| `"Approved"` | `"Kyc Expired"` | Срок действия проверенного документа истекает (режим истечения срока: **Reject expired**) |

### Диаграмма жизненного цикла

```mermaid theme={null}
flowchart LR
    NS["Not Started"] --> IP["In Progress"]
    NS --> EX["Expired"]
    IP --> AP["Approved"]
    IP --> DC["Declined"]
    IP --> IR["In Review"]
    IP --> AU["Awaiting User<br/>(KYB only)"]
    IP --> AB["Abandoned"]
    AU --> AP
    AU --> DC
    AU --> IR
    IR --> AP
    IR --> DC
    IR --> RS["Resubmitted"]
    DC --> RS
    AP --> RS
    AP <--> DC
    AB --> AP
    AB --> DC
    AB --> RS
    KE --> AP
    KE --> DC
    KE --> RS
    RS --> AB
    RS --> AP
    RS --> DC
    RS --> IR
    AP --> KE["Kyc Expired"]
```

***

## Терминальные и нетерминальные статусы

| Категория | Статусы | Значение |
| - | - | - |
| **Решённые** | `"Approved"`, `"Declined"`, `"Kyc Expired"` | Проверки вынесли решение, и оно не меняется само по себе, за исключением перехода `"Approved"` → `"Kyc Expired"`, когда срок действия проверенного документа истекает. Проверяющий или endpoint обновления статуса по-прежнему может изменить решение. |
| **Нетерминальные** | `"Not Started"`, `"In Progress"`, `"Resubmitted"`, `"Awaiting User"` | Сессия активна: ожидает действий пользователя, дочерних сессий или обработки. |
| **Требующие действий** | `"In Review"` | Требует ручного вмешательства вашей команды. |
| **Неактивные** | `"Expired"`, `"Abandoned"` | Сессии завершились без решения по верификации. Статус `"Expired"` не меняется; проверяющий по-прежнему может принять решение по сессии `"Abandoned"`. |

***

## Обработка статусов в вашем коде

Используйте webhook или [API получения сессии](https://docs.didit.me/ru/sessions-api/retrieve-session.md), чтобы реагировать на изменения статусов.

> [!WARNING]
>
> Статусы — это **точные строки с учётом регистра и пробелами**. Например, `"In Review"` (а не `"in_review"` или `"IN_REVIEW"`). При сравнении всегда используйте строгое равенство (`===`).

```javascript theme={null}
// All ten possible status string values (StatusChoices, source of truth):
// "Not Started"  | "In Progress" | "Approved"     | "Declined" |
// "In Review"    | "Resubmitted" | "Awaiting User"|
// "Expired"      | "Abandoned"   | "Kyc Expired"

async function handleWebhook(webhook) {
  const { status, vendor_data: vendorData } = webhook;

  switch (status) {
    case "Not Started":
      // Session created but user hasn't opened the link yet
      break;

    case "In Progress":
      // User is actively completing verification steps
      break;

    case "Approved":
      // All checks passed — grant access
      await db.users.update(vendorData, {
        verified: true,
        verifiedAt: new Date(),
        decision: webhook.decision,
      });
      break;

    case "Declined":
      // Verification failed — notify user
      await db.users.update(vendorData, {
        verificationStatus: "declined",
        declineReasons: webhook.decision?.warnings,
      });
      break;

    case "In Review":
      // Needs manual review by compliance team
      await db.users.update(vendorData, {
        verificationStatus: "pending_review",
      });
      break;

    case "Awaiting User":
      // KYB parent waiting for all child KYC parties to finish
      await db.users.update(vendorData, {
        verificationStatus: "awaiting_kyb_parties",
      });
      break;

    case "Resubmitted":
      // User will redo specific steps
      await db.users.update(vendorData, {
        verificationStatus: "resubmission_pending",
        resubmitInfo: webhook.resubmit_info,
      });
      break;

    case "Abandoned":
      // User started but didn't finish — send reminder
      await sendReminderEmail(vendorData);
      break;

    case "Expired":
    case "Kyc Expired":
      // Session expired — create a new one
      await createNewSession(vendorData);
      break;
  }
}
```

***

## Повторная отправка

Статус **Resubmitted** позволяет вашей команде комплаенса дать пользователям вторую попытку без создания новой сессии.

**1. Проверяющий инициирует повторную отправку**

В консоли откройте сессию в статусе `In Review` или `Declined` и нажмите **Запросить повторную отправку**. Выберите шаги, которые нужно пройти заново.

**2. Предыдущие данные архивируются**

Система сбрасывает выбранные функции и помечает прежние данные как `previous_attempt`, сохраняя полный журнал аудита.

**3. Пользователь получает уведомление**

Если доступен email, пользователь получает локализованное письмо с прямой ссылкой для продолжения.

**4. Пользователь повторяет определённые шаги**

Пользователь повторяет только помеченные шаги, а не всю верификацию.

**5. Система проводит повторную оценку**

По завершении сессия автоматически переходит в статус `"Approved"`, `"Declined"` или `"In Review"`.

### Payload webhook повторной отправки

```json theme={null}
{
  "session_id": "uuid-of-the-session",
  "status": "Resubmitted",
  "resubmit_info": {
    "nodes_to_resubmit": [
      { "node_id": "feature_ocr", "feature": "OCR" },
      { "node_id": "feature_liveness", "feature": "LIVENESS" }
    ],
    "reasons": {
      "feature_ocr": "DOCUMENT_EXPIRED",
      "feature_liveness": "LOW_LIVENESS_SCORE"
    }
  }
}
```

`reasons` сопоставляет каждый повторно отправленный `node_id` с кодом предупреждения наиболее релевантного лога по этому шагу (те же коды, что возвращает [решение](https://docs.didit.me/ru/reference/data-models.md)), чтобы вы могли сопоставить его с собственной формулировкой. Этот же код экран повторной отправки размещённого сценария и письмо о повторной отправке локализуют для пользователя, за исключением предупреждений, которые раскрыли бы сигнал скрининга или мошенничества (дубликаты, AML, список блокировки, проверки между организациями, достоверность местоположения и подобные). В этих случаях пользователь видит обобщённую причину, а `resubmit_info.reasons` в вашем webhook всегда содержит реальный код. Для шага, по которому не зафиксировано предупреждение, записи нет.

### Какие функции можно повторно отправить?

Любую функцию с неодобренным статусом: **Declined**, **In Review**, **Not Finished**, **Not Started** или **Expired**.

> [!TIP]
>
> Повторную отправку можно запрашивать несколько раз для одной и той же сессии. Каждый цикл архивирует данные предыдущей попытки, что даёт полную картину истории верификации пользователя.

***

## Лучшие практики

> [card] Следите за статусом «На проверке»
>
> Настройте оповещения (по электронной почте или в Slack) в вашей консоли Didit, чтобы получать уведомление, когда сессии требуют ручной проверки.

> [card] Предпочитайте повторную отправку
>
> Если проблему можно исправить (размытое фото, неверная сторона документа), запросите повторную отправку вместо отклонения. Это повышает конверсию.

> [card] Отслеживайте отток
>
> Высокая доля прерванных и истекших сессий может указывать на трудности в UX. Рассмотрите возможность изменить TTL сессии или улучшить подсказки для пользователя.

> [card] Идемпотентные обработчики
>
> webhook-вызовы могут повторяться. Используйте `session_id` в качестве уникального ключа, чтобы обрабатывать каждое изменение статуса только один раз.

> [!WARNING]
>
> Всегда проверяйте подписи webhook перед обработкой payload. Didit поддерживает три метода: `X-Signature`, `X-Signature-V2` (рекомендуемый) и устаревший `X-Signature-Simple`, который аутентифицирует только конверт и никогда не аутентифицирует тело `decision`. Подробности см. в разделе [Webhooks](https://docs.didit.me/ru/integration/webhooks.md#проверка-подписи).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.