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

# Верификация через iframe: встроенный веб-KYC

> Didit: встраивание KYC, KYB, AML и проверки живости через iframe. От $0.33 за KYC-проверку, $10 бесплатно в месяц, без контрактов.



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



      
      

\<pre>

\`Embed Didit identity verification into my web page using an iframe.

\## Two Options

\### Option A: UniLink (no backend — fastest setup)
Copy your UniLink URL from Didit Console > Workflows > Copy Link.
It looks like: https://verify.didit.me/u/<BASE64_WORKFLOW_ID>
Embed it directly:

\<iframe
src="https://verify.didit.me/u/YOUR_WORKFLOW_ID_BASE64"
style="width: 100%; height: 700px; border: none; border-radius: 12px;"
allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
/>

No backend needed. Results appear in your Didit Console dashboard.

\### Option B: API session (full control)
1\. Backend creates session: POST /v3/session/ → response includes "url"
2\. Frontend embeds that "url" as the iframe src
3\. Listen for postMessage events from the iframe (event.origin === 'https://verify.didit.me', or your white-label domain)
4\. Backend receives the full, signed decision via webhook (status.updated)

\## postMessage contract (key events — full table below)
Every message is an object: { type: "didit:<event>", data: { ... }, timestamp: <ms epoch> }
Completion event: type === "didit:completed", data: { sessionId, status }
Other events: didit:ready { sessionId }, didit:started, didit:step_started { step },
didit:step_completed { step, nextStep }, didit:step_changed { step, previousStep },
didit:status_updated { status }, didit:error { error, step }, didit:cancelled, didit:close_request,
didit:layout { contentHeight, colorScheme: "light" | "dark", dir: "ltr" | "rtl" }
The payload is NESTED under event.data.data (event.data is the envelope).
For your own iframe, add sdk_presentation=embedded with the URL API to receive didit:layout.

\## Iframe size (redesigned flow)
\- Window 1024px and wider: 960px by 660px (at most 90% of the window)
\- Window 541px to 1023px: 500px wide, height = didit:layout contentHeight (700px until the first message, at most 90% of the window height)
\- Window 540px and below: full screen

\## Frontend Code (Option B — React)
function VerificationIframe({ verificationUrl }) {
useEffect(() => {
function handleMessage(event) {
  if (event.origin !== 'https://verify.didit.me') return; // use your white-label domain if configured
  const { type, data } = event.data || {};
  if (type === 'didit:completed') {
    // data.sessionId, data.status: "Approved" | "Declined" | "In Review" // open string — other session statuses possible in edge flows
    // Trust the webhook on your backend for the canonical decision.
  }
}
window.addEventListener('message', handleMessage);
return () => window.removeEventListener('message', handleMessage);
}, []);

return (
\<iframe
  src={verificationUrl}
  style={{ width: '100%', height: '700px', border: 'none', borderRadius: '12px' }}
  allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
/>
);
}

\## Required client-side permissions
If you front your site with a reverse proxy (nginx, Cloudflare, etc.) make sure it does not
strip the Permissions-Policy / Feature-Policy headers — camera and microphone access must be
allowed for your origin or the iframe will be unable to start the camera.

\## Required iframe Permissions
allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
camera: document and face capture. microphone: optional audio during video capture.
geolocation: the location step. clipboard-write: the copy buttons.
digital-credentials-get: sharing a digital ID from a wallet such as Google Wallet.

\## 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, "vendor_data": userId }
201 response fields (all 10, per OpenAPI):
\{ "session_id", "session_number", "session_token", "url", "vendor_data", "metadata",
"status", "workflow_id", "workflow_version", "callback" }
Use response.url as the iframe src — never build the URL from session_token by hand.

\## Rate Limits
600 session-create requests per minute per API key (falls back to bearer token, then client IP), plus a shared 300 write-requests/minute budget across all endpoints. HTTP 429 with Retry-After when exceeded.

\## Environment Variables
\- DIDIT_API_KEY (backend only)
\- DIDIT_WORKFLOW_ID (backend only)

\## Docs
\- Iframe guide: https://docs.didit.me/integration/web-sdks/incontext-iframe
\- Create Session: https://docs.didit.me/sessions-api/create-session
\- Webhooks: https://docs.didit.me/integration/webhooks`

\</pre>



      
      

Вставьте в

Встройте поток верификации Didit непосредственно в ваше приложение с помощью iframe. Это обеспечивает бесшовный пользовательский опыт без перенаправления пользователей с вашего сайта.## Обзор| Функция | UniLink (без бэкенда) | API-сессия (с бэкендом) |
| - | - | - |
| Время настройки | \< 1 минуты | 5-10 минут |
| Требуется бэкенд | ❌ Нет | ✅ Да |
| Пользовательский `vendor_data` | ❌ Нет | ✅ Да |
| Пользовательские `metadata` | ❌ Нет | ✅ Да |
| Callback для каждой сессии | ❌ Нет | ✅ Да |
| Отслеживание сессий | ❌ Нет | ✅ Да |***## Iframe UniLink (без бэкенда)Самый быстрый способ начать работу: просто скопируйте и вставьте ваш URL UniLink.### Что понадобится1) Сценарий Didit (создается в [Консоли Didit](https://business.didit.me))
2) Ваш URL UniLink (нажмите **Copy Link** в вашем сценарии)### Реализация```html theme={null}
<iframe 
  src="https://verify.didit.me/u/YOUR_WORKFLOW_ID_BASE64"
  style="width: 100%; height: 700px; border: none;" 
  allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
></iframe>
```> ⚠️ **Обязательно**: атрибут `allow` обязателен для доступа к камере во время проверки живости.### Ключевые преимущества- **Настройка менее чем за 1 минуту**: без бэкенда и без API-ключей
- **Нулевая конфигурация**: URL обратного вызова задается в настройках сценария
- **Идеально для MVP**: начните работу немедленно***## Iframe API-сессии (с бэкендом)Для продвинутых интеграций, которым нужна настройка на уровне каждой сессии.### Когда использовать- Передавать пользовательские `vendor_data` или `metadata` для каждой сессии
- Задавать разные URL обратного вызова для каждой сессии
- Отслеживать сессии на стороне сервера до начала верификации
- Связывать сессии с вашими идентификаторами пользователей### Реализация**Шаг 1: создайте сессию (бэкенд)**В ответе на создание сессии есть поле **`url`**: используйте его как `src` для iframe.```javascript theme={null}
// Node.js / Express
app.post('/api/create-verification', async (req, res) => {
  const { userId } = req.body;

  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: userId,
      callback: 'https://yourapp.com/verification-callback',
      metadata: { source: 'web-app', timestamp: Date.now() },
    }),
  });

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

  // 201 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({ sessionId: session.session_id, verificationUrl: session.url });
});
```**Шаг 2: встройте в iframe (фронтенд)**```html theme={null}
<iframe 
  id="didit-verification"
  src="" <!-- Set dynamically from API response -->
  style="width: 100%; height: 650px; border: none;" 
  allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
></iframe>

<script>
  async function startVerification() {
    const response = await fetch('/api/create-verification', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ userId: 'user-123' })
    });
    
    const { verificationUrl } = await response.json();
    document.getElementById('didit-verification').src = verificationUrl;
  }
</script>
```***## Прослушивание событий (postMessage)Страница верификации отправляет события родительскому окну. Каждое сообщение имеет такую оболочку:```typescript theme={null}
{
  type: 'didit:<event>',   // e.g. 'didit:completed'
  data: { /* payload */ }, // event-specific; may be undefined
  timestamp: 1718000000000 // ms epoch
}
```Payload **вложен**: читайте `event.data.data.sessionId`, а не `event.data.sessionId`:```javascript theme={null}
window.addEventListener('message', (event) => {
  // Use your white-label domain here if you have one configured
  if (event.origin !== 'https://verify.didit.me') return;

  const { type, data } = event.data || {};

  if (type === 'didit:ready') {
    console.log('Session ID:', data.sessionId); // available as soon as the page loads
  }
  if (type === 'didit:completed') {
    console.log('Done:', data.sessionId, data.status); // e.g. "Approved" | "Declined" | "In Review"
    // UI hint only — the canonical decision arrives on your backend via webhook
  }
});
```Основные события: `didit:ready` (`{ sessionId }`), `didit:started`, `didit:step_started` / `didit:step_completed` / `didit:step_changed` (`{ step, ... }`), `didit:status_updated` (`{ status }`), `didit:completed` (`{ sessionId, status }`), `didit:cancelled`, `didit:error` (`{ error, step? }`), `didit:close_request` и `didit:layout` (`{ contentHeight, colorScheme, dir }`, см. [ниже](#задайте-размер-iframe-по-diditlayout)). В [справочнике событий JavaScript SDK](https://docs.didit.me/ru/integration/web-sdks/javascript-sdk.md#справочник-событий) перечислены события верификации, доступные как типизированные callback-функции. Начиная с версии 0.5.0, SDK самостоятельно обрабатывает сообщения о макете и не передает их в `onEvent`.### Задайте размер iframe по `didit:layout`Страница верификации сообщает, сколько места ей нужно, с помощью сообщения `didit:layout`. Она отправляет его при загрузке и каждый раз, когда меняются высота содержимого, тема или направление текста:```typescript theme={null}
{
  type: 'didit:layout',
  data: {
    contentHeight: 612,    // CSS px
    colorScheme: 'light',  // 'light' | 'dark'
    dir: 'ltr'             // 'ltr' | 'rtl'
  },
  timestamp: 1718000000000
}
```| Поле | Тип | Описание |
| - | - | - |
| `contentHeight` | `number` | Естественная высота содержимого страницы в CSS-пикселях, включая верхнюю панель |
| `colorScheme` | `'light' \| 'dark'` | Тема, в которой отображается страница. При использовании цветов White label тему определяет цвет вашего фона, а не настройка устройства |
| `dir` | `'ltr' \| 'rtl'` | Направление текста языка страницы |> [!NOTE]
>
> Чтобы получать `didit:layout` в вашем iframe, добавьте `sdk_presentation=embedded` к URL верификации. Начиная с версии 0.5.0, [JavaScript SDK](https://docs.didit.me/ru/integration/web-sdks/javascript-sdk.md) устанавливает этот параметр за вас. Без параметра presentation страница использует автономный макет и не отправляет сообщения о макете.Этот хост следует [рекомендуемым размерам](#размер-iframe): фиксированная карточка при ширине окна от 1024 px, полноэкранный режим при 540px и меньше, а между ними iframe шириной 500px, высота которого соответствует высоте, которую сообщает страница:```html theme={null}
<iframe
  id="didit-verification"
  class="didit-iframe"
  title="Didit verification"
  allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
></iframe>

<style>
  /* 541px to 1023px wide: 500px wide and as tall as the content */
  .didit-iframe {
    display: block;
    width: 500px;
    max-width: 100%;
    height: var(--didit-content-height, 700px); /* 700px until the first didit:layout */
    max-height: 90vh;
    max-height: 90dvh;
    margin: 0 auto;
    border: none;
    border-radius: 16px;
  }

  /* 1024px and wider: the computer card */
  @media (min-width: 1024px) {
    .didit-iframe {
      width: 960px;
      max-width: 90vw;
      height: 660px;
    }
  }

  /* 540px and below: full screen */
  @media (max-width: 540px) {
    .didit-iframe {
      position: fixed;
      inset: 0;
      width: 100%;
      height: 100vh;
      height: 100dvh;
      max-height: none;
      border-radius: 0;
    }
  }
</style>

<script>
  const DIDIT_ORIGIN = 'https://verify.didit.me'; // or your white-label domain
  const iframe = document.getElementById('didit-verification');

  // verificationUrl: the session `url` from your backend, or your UniLink
  const src = new URL(verificationUrl);
  src.searchParams.set('sdk_presentation', 'embedded');
  window.addEventListener('message', (event) => {
    if (event.origin !== DIDIT_ORIGIN || event.source !== iframe.contentWindow) return;
    const { type, data } = event.data || {};
    if (type !== 'didit:layout') return;
    const height = data?.contentHeight;
    if (typeof height !== 'number' || !Number.isFinite(height) || height <= 0) return;

    // Only the 541px to 1023px size reads it; the other two sizes are fixed
    iframe.style.setProperty('--didit-content-height', `${height}px`);
  });
  iframe.src = src.toString();
</script>
```Для диапазона от 541px до 1023px этот пример использует начальную высоту 700px до получения сообщения о макете, но не более 90% высоты видимой области окна. Размеры для компьютера и телефона применяются сразу. На телефонах iframe занимает всё окно, поэтому предусмотрите в вашем приложении способ выйти из верификации. Используйте `colorScheme` и `dir`, чтобы согласовать элементы управления вокруг iframe с темой и направлением текста страницы.Если соединение пользователя пропадает, страница показывает экран «Нет подключения к интернету», который закрывается сам, как только соединение восстанавливается. Если пользователь выбирает **Exit Verification** на этом экране, страница отправляет `didit:error` с `error: "network_error"`, а затем `didit:cancelled`: закрывайте iframe по событию `didit:cancelled`.***## Реализация модального окнаДля аккуратного модального окна поверх вашей страницы:### HTML/CSS/JS```html theme={null}
<!DOCTYPE html>
<html>
<head>
  <style>
    .didit-modal-overlay {
      display: none;
      position: fixed;
      inset: 0;
      background: rgba(0, 0, 0, 0.6);
      z-index: 9999;
      backdrop-filter: blur(4px);
    }
    
    .didit-modal-container {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      width: 90%;
      max-width: 480px;
      height: 85vh;
      max-height: 750px;
      background: white;
      border-radius: 16px;
      overflow: hidden;
      box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
    }
    
    .didit-modal-close {
      position: absolute;
      top: 12px;
      right: 12px;
      z-index: 10;
      width: 32px;
      height: 32px;
      border: none;
      background: rgba(0, 0, 0, 0.1);
      border-radius: 50%;
      cursor: pointer;
      font-size: 18px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    .didit-modal-close:hover {
      background: rgba(0, 0, 0, 0.2);
    }
    
    .didit-iframe {
      width: 100%;
      height: 100%;
      border: none;
    }
  </style>
</head>
<body>
  <button onclick="openVerification()">Verify Identity</button>

  <div id="didit-modal" class="didit-modal-overlay">
    <div class="didit-modal-container">
      <button class="didit-modal-close" onclick="closeVerification()">✕</button>
      <iframe 
        id="didit-iframe"
        class="didit-iframe"
        allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
      ></iframe>
    </div>
  </div>

  <script>
    const UNILINK_URL = 'https://verify.didit.me/u/YOUR_WORKFLOW_ID_BASE64';
    
    function openVerification() {
      document.getElementById('didit-iframe').src = UNILINK_URL;
      document.getElementById('didit-modal').style.display = 'block';
      document.body.style.overflow = 'hidden';
    }
    
    function closeVerification() {
      document.getElementById('didit-iframe').src = '';
      document.getElementById('didit-modal').style.display = 'none';
      document.body.style.overflow = '';
    }
    
    // Close on escape key
    document.addEventListener('keydown', (e) => {
      if (e.key === 'Escape') closeVerification();
    });
    
    // Close on overlay click
    document.getElementById('didit-modal').addEventListener('click', (e) => {
      if (e.target.id === 'didit-modal') closeVerification();
    });
  </script>
</body>
</html>
```***## Компонент ReactМногоразовый React-компонент для верификации в модальном окне:```tsx theme={null}
import { useState, useEffect } from 'react';

interface DiditInContextProps {
  /**
   * Either the `url` returned by POST /v3/session/ (API session)
   * or your UniLink URL copied from the Console (Workflows → Copy Link).
   * Don't derive the UniLink yourself — the path segment is a 22-character
   * base64url encoding of the workflow UUID's raw bytes, not btoa(workflowId).
   */
  verificationUrl: string;
  isOpen: boolean;
  onClose: () => void;
  onComplete?: (sessionId: string, status: string) => void;
}

export function DiditInContext({ 
  verificationUrl, 
  isOpen, 
  onClose,
  onComplete 
}: DiditInContextProps) {
  const [iframeSrc, setIframeSrc] = useState<string>('');

  useEffect(() => {
    if (isOpen) {
      setIframeSrc(verificationUrl);
      document.body.style.overflow = 'hidden';
    } else {
      setIframeSrc('');
      document.body.style.overflow = '';
    }
  }, [isOpen, verificationUrl]);

  // Listen for postMessage from iframe
  // Messages look like: { type: 'didit:<event>', data: {...}, timestamp }
  useEffect(() => {
    const handleMessage = (event: MessageEvent) => {
      // Use your white-label domain here if you have one configured
      if (event.origin !== 'https://verify.didit.me') return;

      if (event.data?.type === 'didit:completed' && onComplete) {
        onComplete(event.data.data?.sessionId, event.data.data?.status);
        onClose();
      }
    };

    window.addEventListener('message', handleMessage);
    return () => window.removeEventListener('message', handleMessage);
  }, [onComplete, onClose]);

  // Handle escape key
  useEffect(() => {
    const handleEscape = (e: KeyboardEvent) => {
      if (e.key === 'Escape' && isOpen) onClose();
    };
    
    document.addEventListener('keydown', handleEscape);
    return () => document.removeEventListener('keydown', handleEscape);
  }, [isOpen, onClose]);

  if (!isOpen) return null;

  return (
    <div 
      className="fixed inset-0 bg-black/60 backdrop-blur-sm z-50 flex items-center justify-center"
      onClick={(e) => e.target === e.currentTarget && onClose()}
    >
      <div className="relative w-[90%] max-w-[480px] h-[85vh] max-h-[750px] bg-white rounded-2xl overflow-hidden shadow-2xl">
        <button 
          onClick={onClose}
          className="absolute top-3 right-3 z-10 w-8 h-8 rounded-full bg-black/10 hover:bg-black/20 flex items-center justify-center"
          aria-label="Close"
        >
          ✕
        </button>
        <iframe 
          src={iframeSrc}
          className="w-full h-full border-0"
          allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
          title="Didit Verification"
        />
      </div>
    </div>
  );
}
```### Использование```tsx theme={null}
import { useState } from 'react';
import { DiditInContext } from './DiditInContext';

function App() {
  const [isVerificationOpen, setIsVerificationOpen] = useState(false);
  
  return (
    <>
      <button onClick={() => setIsVerificationOpen(true)}>
        Verify Identity
      </button>
      
      <DiditInContext
        verificationUrl="https://verify.didit.me/u/YOUR_WORKFLOW_ID_BASE64" // UniLink from Console, or the API session `url`
        isOpen={isVerificationOpen}
        onClose={() => setIsVerificationOpen(false)}
        onComplete={(sessionId, status) => {
          console.log(`Verification ${status}: ${sessionId}`);
          if (status === 'Approved') {
            // Navigate to success page
          }
        }}
      />
    </>
  );
}
```***## Компонент Vue```vue theme={null}
<template>
  <Teleport to="body">
    <div 
      v-if="isOpen"
      class="fixed inset-0 bg-black/60 backdrop-blur-sm z-50 flex items-center justify-center"
      @click.self="$emit('close')"
    >
      <div class="relative w-[90%] max-w-[480px] h-[85vh] max-h-[750px] bg-white rounded-2xl overflow-hidden shadow-2xl">
        <button 
          @click="$emit('close')"
          class="absolute top-3 right-3 z-10 w-8 h-8 rounded-full bg-black/10 hover:bg-black/20 flex items-center justify-center"
        >
          ✕
        </button>
        <iframe 
          :src="iframeSrc"
          class="w-full h-full border-0"
          allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
        />
      </div>
    </div>
  </Teleport>
</template>

<script setup lang="ts">
import { computed, watch, onMounted, onUnmounted } from 'vue';

const props = defineProps<{
  isOpen: boolean;
  // The `url` from POST /v3/session/, or your UniLink URL copied from the
  // Console (Workflows → Copy Link). Don't derive the UniLink with btoa() —
  // its path segment is base64url of the workflow UUID's raw bytes.
  verificationUrl: string;
}>();

const emit = defineEmits<{
  close: [];
  complete: [sessionId: string, status: string];
}>();

const iframeSrc = computed(() => (props.isOpen ? props.verificationUrl : ''));

// Handle escape key
const handleEscape = (e: KeyboardEvent) => {
  if (e.key === 'Escape' && props.isOpen) emit('close');
};

// Handle postMessage — messages look like { type: 'didit:<event>', data: {...}, timestamp }
const handleMessage = (event: MessageEvent) => {
  // Use your white-label domain here if you have one configured
  if (event.origin !== 'https://verify.didit.me') return;
  if (event.data?.type === 'didit:completed') {
    emit('complete', event.data.data?.sessionId, event.data.data?.status);
  }
};

onMounted(() => {
  document.addEventListener('keydown', handleEscape);
  window.addEventListener('message', handleMessage);
});

onUnmounted(() => {
  document.removeEventListener('keydown', handleEscape);
  window.removeEventListener('message', handleMessage);
});

// Lock body scroll when open
watch(() => props.isOpen, (isOpen) => {
  document.body.style.overflow = isOpen ? 'hidden' : '';
});
</script>
```***## Настройка### Обязательные разрешенияИспользуйте полный список разрешений для захвата, геолокации, копирования и совместимости медиа:```html theme={null}
allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
```| Разрешение | Назначение и что происходит без него |
| - | - |
| `camera` | Сканирование документов и захват лица. Без него камера не запускается, и пользователь видит инструкции по доступу к камере |
| `microphone` | Необязательный звук во время видеозаписи документа и лица. Без него запись продолжается без звука |
| `geolocation` | На шаге определения местоположения считывается позиция устройства. Без него пользователь видит **Доступ к местоположению выключен**, даже если он разрешил геолокацию в браузере |
| `clipboard-write` | Копирование идентификатора сессии или ссылки на верификацию, в том числе на экране встроенного браузера. Без него действие копирования может не сработать, и пользователю придется вручную скопировать видимый текст или адрес из браузера |
| `fullscreen` | Позволяет элементам управления медиа запрашивать полноэкранный режим. Без него эти элементы остаются внутри iframe |
| `autoplay` | Позволяет обучающим видео и предпросмотру камеры воспроизводиться автоматически с учетом правил браузера. Без него воспроизведение может ждать действия пользователя |
| `encrypted-media` | Сохранено для совместимости с защищенным медиаконтентом. Текущие шаги захвата его не требуют; без него воспроизведение защищенного медиаконтента будет заблокировано |
| `digital-credentials-get` | Передача цифрового удостоверения из кошелька, например Google Wallet, через Digital Credentials API браузера. Без него браузер отклоняет запрос к кошельку внутри вашего iframe, и пользователь не может передать удостоверение из кошелька |Атрибут `allow` делегирует разрешения фрейму, но не отменяет выбор пользователя и более строгий заголовок `Permissions-Policy` на вашей странице.### Размер iframeПоток верификации сам раскладывает содержимое по размеру своего iframe. Задавайте размер iframe по окну, в котором он отображается:| Ширина окна | Рекомендуемый размер iframe |
| - | - |
| 1024px и больше (компьютер) | 960px на 660px, но не более 90% ширины и высоты окна. Сохраняйте этот размер на каждом шаге |
| от 541px до 1023px | 500px в ширину и столько в высоту, сколько нужно содержимому: возьмите высоту из `contentHeight` в сообщении [`didit:layout`](#задайте-размер-iframe-по-diditlayout), но не более 90% высоты окна |
| 540px и меньше (телефон) | Во весь экран: вся ширина и вся видимая высота окна, без скругленных углов |Для среднего диапазона начинайте с 500px на 700px, пока не придет первое сообщение `didit:layout`, с тем же ограничением по высоте. В [примере `didit:layout`](#задайте-размер-iframe-по-diditlayout) применены все три размера, включая размеры для компьютера и телефона до получения каких-либо сообщений.### Политика безопасности контента (CSP)Если вы используете CSP, добавьте Didit в директиву `frame-src`:```
Content-Security-Policy: frame-src https://verify.didit.me;
```***## Верификация на другом устройствеInContext iframe автоматически поддерживает верификацию на другом устройстве:1) Пользователь начинает верификацию на компьютере
2) Если камера недоступна, показывается QR-код
3) Пользователь сканирует QR-код на телефоне
4) Пользователь завершает верификацию на телефоне
5) Iframe на компьютере автоматически обновляется и отображает результатЭто происходит автоматически, дополнительная настройка не нужна.***## Устранение неполадок### Камера не работает1) Убедитесь, что iframe включает полный [список разрешений](#обязательные-разрешения)
2) Проверьте, что ваш сайт работает по HTTPS
3) Убедитесь, что пользователь предоставил вашему домену доступ к камере
4) Попробуйте метод [Redirect](https://docs.didit.me/ru/integration/web-sdks/web-redirect.md), если доступ к камере в iframe не работает### Iframe не загружается1) Проверьте наличие проблем с Content Security Policy (CSP)
2) Добавьте `https://verify.didit.me` в директиву `frame-src`
3) Проверьте консоль браузера на наличие ошибок### postMessage не получен1) Убедитесь, что вы слушаете правильный origin (`https://verify.didit.me` или ваш домен White label)
2) Проверьте, что обработчик событий добавлен до открытия iframe
3) Проверьте имя и структуру события: типы имеют префикс (`didit:completed`, а не `verification_complete`), а payload вложен в `event.data.data`***## Пример репозитория> [card] [Репозиторий GitHub](https://github.com/didit-protocol/iframe-example)
>
> Смотрите исходный код и примеры на GitHub***


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