Архитектура
Аутентификация
Используется стандартный заголовокx-api-key. Те же ключи применяются для сессий и сущностей. См. аутентификация API.
Отправка транзакции
Единственный endpoint:POST /v3/transactions/. Полную схему см. в разделе отправка транзакций.
Минимальный payload:
txnId, txnDate, type, info, applicant, props, travelRule, includeCryptoScreening). Формат передачи данных SDK и формат snake_case попадают в одно и то же место.
Моделирование сторон
У каждой транзакции есть обязательное полеsubject (ваш клиент, которого вы отслеживаете) и необязательное поле counterparty (другая сторона). У каждой из них свой payment_method и необязательный контекст device.
В ответе они приходят в массиве parties с ролями APPLICANT и COUNTERPARTY. Сторона без vendor_data сохраняется как внешний снимок (kind: EXTERNAL) без связанной сущности.
Поля сторон см. в разделе payload транзакций.
Идемпотентность
txn_id (то есть transaction_id, который вы отправляете) уникален в рамках приложения.
Повторная отправка существующего transaction_id возвращает 400 с сообщением A transaction with this transaction_id already exists. в поле transaction_id. Если два одинаковых запроса выполняются одновременно, второй получает 409.
Ни один из этих ответов не возвращает существующую транзакцию.
При ответе 400 или 409 для дублирующегося transaction_id не отправляйте запрос повторно, а найдите существующую транзакцию. Прочитайте её через GET /v3/transactions/{uuid}/, используя uuid из первого ответа, или используйте transaction_id (uuid Didit), который событие transaction.created передаёт рядом с вашим txn_id.
Всегда генерируйте txn_id на своей стороне до отправки. Не полагайтесь на ID, который генерирует Didit, для идемпотентности. Используйте собственный ID из базы данных, UUID или хеш полей транзакции.
Реальное время и пакетная обработка
- Реальное время: рекомендуется для большинства сценариев. Отправляйте транзакцию в момент её появления в вашей системе. Правила выполняются синхронно и возвращают решение.
- Пакетная обработка и загрузка истории: для импорта исторических данных передавайте
txn_dateв прошлом. Правила всё равно выполняются и могут запускать webhook. Чтобы не запускать правила при загрузке истории, используйте импорт CSV в консоли с флагом “dry ingest”.
Импорт исторических данных
Если вы переходите с другой системы мониторинга транзакций:- Экспортируйте исторические транзакции в CSV.
- Используйте Transactions → Import history в консоли (или отправляйте данные через API в цикле) с
txn_dateв прошлом. - Включайте правила только после завершения импорта или используйте dry ingest, чтобы пропустить выполнение правил.
Webhook
Подпишитесь на:transaction.created: каждая отправленная транзакция.transaction.status.updated: изменения статуса (например, когда аналитик переводит транзакцию изIN_REVIEWвAPPROVEDили когда асинхронная проверка AML обновляет оценку).
Обработка статусов
См. статусы TM.
Связывание транзакций с сущностями
Передавайтеvendor_data для каждого участника. Это даёт следующие преимущества:
- Каждая транзакция агрегируется в профиль пользователя или компании.
- Правила по скорости и поведению имеют полную историю для оценки.
- Блокировка сущности автоматически распространяется на будущие транзакции.
vendor_data не является жёсткой ошибкой: транзакция сохраняется как внешний снимок. Однако вы теряете агрегацию на уровне сущностей.
Сессии устранения
Когда действие правила переводит транзакцию в статусAWAITING_USER, Didit автоматически создаёт сессию устранения: стандартную размещённую сессию верификации для того же vendor_data.
Пользовательские правила всегда указывают сценарий прямо в самом действии. Для встроенных правил из библиотеки сценарий берётся из сценария устранения в настройках транзакций, затем из сценария Биометрическая аутентификация вашего приложения (если у субъекта есть сохранённое эталонное лицо), затем из сценария по умолчанию вашего приложения.
Транзакции Travel Rule исключены из этого автоматического выбора: их ожидающее действие - подтверждение владения кошельком.
Транзакция (ответ, каждое последующее чтение и каждый webhook) содержит его в каноническом блоке action_required:
remediation сохранён для обратной совместимости; action_required является каноническим блоком (он также содержит действия wallet_ownership для переводов по Travel Rule).
Действие wallet_ownership само по себе не меняет статус транзакции: транзакция сохраняет тот статус, который ей присваивают ваши правила, часто APPROVED, поэтому проверяйте action_required в каждом ответе, а не только при AWAITING_USER.
Пользователь проходит верификацию. Для сценария Биометрическая аутентификация это селфи с проверкой живости, сопоставленное с лицом, полученным при его исходном онбординге KYC, и это самый строгий дополнительный шаг для транзакций высокой стоимости.
Как только сессия получает решение, транзакция следует ему автоматически: APPROVED (decision_reason_code: user_action_approved), DECLINED (user_action_declined) или IN_REVIEW (user_action_in_review), и срабатывает webhook transaction.status.updated.
Можно выбрать любой тип сценария, кроме KYB.
Сценарии Биометрическая аутентификация (а также сценарии, где сравнение лиц выполняется до верификации личности) требуют, чтобы у субъекта уже было сохранённое эталонное лицо из одобренной верификации. Пользователи без него направляются в сценарий по умолчанию вашего приложения, а в транзакции фиксируется примечание о такой замене.
Лучшие практики
Лимиты запросов
См. ограничение частоты запросов. Создание транзакции - один из самых высоконагруженных endpoint’ов; типичные лимиты составляют сотни запросов в секунду. Соблюдайте осторожность при отправке всплесков запросов.Следующие шаги
Транзакции
Полный справочник по payload.
Правила
Как оцениваются правила.
Webhook
Каталог событий.
Устранение неполадок
Частые проблемы интеграции.