> ## 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.

# JavaScript SDK для верификации личности: веб-KYC

> Didit JavaScript SDK для KYC, KYB, AML и проверки живости. Встраивание или iframe. От $0.33 за полный KYC, $10 бесплатно/мес, без контрактов.



Промпт для интеграции JavaScript SDK
        Скопировать промпт в буфер обмена



      
      

\<pre>

\`Integrate Didit identity verification into my web application using the JavaScript SDK.

\## Setup
Install: npm install @didit-protocol/sdk-web
Or CDN: <script src="https://unpkg.com/@didit-protocol/sdk-web/dist/didit-sdk.umd.min.js"></script>

\## Integration Flow
1\. (Option A — UniLink) Use a fixed UniLink URL from the Didit Console (no backend needed)
2\. (Option B — API session) Backend creates a session via POST /v3/session/ → 201 response includes "url"
3\. Frontend calls DiditSdk.shared.startVerification({ url }) — the SDK opens a modal (or inline if embedded mode)
4\. On completion, the SDK invokes DiditSdk.shared.onComplete(result) with type "completed" | "cancelled" | "failed"
5\. Backend receives full signed decision via webhook (status.updated)

\## Frontend Code — Vanilla JS / TypeScript
import { DiditSdk } from '@didit-protocol/sdk-web';

DiditSdk.shared.onComplete = (result) => {
switch (result.type) {
case 'completed':
  // result.session.status: "Approved" | "Pending" | "Declined"
  console.log('Done:', result.session.sessionId, result.session.status);
  break;
case 'cancelled':
  console.log('User cancelled');
  break;
case 'failed':
  console.error('Failed:', result.error.type, result.error.message);
  break;
}
};

// Modal mode (default)
DiditSdk.shared.startVerification({
url: 'https://verify.didit.me/session/SESSION_TOKEN' // from backend OR UniLink
});

// Inline / embedded mode
DiditSdk.shared.startVerification({
url: 'https://verify.didit.me/session/SESSION_TOKEN',
configuration: { embedded: true, embeddedContainerId: 'didit-container' }
});

\## Frontend Code — React
function VerifyButton({ userId }) {
const [loading, setLoading] = useState(false);

async function handleVerify() {
setLoading(true);
const res = await fetch('/api/create-session', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ user_id: userId })
});
const { url } = await res.json(); // OpenAPI field is named "url"

const { DiditSdk } = await import('@didit-protocol/sdk-web');
DiditSdk.shared.onComplete = (result) => {
  if (result.type === 'completed') {
    // update UI; final, signed result arrives on backend via webhook
  }
  setLoading(false);
};
DiditSdk.shared.startVerification({ url });
}

return <button onClick={handleVerify} disabled={loading}>Verify Identity</button>;
}

\## Backend: Create Session
POST https://verification.didit.me/v3/session/
Headers: { "x-api-key": DIDIT_API_KEY, "Content-Type": "application/json" }
Body: { "workflow_id": DIDIT_WORKFLOW_ID, "callback": "https://myapp.com/done", "vendor_data": userId }
Returns 201 (all 10 fields, per OpenAPI):
\{
"session_id": "uuid",
"session_number": 43762,
"session_token": "3FaJ9wLqX2Mz",   // 12-char URL-safe token; valid until the session expires
"url": "https://verify.didit.me/session/3FaJ9wLqX2Mz",
"vendor_data": "userId",
"metadata": null,
"status": "Not Started",
"workflow_id": "uuid",
"workflow_version": 3,
"callback": "https://myapp.com/done"
}
Pass the "url" field to DiditSdk.shared.startVerification({ url }) — never build the URL by hand.
(If the request sets "language", the URL gains a language segment: https://verify.didit.me/es/session/...)

\## SDK Surface (singleton — DiditSdk.shared)
Methods:  startVerification(options), close(), destroy()
Callbacks: onComplete(result), onStateChange(state, error?), onEvent(event)
State enum: 'idle' | 'loading' | 'ready' | 'error'

\## Rate Limits
600 session-create requests per minute per API key (falls back to bearer token, then client IP), plus a shared budget of 300 write (POST/PATCH/DELETE) requests per minute across all endpoints — the 300/min budget is exhausted first. Exceeding either returns HTTP 429 with Retry-After.

\## Environment Variables
\- DIDIT_API_KEY — backend only (Didit Console > API & Webhooks)
\- DIDIT_WORKFLOW_ID — backend only (Didit Console > Workflows)
\- Never expose the API key on the frontend — the session_token embedded in "url" is the only credential the SDK needs. It grants access to that one session's flow (valid until the session expires), so don't log or share it either.

\## Docs
\- JavaScript SDK: https://docs.didit.me/integration/web-sdks/javascript-sdk
\- Create Session API: https://docs.didit.me/sessions-api/create-session
\- Webhooks: https://docs.didit.me/integration/webhooks`

\</pre>



      
      

Вставьте в

JavaScript SDK от Didit предоставляет программный способ интеграции верификации в ваше веб-приложение с полным контролем над взаимодействием с пользователем.***## Возможности- **Простой API** - паттерн Singleton с удобными методами
- **Гибкая интеграция** - используйте URL UniLink напрямую или создавайте сессии через бэкенд
- **Адаптивность** - работает в десктопных и мобильных браузерах
- **Кастомизация** - параметры конфигурации для стилизации и поведения
- **Несколько форматов** - сборки ESM, CommonJS и UMD
- **Поддержка TypeScript** - полные определения типов в комплекте
- **Модальный и встроенный режимы** - выбор между модальным оверлеем и встроенным отображением
- **Обратные вызовы событий** — события прогресса верификации в реальном времени (начата, шаг завершён, завершена)
- **Управление состоянием** - отслеживайте состояние SDK для создания собственного интерфейса***## Установка### NPM/Yarn```bash theme={null}
npm install @didit-protocol/sdk-web
# or
yarn add @didit-protocol/sdk-web
```### CDN (UMD)```html theme={null}
<script src="https://unpkg.com/@didit-protocol/sdk-web/dist/didit-sdk.umd.min.js"></script>
```> [!NOTE]
>
> Последний опубликованный npm-релиз: `0.5.1`.
> В версии `0.5.0` был добавлен метод `DiditSdk.shared.submitEvent()` (см. раздел [События отправки](#отправка-событий)), а версия `0.5.1` позволяет размещённому сценарию запрашивать удостоверение пользователя у кошелька цифровых удостоверений внутри SDK и сохраняет неудачный запуск в состоянии `error` с соответствующим `errorMessage`.
> В версии `0.4.0` добавлены параметры камеры, которые уже поддерживаются нативными SDK, включая `defaultLivenessCamera`, который открывает захват лица на задней камере (см. раздел [Параметры камеры](#параметры-камеры)).### Проверка установленной версииВаш пакетный менеджер остаётся основным источником информации об установленном релизе:```bash theme={null}
npm list @didit-protocol/sdk-web
npm view @didit-protocol/sdk-web version
```Вы также можете проверить экспорт во время выполнения:```typescript theme={null}
const { SDK_VERSION } = await import('@didit-protocol/sdk-web');

console.log(SDK_VERSION);
```Начиная с версии `0.3.1`, этот экспорт генерируется на основе версии пакета во всех форматах JavaScript (ESM, CommonJS, UMD, минифицированный UMD) и в объявлениях TypeScript, поэтому он всегда соответствует установленному релизу.Версии `0.3.0` и более ранние возвращают `0.2.1` из этого экспорта независимо от установленной версии. В этих релизах используйте `npm list` или файл блокировки.***## Чистый JavaScript### ES-модули / TypeScript```typescript theme={null}
import { DiditSdk } from '@didit-protocol/sdk-web';

// Set up completion callback
DiditSdk.shared.onComplete = (result) => {
  switch (result.type) {
    case 'completed':
      console.log('Verification completed!');
      console.log('Session ID:', result.session?.sessionId);
      console.log('Status:', result.session?.status);
      break;
    case 'cancelled':
      console.log('User cancelled verification');
      break;
    case 'failed':
      console.error('Verification failed:', result.error?.message);
      break;
  }
};

// Start verification with the `url` returned by POST /v3/session/ (or your UniLink)
DiditSdk.shared.startVerification({
  url: 'https://verify.didit.me/session/3FaJ9wLqX2Mz'
});
```### Тег скрипта (UMD)```html theme={null}
<script src="https://unpkg.com/@didit-protocol/sdk-web/dist/didit-sdk.umd.min.js"></script>
<script>
  const { DiditSdk } = DiditSDK;

  DiditSdk.shared.onComplete = (result) => {
    if (result.type === 'completed') {
      alert('Verification completed: ' + result.session.status);
    }
  };

  function startVerification() {
    DiditSdk.shared.startVerification({
      // You can get this link by clicking on "copy link" in the workflows view
      url: 'https://verify.didit.me/u/WORKFLOW_ID_IN_BASE_64'
    });
  }
</script>

<button onclick="startVerification()">Verify Identity</button>
```***## Примеры для фреймворков> [card] [Примеры веб-интеграции SDK](https://github.com/didit-protocol/sdk-web-examples)
>
> React, Angular, Svelte, Next.js, Nuxt, Vue и другие: с примерами и документацией для каждого фреймворка.***## Способы интеграцииСуществует два способа интеграции SDK:### Способ 1: URL UniLink (самый простой)Используйте URL UniLink вашего сценария прямо из Didit Console. Бэкенд не требуется.```typescript theme={null}
DiditSdk.shared.startVerification({
  // You can get this link by clicking on "copy link" in the workflows view
  url: 'https://verify.didit.me/u/WORKFLOW_ID_IN_BASE_64'
});
```Получите ваш URL UniLink в [Didit Console](https://business.didit.me) → Ваш сценарий → Копировать ссылку.**Сгенерированный session\_id будет отправлен вам через событие.**
**[Справочник по событиям доступен здесь](#справочник-событий)**### Способ 2: Сессия на бэкенде (рекомендуется для продакшна)Ваш бэкенд создаёт сессию через Didit API и возвращает URL размещённой страницы верификации. Это даёт контроль над параметрами `vendor_data`, `callback` для конкретной сессии, `metadata` и позволяет создавать сессии до того, как пользователь перейдёт на фронтенд.Подробнее см. в [справочнике по API создания сессии](https://docs.didit.me/ru/sessions-api/create-session.md).**Бэкенд (Node.js / Express)**```javascript theme={null}
import express from 'express';
const app = express();
app.use(express.json());

app.post('/api/create-session', async (req, res) => {
  const response = await fetch('https://verification.didit.me/v3/session/', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.DIDIT_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      workflow_id: process.env.DIDIT_WORKFLOW_ID,
      vendor_data: req.body.userId,             // links the session to your user
      callback: 'https://yourapp.com/verified', // optional — overrides workflow default
    }),
  });

  if (!response.ok) {
    return res.status(response.status).send(await response.text());
  }

  // 201 response fields (per OpenAPI): session_id, session_number, session_token, url,
  // vendor_data, metadata, status, workflow_id, workflow_version, callback
  const session = await response.json();
  res.json({ session_id: session.session_id, url: session.url });
});
```**Фронтенд**```typescript theme={null}
import { DiditSdk } from '@didit-protocol/sdk-web';

const res = await fetch('/api/create-session', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ userId: 'user-123' }),
});
const { url } = await res.json();

DiditSdk.shared.startVerification({
  url,
  configuration: {
    loggingEnabled: true,
  },
});
```> [!NOTE]
>
> Поле в ответе при создании сессии называется `url` (см. [схему OpenAPI для Create Session](https://docs.didit.me/ru/sessions-api/create-session.md)). Передайте его напрямую в `startVerification({ url })`.***## Конфигурация| Параметр | Тип | По умолчанию | Описание |
| - | - | - | - |
| `loggingEnabled` | `boolean` | `false` | Включить логирование SDK для отладки |
| `containerElement` | `HTMLElement` | `document.body` | Пользовательский контейнер для монтирования модального окна |
| `zIndex` | `number` | `9999` | Z-index для модального оверлея |
| `showCloseButton` | `boolean` | `true` | Показывать кнопку закрытия в модальном окне |
| `showExitConfirmation` | `boolean` | `true` | Показывать диалог подтверждения выхода при закрытии |
| `closeModalOnComplete` | `boolean` | `false` | Автоматически закрывать модальное окно после завершения верификации |
| `embedded` | `boolean` | `false` | Отображать верификацию во встроенном режиме вместо модального оверлея |
| `embeddedContainerId` | `string` | — | ID контейнера для встроенного режима (обязательно при `embedded`, равном `true`) |
| `defaultDocumentCamera` | `'front' \| 'back'` | `'back'` | Камера, которая используется первой при захвате документа. См. раздел [Параметры камеры](#параметры-камеры) |
| `defaultLivenessCamera` | `'front' \| 'back'` | `'front'` | Камера, которая используется первой при захвате лица (проверке живости). См. раздел [Параметры камеры](#параметры-камеры) |
| `showDocumentCameraSwitchButton` | `boolean` | `true` | Показывать кнопку переключения камеры на шаге документа |
| `showLivenessCameraSwitchButton` | `boolean` | `true` | Показывать кнопку переключения камеры на шаге проверки живости |> [!TIP]
>
> Ознакомьтесь с полными [определениями типов TypeScript](#типы-typescript) ниже, чтобы изучить интерфейс `DiditSdkConfiguration` целиком.***## Параметры камеры> [!NOTE]
>
> Для параметров камеры требуется `@didit-protocol/sdk-web` версии **0.4.0** или новее.Веб-SDK предоставляет те же четыре параметра камеры, что и [нативные SDK](https://docs.didit.me/ru/integration/native-sdks/overview.md). По умолчанию при захвате документа открывается задняя камера, а при захвате лица (проверка живости) открывается фронтальная (селфи) камера; при этом на обоих шагах доступен переключатель камер непосредственно во время съемки на устройствах с несколькими камерами. Установите `defaultLivenessCamera: 'back'`, чтобы открывать захват лица на задней камере, например в киоске или когда оператор держит устройство и направляет его на верифицируемого пользователя.| Параметр | Тип | По умолчанию | Описание |
| - | - | - | - |
| `defaultDocumentCamera` | `'front' \| 'back'` | `'back'` | Камера, используемая при первом открытии экрана захвата документа |
| `defaultLivenessCamera` | `'front' \| 'back'` | `'front'` | Камера, используемая при первом открытии экрана захвата для проверки живости (пассивной проверки лица) |
| `showDocumentCameraSwitchButton` | `boolean` | `true` | Показывать переключатель камеры на экране захвата документа; значение `false` фиксирует выбор на `defaultDocumentCamera` |
| `showLivenessCameraSwitchButton` | `boolean` | `true` | Показывать переключатель камеры на экране проверки живости; значение `false` фиксирует выбор на `defaultLivenessCamera` |```typescript theme={null}
// A kiosk: the operator points the device at the person, on the rear camera, with no way to switch
DiditSdk.shared.startVerification({
  url,
  configuration: {
    defaultLivenessCamera: 'back',
    showLivenessCameraSwitchButton: false
  }
});
```- Допустимые значения камеры: `'front'` и `'back'`. Любое другое значение игнорируется, как и флаг переключателя, если он не является логическим значением.
- Устройство без запрошенной камеры продолжает использовать доступную: если для ноутбука запросить `'back'`, он все равно будет использовать веб-камеру. На устройствах с одной камерой переключатель скрывается независимо от установленных флагов.
- Параметры проверки живости применяются к пассивной проверке живости. На активную проверку живости они не влияют.
- SDK передает параметры на страницу верификации в качестве параметров запроса URL верификации: `document_camera`, `liveness_camera`, `document_camera_switch` и `liveness_camera_switch`. Если вы открываете URL верификации напрямую, а не через SDK, укажите их самостоятельно: добавьте `?liveness_camera=back` к URL без параметров запроса, `&liveness_camera=back` к URL, в котором уже есть параметры, или задайте их с помощью API `URL`, чтобы корректно обработать оба случая:```typescript theme={null}
const verificationUrl = new URL(url);
verificationUrl.searchParams.set('liveness_camera', 'back');
verificationUrl.searchParams.set('liveness_camera_switch', 'false');
window.location.assign(verificationUrl.toString());
```***## Отправка событийМетод `DiditSdk.shared.submitEvent()` ставит в очередь события конечных пользователей (регистрация, вход, неудачный вход, выход, сброс пароля, MFA, смена устройства) для мониторинга событий Didit.
Ваш бэкенд создает token для мониторинга пользователя, а SDK отправляет события пакетами вместе с цифровым отпечатком устройства.
Никогда не передавайте API-ключ в браузер.```typescript theme={null}
DiditSdk.shared.submitEvent({
  monitoringToken, // minted by your backend for this person
  event: { category: "auth", actionType: "login", payload: { method: "password" } },
});
```Сведения о token, полях событий и поведении при доставке см. в разделе [Отправка событий через SDK](https://docs.didit.me/ru/transaction-monitoring/sdk-event-submission.md).***## Размеры и прокрутка модального окна> [!NOTE]
>
> Описанное ниже поведение размеров требует версии **0.3.1** или новее. В версиях **0.3.0** и более ранних сценарий верификации может обрезаться на невысоких экранах десктопов и в альбомной ориентации.В модальном режиме максимальная ширина составляет 500px, а максимальная высота составляет 700px. На невысоких экранах компьютеров и в окне просмотра в альбомной ориентации iframe занимает 90% видимой области экрана. Сценарий верификации прокручивается внутри iframe, поэтому каждый шаг остается доступным, пока страница под модальным окном остается заблокированной.SDK использует единицы `dvh` в браузерах с поддержкой динамических единиц viewport и переключается на `vh` в более старых поддерживаемых браузерах. При ширине 540px и менее модальное окно заполняет всю видимую область экрана. Кнопка закрытия и подтверждение выхода остаются внутри модального окна.### Обновленный сценарий верификации> [!NOTE]
>
> Все сказанное в этом разделе относится к версии **0.5.0**, которая пока не опубликована. До обновления модальное окно сохраняет размеры, описанные выше.Начиная с версии 0.5.0, модальное окно автоматически адаптирует свой размер под обновленный сценарий верификации, как только страница передает данные о своем макете с помощью [сообщения `didit:layout`](https://docs.didit.me/ru/integration/web-sdks/incontext-iframe#задайте-размер-iframe-по-diditlayout):| Ширина окна | Модальное окно (начиная с версии 0.5.0) |
| - | - |
| 1024px и шире | 960px на 660px на каждом шаге, не более 90% ширины и высоты окна |
| от 541px до 1023px | Ширина 500px, высота по содержимому страницы, не более 90% высоты окна |
| 540px и менее | Во весь экран |- **Начальный размер, начиная с версии 0.5.0:** пока страница не передаст параметры своего макета (а также для страниц, которые их не передают), модальное окно сохраняет прежний максимальный размер 500px на 700px. Оно по-прежнему подстраивается под невысокие окна и разворачивается во весь экран при ширине 540px и менее.
- **Кнопка закрытия, начиная с версии 0.5.0:** круглая кнопка диаметром 44px поверх верхней панели страницы. Она адаптируется к светлой или темной теме страницы и перемещается влево для языков с письмом справа налево.
- **Встроенный режим, начиная с версии 0.5.0:** компонент по-прежнему заполняет родительский элемент, как и раньше (см. [Встроенный режим](#встроенный-режим)).
- **URL верификации, начиная с версии 0.5.0:** SDK добавляет параметры `sdk_presentation` (`modal` или `embedded`) и, в случае модального окна, `sdk_close_button` (`true` или `false` в соответствии с `showCloseButton`), чтобы страница знала, как именно она отображается.
- **События, начиная с версии 0.5.0:** SDK обрабатывает событие `didit:layout` самостоятельно и не передает его в `onEvent`.Дополнительная настройка не требуется, и все существующие параметры продолжают работать.***## Встроенный режимВо встроенном режиме ограничение 500px на 700px, характерное для модального окна, не применяется. SDK заполняет область содержимого родительского элемента, поэтому задайте этому элементу явную или вычисляемую высоту:```html theme={null}
<div id="verification-container" style="width: 500px; height: 700px;"></div>
``````typescript theme={null}
DiditSdk.shared.startVerification({
  url: 'https://verify.didit.me/u/...',
  configuration: {
    embedded: true,
    embeddedContainerId: 'verification-container'
  }
});
```Если у родительского элемента нет вычисленной высоты, встроенный iframe также не получит пригодной для использования высоты. Изменяйте размер родительского элемента при изменении разметки; SDK продолжит автоматически заполнять его.***## Результаты верификацииSDK возвращает три типа результатов:### ЗавершеноВерификация завершена (одобрена, ожидает решения или отклонена).```typescript theme={null}
{
  type: 'completed',
  session: {
    sessionId: 'session-uuid',
    status: 'Approved' | 'Pending' | 'Declined'
  }
}
```> [!NOTE]
>
> Тип TypeScript декларирует `'Approved' | 'Pending' | 'Declined'`, однако значение передаётся напрямую из статуса сессии размещённого сценария — вы также можете получать и другие статусы, например `In Review`. `Pending` является резервным значением SDK, когда сценарий не вернул никакого статуса. Рассматривайте `status` как подсказку и опирайтесь на [webhook](https://docs.didit.me/ru/integration/webhooks.md) для получения канонического решения.### ОтмененоПользователь закрыл модальное окно верификации. `session` передаётся, если `sessionId` уже известен (может быть `undefined`, если пользователь отменил процесс до того, как iframe успел передать его).```typescript theme={null}
{
  type: 'cancelled',
  session: {
    sessionId: 'session-uuid',
    status: 'Pending'
  }
}
```### ОшибкаВо время верификации произошла ошибка.```typescript theme={null}
{
  type: 'failed',
  error: {
    type: 'sessionExpired' | 'networkError' | 'cameraAccessDenied' | 'unknown',
    message: 'Your verification session has expired.'
  }
}
```***## Управление состояниемВы можете отслеживать состояние SDK для создания собственного пользовательского интерфейса:```typescript theme={null}
DiditSdk.shared.onStateChange = (state, error) => {
  switch (state) {
    case 'idle':
      // Ready to start
      break;
    case 'loading':
      // Loading verification iframe
      showLoadingSpinner();
      break;
    case 'ready':
      // Verification in progress
      hideLoadingSpinner();
      break;
    case 'error':
      // Error occurred
      showError(error);
      break;
  }
};

// Check current state
console.log(DiditSdk.shared.state);

// Check if verification is presented
console.log(DiditSdk.shared.isPresented);
```***## Справочник API### DiditSdk.sharedСинглтон-экземпляр SDK.### Методы| Метод | Описание |
| - | - |
| `startVerification(options)` | Запустить сценарий верификации |
| `submitEvent(options)` | Поставить событие конечного пользователя в очередь для мониторинга событий с токеном мониторинга |
| `close()` | Программно закрыть модальное окно верификации |
| `destroy()` | Уничтожить экземпляр SDK и очистить ресурсы |### Свойства| Свойство | Тип | Описание |
| - | - | - |
| `state` | `DiditSdkState` | Текущее состояние SDK |
| `configuration` | `DiditSdkConfiguration \| undefined` | Активная конфигурация (задаётся во время выполнения верификации) |
| `isPresented` | `boolean` | Открыто ли модальное окно верификации |
| `errorMessage` | `string \| undefined` | Сообщение об ошибке (задаётся, когда состояние равно `error`); неудачный запуск остаётся в статусе `error`, пока вы не запустите его снова |### Колбэки| Колбэк | Параметры | Описание |
| - | - | - |
| `onComplete` | `(result: VerificationResult)` | Вызывается при завершении верификации |
| `onStateChange` | `(state: DiditSdkState, error?: string)` | Вызывается при изменении состояния |
| `onEvent` | `(event: VerificationEvent)` | Вызывается при детализированных событиях верификации |***## Детализированные событияОтслеживайте прогресс верификации с помощью callback-функции `onEvent`:```typescript theme={null}
DiditSdk.shared.onEvent = (event) => {
  console.log('Event:', event.type, event.data);
};
```### Справочник событий| Событие | Описание | Payload данных |
| - | - | - |
| `didit:ready` | Страница готова, и sessionId доступен | `{ sessionId }` |
| `didit:started` | Пользователь начал верификацию | `{ sessionId? }` |
| `didit:step_started` | Начался шаг верификации | `{ step, sessionId? }` |
| `didit:step_completed` | Шаг успешно завершён | `{ step, nextStep?, sessionId? }` |
| `didit:step_changed` | Текущий шаг изменился | `{ step, previousStep?, sessionId? }` |
| `didit:media_started` | Запущен захват с камеры/медиа | `{ step, mediaType }` |
| `didit:media_captured` | Фото/видео захвачено | `{ step, isAuto }` |
| `didit:document_selected` | Пользователь выбрал тип документа и страну | `{ documentType, country }` |
| `didit:verification_submitted` | Данные отправлены на обработку | `{ step, sessionId? }` |
| `didit:code_sent` | Одноразовый код отправлен | `{ step, channel?, codeSize?, sessionId? }` |
| `didit:code_verified` | Одноразовый код подтверждён | `{ step, sessionId? }` |
| `didit:status_updated` | Статус сессии изменился | `{ status, previousStep?, sessionId? }` |
| `didit:completed` | Сценарий верификации завершён | `{ sessionId?, status?, country?, documentType? }` |
| `didit:cancelled` | Пользователь отменил верификацию | `{ sessionId? }` |
| `didit:error` | Произошла ошибка | `{ error: string, step?, sessionId? }` |
| `didit:close_request` | Пользователь запросил закрытие модального окна | (нет данных) |### Потеря соединенияЕсли у пользователя пропадает соединение, страница верификации отображает экран «Нет подключения к интернету» поверх сценария вместо того, чтобы оставлять шаг в состоянии загрузки.
Она продолжает проверку в фоновом режиме и автоматически закрывает этот экран, как только связь с Didit восстанавливается, после чего пользователь продолжает работу с того шага, на котором находился.
Внутри модального окна SDK или iframe экран также предлагает кнопку **Выйти из верификации**: в этом случае страница отправляет событие `didit:error` с `error: "network_error"`, за которым следует `didit:cancelled`, а SDK закрывает модальное окно и вызывает `onComplete` с `type: "cancelled"`.Начиная с версии 0.5.0, сообщение страницы `didit:layout` задаёт размер модального окна и не передаётся в `onEvent`. Если вы встраиваете страницу с помощью собственного iframe, см. раздел [Подгонка размера iframe с помощью `didit:layout`](https://docs.didit.me/ru/integration/web-sdks/incontext-iframe#задайте-размер-iframe-по-diditlayout).### Значения шаговПоле `step` может принимать одно из следующих значений:- `document_selection` - выбор типа документа
- `document_front` - лицевая сторона документа
- `document_back` - обратная сторона документа
- `face` - проверка лица/проверка живости
- `email` - проверка электронной почты
- `phone` - проверка телефона
- `poa` - подтверждение адреса
- `questionnaire` - шаг анкеты### Значения каналовПоле `channel` в `code_sent` может принимать значения:- `email` - код отправлен по электронной почте
- `sms` - код отправлен по SMS
- `whatsapp` - код отправлен через WhatsApp### Длина кодаПоле `codeSize` в `code_sent` указывает длину одноразового кода (например, 4 или 6 цифр).***## Типы TypeScript```typescript theme={null}
// Configuration types
interface DiditSdkConfiguration {
  /**
   * Enable SDK logging for debugging
   * @default false
   */
  loggingEnabled?: boolean;

  /**
   * Custom container element to mount the modal
   * @default document.body
   */
  containerElement?: HTMLElement;

  /**
   * Z-index for the modal overlay
   * @default 9999
   */
  zIndex?: number;

  /**
   * Show close button on modal
   * @default true
   */
  showCloseButton?: boolean;

  /**
   * Show exit confirmation dialog when closing
   * @default true
   */
  showExitConfirmation?: boolean;

  /**
   * Automatically close modal when verification completes
   * @default false
   */
  closeModalOnComplete?: boolean;

  /**
   * Render verification inline instead of modal overlay
   * @default false
   */
  embedded?: boolean;

  /**
   * Container element ID for embedded mode
   * Required when embedded is true
   */
  embeddedContainerId?: string;

  /**
   * Camera the document capture opens first.
   * @default 'back'
   */
  defaultDocumentCamera?: CameraLens;

  /**
   * Camera the face (liveness) capture opens first.
   * Applies to passive liveness; devices without a rear camera keep the front one.
   * @default 'front'
   */
  defaultLivenessCamera?: CameraLens;

  /**
   * Show the in-capture camera switcher on the document step.
   * false locks the user to defaultDocumentCamera.
   * @default true
   */
  showDocumentCameraSwitchButton?: boolean;

  /**
   * Show the in-capture camera switcher on the liveness step.
   * false locks the user to defaultLivenessCamera.
   * @default true
   */
  showLivenessCameraSwitchButton?: boolean;
}

type CameraLens = 'front' | 'back';

// Session + error types
type VerificationStatus = 'Approved' | 'Pending' | 'Declined';

interface SessionData {
  sessionId: string;
  status: VerificationStatus;
}

type VerificationErrorType =
  | 'sessionExpired'
  | 'networkError'
  | 'cameraAccessDenied'
  | 'unknown';

interface VerificationError {
  type: VerificationErrorType;
  message: string;
}

// Verification result — `session` and `error` are both optional fields
// on every result; which one is populated depends on `type`.
type VerificationResultType = 'completed' | 'cancelled' | 'failed';

interface VerificationResult {
  type: VerificationResultType;
  session?: SessionData;
  error?: VerificationError;
}

// State types
type DiditSdkState = 'idle' | 'loading' | 'ready' | 'error';

// Event types
type VerificationEventType =
  | 'didit:ready'
  | 'didit:started'
  | 'didit:step_started'
  | 'didit:step_completed'
  | 'didit:step_changed'
  | 'didit:media_started'
  | 'didit:media_captured'
  | 'didit:document_selected'
  | 'didit:verification_submitted'
  | 'didit:code_sent'
  | 'didit:code_verified'
  | 'didit:status_updated'
  | 'didit:completed'
  | 'didit:cancelled'
  | 'didit:error'
  | 'didit:close_request';

interface VerificationEventData {
  sessionId?: string;
  status?: string;
  step?: string;
  nextStep?: string;
  previousStep?: string;
  error?: string;
  country?: string;
  documentType?: string;
  isAuto?: boolean;
  mediaType?: string;
  channel?: string;
  codeSize?: number;
  [key: string]: unknown;
}

interface VerificationEvent {
  type: VerificationEventType;
  data?: VerificationEventData;
  timestamp?: number;
}

// Start verification options
interface StartVerificationOptions {
  url: string;
  configuration?: DiditSdkConfiguration;
}
```


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