Будьте готовы принимать цифровой кошелек EU Digital Identity.
Каждое государство-член ЕС должно предложить цифровой кошелек EU Digital Identity (EUDI) к 24 декабря 2026 года, а регулируемые компании обязаны принимать его к 24 декабря 2027 года. Didit уже работает с пятью национальными электронными удостоверениями личности (eID), и поддержка EUDI Wallet скоро появится в том же рабочем процессе.
Нам доверяют более 3000 организаций по всему миру.
EUDI WalletПодтверждение личности и возраста
Интернет-магазин запрашиваетВозраст старше 18
Фамилия
Имя
Дата рождения
Место рождения
Гражданство
Возраст старше 18
Поделиться 1 атрибутом
Проверяющая сторонаИнтернет-магазин
age_over_18true
Подпись эмитента
Привязка к устройству
5 атрибутов скрыто
Что такое EUDI Wallet
Один кошелек на человека. Только те данные, что вы запросите.
EUDI Wallet представляет собой бесплатное приложение, которое каждое государство-член ЕС обязано предложить в соответствии с Регламентом (ЕС) 2024/1183, известным как eIDAS 2. Оно хранит данные для идентификации личности (PID), то есть имя, дату и место рождения, гражданство, а также электронные подтверждения атрибутов, таких как водительские права или диплом. Использование кошелька добровольное.
Когда компания запрашивает данные, пользователь видит, кто запрашивает, и делится только запрошенными атрибутами. Это называется выборочным раскрытием: сайт может узнать, что человеку больше 18 лет, не видя даты рождения. Кошелек работает на высоком уровне надежности, самом сильном из трех уровней eIDAS, и компания проверяет подпись эмитента, прежде чем полагаться на данные.
Последний пересмотр: 5 октября 2026 г. Не является юридической консультацией.
Ключевые даты
Кошельки к концу 2026 года. Прием к 24 декабря 2027 года.
Это даты из Регламента (ЕС) 2024/1183 и его имплементирующих актов, на которые компаниям следует ориентироваться при планировании.
30 апреля 2024 г.
Опубликован eIDAS 2
Регламент (ЕС) 2024/1183, вносящий изменения в Регламент eIDAS (ЕС) № 910/2014, опубликован в Официальном журнале ЕС. Он вступает в силу на двадцатый день после публикации.
24 декабря 2024 г.
Вступают в силу первые правила для кошельков
Вступают в силу первые пять имплементирующих регламентов для кошелька: данные для идентификации личности, основные функции, уведомления, сертификация, а также протоколы и интерфейсы. Они запускают отсчет 24- и 36-месячных сроков, указанных ниже.
15 июля 2026 г.
Правила для кошельков обновлены
Комиссия принимает Имплементирующий регламент (ЕС) 2026/1731. Он устанавливает два формата учетных данных, SD-JWT VC и ISO/IEC mdoc, и планирует обязательное фото для 2028 года.
23 июля 2026 г.
ARF v3.0.0
Архитектурно-справочная основа (ARF), технический план, на котором строятся кошельки и доверяющие стороны, достигает версии 3.0.0.
24 декабря 2026 г.
Кошельки в каждом государстве-члене
Каждое государство-член должно предоставить как минимум один EUDI Wallet. Правила регистрации доверяющих сторон, Имплементирующий регламент (ЕС) 2025/848, применяются с того же дня.
24 декабря 2027 г.
Частные компании обязаны принимать его
Частные компании, которые обязаны использовать сильную аутентификацию пользователя по закону или по контракту, за исключением микро- и малых предприятий, должны принимать кошелек, когда пользователь просит его использовать (Статья 5f(2)). Этот срок составляет 36 месяцев после вступления в силу первых имплементационных актов 24 декабря 2024 года, то есть до 24 декабря 2027 года.
11 августа 2028 г.
Проверки фото и регистрации
Фото становится частью обязательных данных для идентификации личности, и кошельки должны аутентифицировать и проверять регистрационный сертификат каждой доверяющей стороны.
Кто обязан принимать
Кто и когда обязан принимать кошелек.
Статья 5f Регламента eIDAS, с изменениями, внесенными Регламентом (ЕС) 2024/1183, устанавливает обязанности по приему. В каждом случае пользователь выбирает использовать кошелек, а вы сохраняете другие способы идентификации людей.
Кто
Что это значит, простыми словами
Статья · дата
Кто
Органы государственного сектора
Что это значит, простыми словами
Если государство-член требует электронную идентификацию для доступа к государственным онлайн-услугам, то эта услуга также должна принимать EUDI Wallet.
Если закон или договор обязывает вас использовать строгую аутентификацию пользователя для онлайн-идентификации, вы также должны принимать EUDI Wallet. Триггером является это требование, а не ваша отрасль.
Статья · дата
Ст. 5f(2) · 24 дек. 2027
Кто
Области, упомянутые в статье
Что это значит, простыми словами
Транспорт, энергетика, банковское дело, финансовые услуги, социальное обеспечение, здравоохранение, питьевая вода, почтовые услуги, цифровая инфраструктура, образование и телекоммуникации. В статье сказано «включая», поэтому список является примером и не является исчерпывающим.
Статья · дата
Ст. 5f(2)
Кто
Микро- и малые предприятия
Что это значит, простыми словами
Освобождены от обязанности для частного сектора, как определено в Рекомендации Комиссии 2003/361/EC. Они все равно могут принимать кошелек, если захотят.
Статья · дата
Ст. 5f(2)
Кто
Только по запросу пользователя
Что это значит, простыми словами
Принятие происходит, когда пользователь просит использовать кошелек. Использование его является добровольным для людей, и сервисы должны оставаться открытыми для других средств идентификации и аутентификации.
Статья · дата
Ст. 5f(2), 5a(15)
Кто
Очень крупные онлайн-платформы
Что это значит, простыми словами
Платформы, обозначенные в соответствии с Законом о цифровых услугах, которые требуют аутентификации пользователя, должны принимать кошелек по запросу пользователя для минимального объема данных, необходимых сервису. Текст не устанавливает отдельную дату для этой обязанности.
Статья · дата
Ст. 5f(3)
Зависимые стороны также должны зарегистрироваться в государстве-члене, где они учреждены, и могут запрашивать только те данные, которые они зарегистрировали (Статья 5b). Последний пересмотр: 5 октября 2026 г. Не является юридической консультацией.
Как бизнес принимает его
Как зависимая сторона принимает EUDI Wallet: пять шагов.
Шаг 01 / 05
01
Зарегистрируйтесь как зависимая сторона
Зарегистрируйтесь в государстве-члене, где вы учреждены, указав свои данные и данные, которые вы намерены запрашивать. Вы получите сертификат доступа, который аутентифицирует вас в кошельке, и, если ваше государство-член выдает его, регистрационный сертификат, в котором перечислены зарегистрированные вами атрибуты.
Запрашивайте только то, что вам нужно
Запрашивайте конкретные атрибуты, например, возраст старше 18 лет, с помощью OpenID для верифицируемых презентаций (OpenID4VP) и языка запросов цифровых учетных данных (DCQL) или с помощью ISO/IEC 18013-7. Вы не можете запрашивать данные, выходящие за рамки вашей регистрации.
Пользователь дает согласие в кошельке
На том же телефоне браузер передает управление приложению кошелька. На компьютере пользователь сканирует QR-код. Кошелек показывает, кто запрашивает, проверяет, что вы не запрашиваете больше, чем зарегистрировали, и пользователь одобряет или отклоняет запрос.
Проверьте презентацию
Проверьте подпись эмитента по доверенным спискам, убедитесь, что учетные данные не были отозваны, и проверьте привязку устройства, которая показывает, что учетные данные не были скопированы или повторно использованы.
Получите атрибуты и примите решение
Вы получаете только те атрибуты, которыми поделился пользователь, подписанные эмитентом. Решение о регистрации или доступе, а также записи, которые вы ведете, остаются за вами.
Didit выполнит эти шаги за вас, когда будет запущена поддержка EUDI Wallet (скоро).
Что вы получаете и что еще нужно для KYC
Кошелек подтверждает личность. Для комплексной проверки нужно больше.
В соответствии с Регламентом по борьбе с отмыванием денег (AMLR), Регламентом (ЕС) 2024/1624, электронная идентификация с уровнем достоверности «существенный» или «высокий» является одним из двух способов проверки личности (Статья 22(6)). Она не охватывает все, что требуется при проверках «знай своего клиента» (KYC). Вот что содержит данные идентификации личности (PID) и как Didit покрывает каждый пункт сегодня.
Требования комплексной проверки
В EUDI Wallet PID
Как Didit покрывает это сегодня
Требования комплексной проверки
Все имена и фамилии
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Фамилия и имя, оба обязательны.
Как Didit покрывает это сегодня
Национальные электронные удостоверения личности в реальном времени возвращают полное имя. Документальный маршрут считывает его из более чем 14 000 типов документов.
Требования комплексной проверки
Место и полная дата рождения
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Дата и место рождения, оба обязательны.
Как Didit покрывает это сегодня
Национальные электронные удостоверения личности в реальном времени возвращают дату рождения. Документальный маршрут считывает место рождения, если оно указано в документе.
Требования комплексной проверки
Гражданство
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Гражданство, обязательно, одна или несколько стран.
Как Didit покрывает это сегодня
Документальный маршрут считывает гражданство из удостоверения личности или его чипа.
Требования комплексной проверки
Национальный идентификационный номер, если применимо
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Персональный административный номер, необязательно. Каждое государство-член решает, выдавать ли его.
Как Didit покрывает это сегодня
Национальные электронные удостоверения личности в реальном времени возвращают идентификатор системы: шведский personnummer, финский персональный идентификационный код или балтийский персональный код. MitID возвращает псевдонимизированный идентификатор, а не номер CPR.
Требования комплексной проверки
Обычное место жительства
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Поля адреса необязательны и часто отсутствуют. Окончательные проекты стандартов AMLA гласят, что недостающие атрибуты должны быть получены другими способами.
Как Didit покрывает это сегодня
Ни одно национальное электронное удостоверение личности в реальном времени не возвращает адрес. Подтверждение адреса проверяет счет за коммунальные услуги, выписку из банка или государственное письмо.
Требования комплексной проверки
Идентификационный номер налогоплательщика, если имеется
AMLR Ст. 22(1)(a)
В EUDI Wallet PID
Не является частью PID.
Как Didit покрывает это сегодня
Соберите его с помощью шага анкетирования в том же рабочем процессе.
Требования комплексной проверки
Соответствие личности человека
ARF · привязка пользователя
В EUDI Wallet PID
Портрет остается необязательным до тех пор, пока не станет обязательным 11 августа 2028 года.
Как Didit покрывает это сегодня
Пассивная проверка живости и сопоставление лица 1:1 с фотографией в документе или портретом на чипе, в рамках полной проверки KYC за $0.33.
Требования комплексной проверки
Бенефициарные владельцы компании
AMLR Ст. 20(1)(b)
В EUDI Wallet PID
Не в PID. Кошелек идентифицирует человека, а не владельца компании.
Как Didit покрывает это сегодня
Проверка бизнеса извлекает данные реестра и владельцев, если они там указаны, с проверкой личности для каждого владельца.
Требования комплексной проверки
Санкции и политически значимые лица (PEP)
AMLR Ст. 20(1)(d), (g)
В EUDI Wallet PID
Не в PID.
Как Didit покрывает это сегодня
AML-скрининг по более чем 1300 санкционным, PEP и контрольным спискам, по $0.20 за проверку.
Требования комплексной проверки
Цель отношений и постоянный мониторинг
AMLR Ст. 25, 26
В EUDI Wallet PID
Не в PID.
Как Didit покрывает это сегодня
Анкеты фиксируют цель отношений. Постоянный мониторинг повторно проверяет клиентов ежедневно за $0.07 на человека в год.
Проверка клиентов остается вашей обязанностью. Didit предоставляет инструменты для проверок и доказательства, но сам по себе не обеспечивает вашего соответствия требованиям. AMLR вступает в силу с 10 июля 2027 года, а технические стандарты AMLA представляют собой окончательный проект от 30 сентября 2026 года, а не закон.
Готовность по странам
На каком этапе национальные кошельки: актуальные данные и источники.
Здесь указано, что опубликовала каждая страна или что сообщает названный источник, с датой и ссылкой для каждой строки.
Статус на 5 октября 2026 г.
Страна
Кошелек или приложение
Статус
Дата
Что известно
Страна
Италия
Кошелек или приложение
IT-Wallet (app IO)
Статус
Рабочее приложение
Дата
17 февраля 2026 г.
Что известно
Работает в приложении IO: 10,1 млн активаций и 17,3 млн загруженных документов к 17 февраля 2026 года. Бесплатно и опционально для взрослых, вход через CIE или SPID.
AltID доступен с цифровым удостоверением личности и подтверждением возраста, и к 4 августа 2026 года его создали 281 390 человек. Агентство по цифровому правительству внедряет кошелек поэтапно.
Публичная песочница с декабря 2025 года. Приложение ожидается в начале 2027 года, начиная с функции ID. Первый раз закон о внедрении был рассмотрен Бундестагом 23 сентября 2026 года.
Не указаны: Австрия, Бельгия, Эстония, Венгрия, Латвия, Литва, Люксембург, Мальта, Португалия, Словения. Мы не нашли публичной информации об их статусе на эту дату. Мы обновляем эту таблицу по мере запуска национальных приложений.
Как Didit поможет вам · Пять пунктов
Принимайте национальные eID уже сейчас. Добавьте EUDI Wallet следующим шагом.
EUDI Wallet добавляет новый маршрут, но не заменяет существующие. Настройте рабочий процесс один раз: национальные электронные удостоверения личности и документы уже сегодня, а поддержка EUDI Wallet появится на том же этапе верификации личности, когда он будет запущен.
Принимайте национальные eID, которыми ваши клиенты уже пользуются.
Пять национальных eID уже работают с Didit в семи странах: MitID, BankID Sweden, Finnish Trust Network, Smart-ID и Mobile-ID. Пользователь входит в систему с помощью своего eID, и сессия получает подписанные атрибуты: полное имя, дату рождения, идентификатор системы (например, шведский personnummer; MitID возвращает псевдонимизированный идентификатор) и уровень достоверности, заявленный схемой. Оплачиваются только успешно завершенные входы.
Уровни, как их обозначает Didit. Адрес и фотография не возвращаются.
02 · EUDI Wallet, скоро
Поддержка EUDI Wallet в том же рабочем процессе.
Поддержка кошелька EUDI появится в ближайшее время. В нашем каталоге кошельков он указан для 30 стран ЕЭЗ, на том же этапе верификации личности, что и национальные электронные удостоверения. Дата запуска и цена пока не определены.
Настраивается для каждой страны в рабочем процессе
30
Перечисленные страны ЕЭЗ
SD-JWT VC · mdoc
Форматы учетных данных кошелька
Национальные eIDДоступно
EUDI WalletСкоро
Документ с NFC-чипомДоступно
Дата и цена для интеграции EUDI Wallet пока не определены.
03 · Маршрут по документам
Маршрут по документам для всех, у кого нет кошелька.
Не у всех будет или будет использоваться кошелек, и закон оставляет открытыми другие средства. Маршрут по документам считывает чип в паспортах и удостоверениях личности с помощью NFC ($0.15), выполняет пассивную проверку на живость и сопоставляет лицо с фотографией в документе для более чем 14 000 типов документов в 220+ странах и территориях.
Подтвердите возраст с минимальным количеством данных.
EUDI Wallet может подтвердить, что человеку больше 18 лет, без указания даты рождения. Пока кошельки не стали повсеместными, оценка возраста по селфи стоит $0.10 за проверку и отправляет пограничные результаты на резервную верификацию личности. Вход через eID также возвращает подписанную дату рождения без фотографии документа.
Идентификация является частью комплексной проверки клиента. В том же рабочем процессе проверяйте людей по более чем 1300 санкционным спискам, спискам PEP и другим спискам наблюдения ($0.20 за проверку), ежедневно перепроверяйте их с помощью постоянного мониторинга ($0.07 за человека в год) и верифицируйте компании и их владельцев.
Nordwind Handel GmbHКомпания · владельцы в зоне действия
0 / 1,327 listsЧистоОтправлено на проверку
K. Brandt · 60%A. Lindqvist · 40%
OFAC SDNSanctions
EU Consolidated SanctionsSanctions
UN Security CouncilSanctions
UK HM TreasurySanctions
PEP · Level 1 · Heads of statePEP
PEP · Level 2 · ParliamentPEP
PEP · Level 3 · Civil servicePEP
PEP · Level 4 · RCAPEP
Adverse media · Financial crimeMedia
Adverse media · FraudMedia
Adverse media · NarcoticsMedia
Regulatory enforcementWarnings
Fitness & probityWarnings
Interpol noticesCriminal
Special interest · SIPWarnings
Special interest · SIEWarnings
InsolvencyWarnings
G20 national listsSanctions
Custom watchlistsCustom
OFAC SDNSanctions
EU Consolidated SanctionsSanctions
UN Security CouncilSanctions
UK HM TreasurySanctions
PEP · Level 1 · Heads of statePEP
PEP · Level 2 · ParliamentPEP
PEP · Level 3 · Civil servicePEP
PEP · Level 4 · RCAPEP
Adverse media · Financial crimeMedia
Adverse media · FraudMedia
Adverse media · NarcoticsMedia
$0.20 / проверка
Посмотреть процесс
Что видит человек, на четырех экранах.
Межплатформенное представление, как описывает ARF: человек начинает на компьютере и заканчивает на телефоне, где хранится кошелек.
01Сканируйте, чтобы продолжить
Отсканируйте QR-код
Сервис показывает QR-код, и человек сканирует его приложением кошелька.
02Интернет-магазин запрашивает: возраст старше 18 лет
Просмотрите запрос
Кошелек показывает, кто запрашивает и какие атрибуты.
03Поделиться 1 атрибутом
Поделиться
Человек подтверждает, и только запрошенные атрибуты покидают телефон.
04Проверено
Проверено
Сервис проверяет подпись эмитента и продолжает работу. Ничего другого не было передано.
Иллюстрация стандартного процесса. Поддержка EUDI Wallet от Didit появится в ближайшее время.
Интегрируйте сегодня
Интегрируйте сегодня, чтобы быть готовым к появлению EUDI Wallet.
Пока нет специального API Didit для EUDI. Создайте сессию для рабочего процесса, который принимает действующие национальные электронные удостоверения личности и документы, затем прочитайте результат. Поддержка EUDI Wallet планируется на том же этапе верификации ID.
Подготовьтесь к EUDI Wallet с помощью одного промпта.
Скопируйте этот промпт в свой coding agent. Он создаст рабочий процесс, который вы можете запустить сегодня: действующие национальные электронные удостоверения личности с резервным документом, а также вызов сессии и подписанный вебхук. Он не создает конечную точку EUDI, потому что ее пока не существует.
didit-integration-prompt.md
# Didit: get ready for the EUDI Wallet with the ID Verification step you run today
You are adding electronic identification to my_stack so the product is ready
for the EU Digital Identity (EUDI) Wallet. Every URL, header and enum value
below is canonical. Do not paraphrase or "improve" them.
## 0. What exists today, and what does not
- EUDI Wallet acceptance on Didit is coming soon. There is NO EUDI-specific
endpoint, wallet id, field or flag to integrate yet. Do not invent one, do
not send any EUDI identifier in a workflow, and do not build an OpenID4VP
verifier yourself as part of this task.
- What is live: national digital ID wallets inside the ID Verification step,
with document capture (chip reading, liveness, face match) as the fallback.
EUDI Wallet acceptance is planned for the same ID Verification step, so the
workflow, session call and webhook you build now are the ones you keep.
- The live wallets, as listed by the methods catalog:
- MitID: wallet id mitid, country keys DNK (Denmark)
- BankID: wallet id bankid_se, country keys SWE (Sweden)
- Finnish Trust Network: wallet id ftn, country keys FIN (Finland)
- Smart-ID: wallet id smart_id, country keys EST (Estonia), LVA (Latvia), LTU (Lithuania), BEL (Belgium)
- Mobile-ID: wallet id mobile_id, country keys EST (Estonia), LTU (Lithuania)
Check the catalog for your environment before you go live. Never
hard-code dates.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Copy the API key of your application from the console.
## 2. Read the methods catalog
Availability is server-driven per country. Only wallets marked available can
be enabled on a live application.
- Business Console: your application -> Workflows -> the ID Verification
step -> Countries -> "Wallets accepted". Coming-soon wallets are listed
but cannot be switched on. https://docs.didit.me/console/id-verification-methods
- Didit MCP server (https://mcp.didit.me/mcp), tool
didit_workflow_get_id_verification_methods_catalog; pass country as ISO
3166-1 alpha-3 to narrow it. The MCP server signs in with "Log in with
Didit" (OAuth). It does not accept the x-api-key.
https://docs.didit.me/integration/mcp/tools
- Public coverage table (no sign-in, read-only):
https://docs.didit.me/core-technology/id-verification/digital-id-wallets#supported-wallets
If your code holds only an API key, it cannot read the catalog itself: use the
wallet ids listed in this prompt, and treat the answer of the workflow save as
the check. A live application answers 400 for a wallet that is not available
in that country ("<wallet> is not offered in <ISO3>", "unknown wallet").
## 3. Create the workflow (ID Verification = feature OCR)
POST https://verification.didit.me/v3/workflows/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["mitid"],
"on_failure": "fallback_to_document"
}
},
"EST": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["smart_id", "mobile_id"],
"on_failure": "fallback_to_document"
}
}
}
}
}
]
}
Response: 201. The workflow id is uuid (workflow_id carries the same value);
the workflow is published straight away. Create it once and keep the id:
every call to this endpoint makes a new workflow.
is_desktop_allowed defaults to false: on a desktop browser the hosted flow
then shows a QR code to continue on a phone. Add "is_desktop_allowed": true
next to workflow_label to let people finish on desktop.
Rules the API enforces:
- OCR is UPPERCASE; ID_VERIFICATION is rejected in this body (the decision
later lists the step as ID_VERIFICATION in its features)
- country keys are ISO 3166-1 alpha-3; method keys are document, id_lookup, wallet
- providers is an accept-list, not a ranking; the end user picks
- on_failure is fallback_to_document or decline
- a wallet the catalog does not mark available rejects the whole save (400)
- every other country keeps document capture, so people without an eID
can still verify
- this body runs document capture only. Chip reading, liveness and face
match are their own features: add { "feature": "NFC" },
{ "feature": "LIVENESS" } and { "feature": "FACE_MATCH" } to features
when your policy needs them
## 4. Create a session
POST https://verification.didit.me/v3/session/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{ "workflow_id": "<id from step 3>", "vendor_data": "<your user id>" }'
Response: 201 with session_id, session_token, url and status "Not Started".
Redirect the user to url (hosted flow) or open it in the Web, iOS, Android,
React Native or Flutter SDK. The field is named url on this response.
One unfinished session exists per workflow_id and vendor_data pair: calling
create again with the same pair answers 201 again with that same session.
## 5. Webhook
Register a destination in the console (API & Webhooks), or over the API:
POST https://verification.didit.me/v3/webhook/destinations/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{
"label": "Verification webhooks",
"url": "https://<your-public-host>/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'
label, url and subscribed_events are required. url must be a public HTTPS
address: Didit does not deliver to localhost or private addresses. Response:
201 with uuid and secret_shared_key. Store secret_shared_key as the webhook
secret (DIDIT_WEBHOOK_SECRET); it is unique to this destination. Remove a
destination with DELETE /v3/webhook/destinations/{uuid}/ (204).
What arrives:
- webhook_type is "status.updated" (the session changed status) or
"data.updated" (verification data was corrected after the fact)
- a destination receives the events of every session of the application,
so filter on workflow_id or vendor_data when several flows share it
- creating a session already sends status.updated with status
"Not Started". The decision key is present only when status is Approved,
Declined, In Review or Abandoned.
Verify every delivery:
Header: X-Signature-V2 (not X-Signature, not X-Signature-Simple)
Algorithm: HMAC-SHA256, hex digest, over the canonical JSON of the payload
(Python json.dumps(sort_keys=True, separators=(",", ":"),
ensure_ascii=False) after whole-valued floats become ints).
Never hash the raw request bytes under this header.
Freshness: the signed body field timestamp is the dispatch time (Unix
seconds). Reject when abs(now - timestamp) > 300 seconds, and
reject when the X-Timestamp header does not equal it.
Idempotency: event_id is the same on every retry of one event, so store it
and skip a delivery you already processed. One session can
still send the same status under two event ids, and the
console's Try Webhook test deliveries carry no event_id, so
also make the handler safe to run twice for one
(session_id, status, webhook_type).
Compare: constant-time (crypto.timingSafeEqual)
Reference handler (Express). Keep the verification lines as written.
The handler is a fragment. Put this above it and app.listen(process.env.PORT)
below it. It needs Express and Node 21 or newer (an older Node rejects
every delivery). It expects a JSON body: answer 400 yourself if you accept
anything else on this route, and refuse to start without the secret.
const express = require("express");
const app = express();
const SECRET = process.env.DIDIT_WEBHOOK_SECRET; // secret_shared_key of the destination
// Your endpoint receives a signed payload
const crypto = require("node:crypto"); // ESM: import crypto from "node:crypto"
// X-Signature-V2 = HMAC over the canonical JSON, never the raw bytes. Match the sender byte for
// byte: keys sorted by code point, integers digit for digit, floats in Python's repr.
class Num { constructor(src) { this.src = src; } } // a number as written on the wire, not a double
const num = (s) => { if (/^-?\d+$/.test(s)) return BigInt(s).toString(); const n = +s; // ints stay exact
if (Number.isInteger(n)) return BigInt(n).toString(); const [m, e] = n.toExponential().split("e"); // 27.0 -> 27
return +e >= -4 ? String(n) : `${m}e-${String(-e).padStart(2, "0")}`; }; // 1e-05, not 0.00001
const byCodePoint = (a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)); // UTF-8 order = Python's
const canon = (v) => Array.isArray(v) ? `[${v.map(canon)}]` : v instanceof Num ? num(v.src)
: v && typeof v === "object" ? `{${Object.keys(v).sort(byCodePoint).map((k) => `${JSON.stringify(k)}:${canon(v[k])}`)}}`
: JSON.stringify(v);
// Read the body as text: express.json() would round 1000000000000000129 to a double first.
// Register this route ABOVE any global app.use(express.json()): the first parser to run
// consumes the stream, and a body it already parsed has lost the digits the signature covers.
app.post("/webhooks/didit", express.text({ type: "application/json" }), (req, res) => {
const exact = JSON.parse(req.body, (k, v, c) => typeof v === "number" ? new Num(c.source) : v); // Node 21+
const body = JSON.parse(req.body);
const mac = crypto.createHmac("sha256", SECRET).update(canon(exact), "utf8").digest("hex");
const sig = Buffer.from(String(req.headers["x-signature-v2"] ?? ""));
// Freshness comes from the signed body timestamp; the header alone is unsigned and replayable.
const ts = body.timestamp, fresh = String(ts) === req.headers["x-timestamp"]
&& Math.abs(Date.now() / 1000 - ts) <= 300;
if (!fresh || sig.length !== mac.length
|| !crypto.timingSafeEqual(sig, Buffer.from(mac))) return res.sendStatus(401);
const { status, decision } = body;
// One entry per ID Verification node; pick yours by node_id when you run several.
const [idv] = decision?.id_verifications ?? [];
// idv.verification_method: "document" | "id_lookup" | "wallet"
res.sendStatus(200);
});
Status values (exact strings): Not Started, In Progress, Approved, Declined,
In Review, Resubmitted, Expired, Abandoned, Kyc Expired. Awaiting User only
appears on business verification sessions.
## 6. Read the result
The same V3 decision reaches you two ways:
- webhook body: body.decision.id_verifications[]
- GET https://verification.didit.me/v3/session/{session_id}/decision/
-H "x-api-key: <your-api-key>"
This response IS the decision object. Read id_verifications at the top
level: there is no decision wrapper here.
Until the user finishes the ID step, status is "Not Started" or "In Progress"
and id_verifications is null, not an empty array. Guard for it.
id_verifications[] has one entry per ID Verification node; with a single step
take index 0. A wallet sign-in sets:
verification_method "wallet"
assurance "cryptographic"
wallet_provider the catalog wallet id the user picked
wallet_verification provider, provider_name, issuing_authority,
issuing_country, credential_type, level_of_assurance,
verified_at, signature_valid, attributes, portrait
(null for the live wallets), face_match_score
fallback_from { method, reason, action } when the wallet sign-in failed
and on_failure declined the session; otherwise
null. After a document fallback that succeeds the
entry reads verification_method "document" with
fallback_from null
full_name, the normalised identity fields, on the entry itself
date_of_birth
On a live application, check wallet_verification.signature_valid before you
trust attributes. The
live wallets return name, date of birth and a scheme identifier (for example
the Swedish personnummer; MitID returns a pseudonymised identifier), never an
address or a portrait: collect those through other steps if your policy
needs them.
Reference: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
## 7. Billing
Only completed wallet sign-ins are billed; cancelled, timed-out and failed
ones are free. Prices per wallet: https://didit.me/pricing
## 8. Verify your integration
Sandbox (an application in sandbox mode: nothing is billed and no real eID is
called). https://docs.didit.me/integration/sandbox-testing
- a sandbox application can enable every wallet in the catalog, the
coming-soon ones included. A workflow that saves in sandbox can still be
refused on a live application, so only use wallets marked available.
- open the session url, pick the wallet and confirm: the default approve
scenario simulates the sign-in. The entry then has verification_method
"wallet", assurance "cryptographic" and wallet_provider set, and the
normalised full_name and date_of_birth are filled. But
wallet_verification.signature_valid and level_of_assurance are null and
attributes is { "sandbox": true }: no real credential was checked.
Assert signature_valid === true and the level of assurance only against
a live application.
- to exercise on_failure, create the session with
"sandbox_scenario": "wallet_cancelled" (also wallet_timeout and
wallet_provider_error). The wallet sign-in then fails and the flow moves
to document capture or declines, as on_failure says. A fallback that
ends in an approved document reads verification_method "document".
- POST /v3/session/{session_id}/simulate/ forces a final status but writes
no id_verifications entry, so it cannot stand in for a sign-in.
Checks:
- create the workflow, create a session, and read its decision: expect 201,
201 with url, and 200 with status "Not Started"
- run one sandbox session per accepted wallet through the hosted flow and
assert verification_method is "wallet" and wallet_provider is the wallet
you picked
- run one session with sandbox_scenario "wallet_cancelled" and assert the
flow offers document capture
- assert the webhook accepts a correctly signed payload and rejects a wrong
X-Signature-V2, a changed body, and a payload whose signed timestamp is
older than 300 seconds, even when X-Timestamp is refreshed
- on a live application, assert wallet_verification.signature_valid is true
Docs: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
Соответствие по умолчанию
Откройте новую страну в один клик. Мы берем на себя сложную работу.
Мы открываем местные дочерние компании, получаем лицензии, проводим пентесты, получаем сертификаты и адаптируемся к каждому новому регулированию. Чтобы запустить верификацию в новой стране, просто переключите тумблер. Более 220 стран в работе, ежеквартальные аудиты и пентесты, единственный провайдер идентификации, который правительство страны-члена ЕС официально назвало более безопасным, чем личная верификация.
Стран ЕЭЗ, участвующих в развертывании EUDI Wallet
220+
Стран и территорий с поддержкой верификации по документам
Три тарифа, один прайс-лист
Начните бесплатно. Платите по мере использования. Масштабируйтесь до Enterprise.
500 бесплатных верификаций каждый месяц, навсегда. Затем платите только за фактически использованные модули. Для тарифа Enterprise доступны индивидуальные контракты, размещение данных и соглашения об уровне обслуживания (SLA).
Бесплатно
$0/ месяц · без карты
Для разработки, тестирования и первых пользователей.
Всё, что нужно для старта:
500 полных KYC-проверок ежемесячно
Проверка ID, Liveness, Face Match, устройства и IP
Более 200 сигналов мошенничества, чёрный список, дубликаты
Повторное использование KYC в сети Didit
Конструктор рабочих процессов, управление кейсами, SDK
AI-поддержкаAI-агент в консоли, документация и сообщество.