Каталог событий
События уровня сущностей (
user.status.updated, business.status.updated) также могут возникать как следствие активности транзакций: см. webhook сущностей.
Приложения в песочнице не отправляют webhook
transaction.created или transaction.status.updated. Чтобы протестировать эти события, используйте приложение в продакшн-среде или API & Webhooks → Try Webhook в консоли. Обмены Travel Rule в песочнице отправляют webhook travel_rule.status.updated с environment: sandbox; чтобы проверить обмен перед запуском в продакшн, используйте Didit Test VASP.Структура сообщения
Webhook Didit используют плоское тело: поля события находятся на верхнем уровне рядом с полями конверта, вложенного объектаdata нет.
Каждая доставка содержит:
Структура payload
transaction.created и transaction.status.updated
Оба события используют одну структуру payload: краткую сводку и блок action_required (или null):
GET /v3/transactions/{transaction_id}/. Она содержит полные данные (стороны, rule_runs, provider_results, travel_rule, cost_breakdown, decision_reason_code), включая причину изменения статуса.
transaction_rule_suggestions.created
Это событие касается вашего набора правил, а не одной транзакции, поэтому идентификатора транзакции в нём нет.
Оно никогда не содержит персональных данных: только идентификаторы предложений, их типы, названия и количество.
Стандартные поля конверта (
event_id, timestamp, application_id, environment) добавляются в тело.
travel_rule.status.updated
FINISHED, CANCELLED или EXPIRED. Когда перевод достигает одного из этих статусов, для него больше не отправляются события Travel Rule.
Событие может повторять предыдущий статус, например когда повторная отправка снова не находит канал и перевод остаётся в COUNTERPARTY_VASP_NOT_FOUND.
rail принимает значения INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP (перевод в песочнице, на который ответил Didit Test VASP; он также содержит test_vasp: true и test_vasp_scenario) или "", пока канал не выбран (для регистраций sunrise всегда "").
При создании транзакции, регистрации sunrise, входящем запросе TRP или входящей части по каналу INTERNAL Didit сначала отправляет transaction.created, а затем события travel_rule.status.updated этой транзакции.
Правило, которое меняет статус транзакции на этом шаге, может также отправить transaction.status.updated до transaction.created.
Регистрация sunrise, привязанная к уже созданной вами транзакции депозита, transaction.created не отправляет.
Каждый webhook доставляется отдельно, и для него отдельно выполняются повторные попытки, поэтому повторно отправленное событие может прийти после более позднего. Привязывайте обработчик к transaction_id и при необходимости повторно запрашивайте транзакцию, чтобы получить её текущее состояние.
Примеры сценариев статусов
Простое одобрение
Проверка с последующим одобрением
Дополнительная верификация
Перевод по Travel Rule
transaction.created ставится в очередь первым. Каждый webhook доставляется отдельно, поэтому не полагайтесь на порядок прихода.
Перевод, отправленный по TRUST, никогда не получает событие COMPLETED, потому что TRUST не возвращает Didit ничего, что тот может прочитать: перевод остаётся в AWAITING_COUNTERPARTY до срока подтверждения, а затем переходит в EXPIRED. По GTR, VerifyVASP и Sygna Bridge Didit читает ответ контрагента из сети, и событие следует за этим ответом.
Проверка подписи
Каждая доставка подписывается по HMAC-SHA256 с использованием общего секрета адреса назначения и содержит три заголовка подписи и отметку времени:Повторные попытки и гарантии доставки
- При ответе
5xx,404, таймауте или сбое соединения Didit повторяет доставку до 2 раз: примерно через 1 минуту после первой ошибки, затем ещё примерно через 4 минуты. - Повторные доставки используют тот же
event_id. Устраняйте дубликаты по этому полю в вашем обработчике. - После последней неудачной попытки доставка этого события прекращается, и ваша организация получает уведомление. Адреса назначения никогда не отключаются без уведомления.
- Быстро возвращайте ответ
2xx: сначала поставьте событие в очередь, затем обработайте его. Медленные подтверждения (ACK) создают риск таймаутов и повторных доставок.
Идемпотентность
Обрабатывайте каждый webhook ровно один раз, сохраняяevent_id в собственном хранилище для устранения дубликатов. Повторная доставка того же события возможна, если ваш endpoint отвечает медленно или разрывает соединение во время запроса.
Подписка
Дальнейшие шаги
Справочник по webhook
Адреса назначения, подписи, повторные попытки.
Статусы
Полная модель состояний.
Руководство по интеграции
Обработка webhook в продакшне.