Перейти к основному содержанию
Песочница Didit аналогична тестовым картам Stripe или шаблонам документов Sumsub: она позволяет воспроизвести любой результат верификации детерминированно, без обращения к реальным провайдерам, реальным персональным данным и без списания с вашего баланса.
Источником истины для этих данных является serialize_catalog() в сервисе верификации, который отдаётся в реальном времени по адресу GET /v1/sandbox/scenarios/. Копия, проверенная на отсутствие расхождений, генерируется в docs/sandbox/SANDBOX_REFERENCE.md в репозитории service-didit-verification командой pipenv run python scripts/generate_sandbox_reference.py. Эта страница дублирует данный справочник. Если что-то здесь кажется устаревшим, всегда ориентируйтесь на эндпоинт каталога в реальном времени. Эндпоинт каталога требует авторизации: передайте ваш API-ключ в заголовке x-api-key, как и при любом другом вызове, или токен сессии, если вы читаете его изнутри запущенной сессии.

Модель среды

Песочница — это режим на уровне приложения (ApplicationDetail.mode == SANDBOX), по той же логике, что и тестовый режим в Stripe. Пока сессия выполняется в песочнице приложения:
  • Каждый внешний провайдер (OCR, AML, сравнение лиц, проверка живости, NFC, телефон, email, IP, POA, проверка по базам данных, ИИ для работы с документами) имитируется: к третьим сторонам никогда не обращаются.
  • Проверка живости работает точно так же, как в продакшн-среде. Сценарий с активной проверкой живости запускает настоящую активную съёмку в песочнице, как в размещённом потоке, так и при передаче в веб через нативные SDK, чтобы вы могли протестировать тот опыт, который получат ваши пользователи. Симулируется только результат проверки живости, задаваемый сценарием или магическим значением, а в отчёте фиксируется метод, который настроен в вашем сценарии.
  • Пользовательские домены работают только в продакшне. Приложение песочницы не может добавить пользовательский домен; сессии песочницы всегда выполняются на домене размещённой страницы верификации по умолчанию.
  • Сессии никогда не тарифицируются, а проверка баланса пропускается.
  • Для каждого приложения действует квота 500 операций создания сессий за 24 часа.
  • Сообщения webhook содержат "environment": "sandbox" (сессии продакшна содержат "environment": "live").
  • Размещённый поток передаёт среду сессии, чтобы интерфейс мог предупредить пользователей о том, что не следует загружать реальные персональные данные.
  • Результаты никогда не зависят от пикселей: извлечённые данные и статусы берутся из сценария или магического значения. Сами захваченные медиафайлы (документы, селфи, видео, файлы POA) действительно сохраняются, точно так же, как в сессии продакшна.

Мониторинг транзакций в песочнице

Песочница работает по модели сессии: она имитирует провайдеров, которых вызывала бы сессия верификации. У мониторинга транзакций нет провайдера для имитации, поэтому приложение в песочнице работает иначе: транзакция сохраняется, но ничего из того, что принимает решение, проверяет, отправляет уведомления или выставляет счёт, с ней не выполняется. Транзакция, созданная в приложении песочницы, сохраняется и возвращается как обычно, но с ней не происходит следующее:
  • Нет оценки по правилам. rule_runs пуст, независимо от режима ваших правил. Правило ACTIVE в приложении песочницы никогда не срабатывает, поэтому транзакция остаётся APPROVED с оценкой 0, и оповещение или кейс не создаются.
  • Нет AML- и скрининга кошельков. provider_results пуст даже для криптотранзакций в приложении с включённым мониторингом.
  • Нет событий webhook. Ни transaction.created, ни transaction.status.updated для транзакции песочницы не доставляются.
  • Нет биллинга. Событие использования записывается по цене 0.0000, и ваш баланс не меняется.
Каждый ответ по транзакции содержит поле environment ("live" или "sandbox"), поэтому пустой rule_runs никогда не бывает неоднозначным: "sandbox" означает, что правила не оценивались, а не то, что ни одно из них не сработало. Business Console сообщает то же самое в карточке Risk & decision транзакции вместо простого «Правила не оценивались».
Travel Rule: единственное исключение из правила «ничего не выполняется». В приложении с включённым Travel Rule транзакция travelRule в песочнице всё равно запускает движок обмена: создаётся запись о переводе, и она проходит через свои статусы. Песочница никогда не связывается ни с кем за пределами Didit. Её единственный контрагент, Didit Test VASP, встроен в платформу: никакое сообщение комплаенса не доходит до реального контрагентского VASP через один из каналов (TRP, подключённую вами сеть, электронную почту или INTERNAL), скрининг атрибуции контрагентского VASP не выполняется, а отмена никуда не отправляет сообщений контрагенту. События webhook travel_rule.status.updated доставляются и помечаются "environment": "sandbox".Исходящая: транзакция travelRule, которую вы отправляете. Сначала выполняется проверка threshold_amount. В песочнице она применяется только тогда, когда вы передаёте transaction_details.amount_in_default_currency, потому что песочница не конвертирует валюты. Без этого поля каждый перевод в песочнице считается выше порога. Если на перевод никто не отвечает, он истекает через confirmation_timeout_hours, и тогда к транзакции применяется ваш timeout_outcome. Выше порога обычная проверка объявленного некастодиального кошелька работает как обычно: перевод на объявленный некастодиальный кошелёк переходит в UNCONFIRMED_OWNERSHIP без отправки чего-либо. Завершить его в песочнице можно через виджет подтверждения владения кошельком или через подтверждение владения, если целевой кошелёк уже есть в адресной книге кошельков. Любой другой перевод выше порога направляется в Didit Test VASP по каналу TEST_VASP. Он отвечает внутри Didit сценарием, который вы выбираете по кошельку или имени получателя: перевод завершается, отклоняется, данные не совпадают, переходит в COUNTERPARTY_VASP_NOT_REACHABLE, истекает (тогда к транзакции применяется ваш timeout_outcome) или ждёт подтверждения владения кошельком. Все сценарии см. в Test Travel Rule в песочнице.Входящая: POST /v3/travel-rule/inbound/. Регистрация никогда не отправляет сообщение по каналу, поэтому в ней ничего не моделируется: песочница сопоставляет поступление с вашей адресной книгой кошельков и завершает его синхронно, точно так же, как продакшн-среда. Результатом становится реальный исход, а не AWAITING_COUNTERPARTY: ON_HOLD (совпадения в адресной книге нет), UNCONFIRMED_OWNERSHIP (совпавшая запись не прошла проверку владения), COUNTERPARTY_MISMATCHED_DATA (имя получателя не совпадает с владельцем кошелька) или COMPLETED, затем FINISHED (найдена проверенная запись). Чтобы получить перевод от Didit Test VASP, используйте Запустить входящий перевод от Test VASP с одним из кошельков вашей адресной книги.

Сценарии Test VASP для Travel Rule

Каталог travel_rule.scenarios перечисляет эти исходящие сценарии. Задайте имя получателя ниже для исходящей транзакции travelRule после включения Travel Rule в приложении песочницы. Проверки порога и объявленного некастодиального кошелька, описанные выше, выполняются первыми. Сценарий можно выбрать и по адресу кошелька получателя вместо имени (если заданы оба, приоритет у кошелька). Перевод, в котором не указаны ни имя, ни кошелёк, завершается как accept. В Test Travel Rule в песочнице перечислен кошелёк каждого сценария и его точный результат. Триггер входящего перевода Test VASP принимает в поле scenario только значения accept и name_mismatch.
Как проверить правило перед запуском в продакшн. Используйте Backtest: он повторно применяет правило к вашей реальной истории транзакций и сообщает evaluated / matched / affected_entities, не меняя статус ни одной транзакции. Сочетайте его с режимом TEST в продакшн-приложении: правило в режиме TEST оценивает каждую новую продакшн-транзакцию и фиксирует, что оно бы сопоставило, не меняя оценку или статус. Когда селективность вас устроит, переключите правило в ACTIVE.

Как переключаться между live и песочницей

Live и песочница - это отдельные приложения, поэтому тестовый трафик и продакшн-данные никогда не смешиваются. У каждого приложения есть mode со значением live или sandbox:
  • Используйте API-ключ приложения в режиме sandbox, чтобы получать смоделированные сессии без списания средств, в которых результат можно задать.
  • Используйте API-ключ приложения в режиме live для реальных верификаций.
Поле sandbox_scenario (при создании сессии и в отдельном AML API), а также эндпоинты симуляции принимаются только в приложениях песочницы. В live-приложениях они отклоняются.

Песочница в размещённом процессе верификации

Сессии, созданные в приложении песочницы, показывают дополнительный интерфейс в размещённом процессе верификации (по url, который возвращает POST /v3/session/):
  • Баннер песочницы внутри карточки. На каждом экране внутри карточки показан баннер “Только тестовые данные - реальных вызовов нет”. Так всегда видно, что сессия не обращается к реальным провайдерам и не затрагивает ваш баланс. Записанные медиафайлы сохраняются так же, как для любой сессии, поэтому используйте образцы документов и тестовые данные, а не настоящие документы, удостоверяющие личность, и персональные данные.
  • Выбор сценария до начала процесса. До начала съёмки карточка предлагает выбрать тестовый результат: сначала выберите результат, затем триггер для него. После подтверждения вызывается POST /v3/session/{session_id}/sandbox/arm/ (см. Активация (или повторная активация) сессии перед стартом процесса ниже), после чего процесс продолжается с уже применёнными магическими значениями этого сценария.
  • Полоса образцов документов. Непосредственно под компонентом загрузки и съёмки документов расположена строка образцов документов песочницы (до 3). Нажмите на образец, чтобы использовать его вместо реальной загрузки.
Сессии песочницы сохраняют реальные записанные медиафайлы: документы, селфи, видео проверки живости и файлы подтверждения адреса загружаются и хранятся точно так же, как для live-сессии. Извлечённые данные (поля верификации личности, оценки совпадения лиц, результаты проверки живости и подобные) и сам результат сессии (одобрена / на проверке / отклонена) задаются сценарием или магическим значением и никогда не выводятся из записанных медиафайлов. В Business Console разделы с извлечёнными данными сессии песочницы помечаются чипом Смоделированные данные, чтобы проверяющие сразу видели, какие части сессии реальные, а какие заданы сценарием.

Сценарии

Каждый сценарий представляет собой именованный набор магических значений. Передайте его slug в sandbox_scenario при создании сессии (или в endpoint симуляции), чтобы воспроизвести нужный результат. Сценарии review_* нужны, чтобы протестировать UX ручной проверки (очередь проверки в консоли, webhook In Review, действия проверяющего «одобрить» и «отклонить») без входных данных, которые приводят к отклонению. Два сценария kyb_* выше задают expected_details.registration_number вместо expected_details.first_name: они применяются только к сессиям верификации бизнеса (KYB).

Магические значения

Магическое значение — это конкретное входное значение, которое заставляет одну имитируемую функцию выдать определённый риск. Чтобы его вызвать, задайте поле ввода равным магическому значению (напрямую или через сценарий).

Поиск без документов и идентификационные кошельки

Приложения в песочнице могут включить все идентификационные кошельки из каталога стран, в том числе кошельки, недоступные в продакшн-приложениях. Сценарий approve по умолчанию имитирует подтверждённую личность без входа во внешний кошелёк. Результат сохраняется в сессии, после чего выполняется следующий шаг сценария. Песочница не проверяет реальные учётные данные кошелька и не взимает плату за имитируемые попытки. Запросы поиска по-прежнему проверяют введённые поля и используют настроенный лимит попыток, по умолчанию равный одной попытке. Для проверки повторных попыток и правил перехода к резервному варианту используйте следующие сценарии: В зависимости от настройки страны сбои кошелька приводят к переходу к съёмке документа или к отказу. Завершённые попытки поиска учитываются отдельно, поэтому две разрешённые попытки дают два результата до перехода к резервному варианту. Всё использование песочницы остаётся бесплатным.

Проверка банковского счёта

Песочница для шага банковской верификации предлагает оба способа в каждой стране, в порядке, заданном шагом, на имитируемом сервисе без банка и без оплаты. При порядке по умолчанию человек начинает со входа в банк и выбирает Введите реквизиты счёта, чтобы выполнить проверку счёта; задайте bank_method_order как ["account_lookup", "open_banking"], чтобы начать с неё. Последние четыре символа введённого счёта определяют ответ; все окончания и действительный счёт для каждого формата см. в разделе Проверка в песочнице. API проверки счёта для ключа песочницы возвращает ответы по тем же окончаниям.

Los documentos de muestra

Nunca subas documentos de identidad reales en el sandbox. Usa en su lugar los documentos de muestra integrados.
El flujo alojado ofrece tres documentos de muestra, uno por tipo de documento: Toca una muestra de la tira para usarla en lugar de una captura real. Los datos extraídos y el resultado de la sesión siempre provienen del escenario o valor mágico seleccionado, así que cualquier muestra funciona con cualquier escenario.

Identidad de muestra: pruebas de expected_details

Cada documento del sandbox se fabrica a partir de una identidad fija. Los valores extraídos son los mismos en cada sesión y nunca se derivan de la fecha actual, así que puedes rellenar expected_details con ellos y comprobar de principio a fin el manejo de las comprobaciones de comparación de campos y de las advertencias. Pasa los valores que se indican abajo y las comprobaciones de comparación se superan; pasa cualquier otro valor y se activa a propósito la advertencia *_MISMATCH_WITH_PROVIDED correspondiente. Las fechas son comunes a todos los documentos de muestra: El resto de la identidad depende del documento que uses:
first_name y last_name son la excepción: el sandbox repite en el documento fabricado los nombres que envías en expected_details, así que la comparación de nombres se supera con cualquier nombre. Usa el valor mágico SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED para probar una discrepancia de nombre, y SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED para una discrepancia de fecha de nacimiento.
Si tu flujo restringe documents_allowed a un país o tipo de documento que excluye el ePassport de Brasil, el sandbox fabrica en su lugar un documento del primer país permitido, así que nationality, id_country y el nombre del documento siguen a ese país. Las fechas indicadas arriba no cambian.

Lo que el documento fabricado no incluye

El documento fabricado es la plantilla genérica del país y tipo de documento permitidos, así que los campos que solo proporciona un documento real emitido por el Estado quedan vacíos. El que importa para el enrutamiento es la región / estado de EE. UU. (kyc.region): un permiso de conducir o una identificación de EE. UU. del sandbox no tiene estado, así que una condición de bifurcación como Region equals IL nunca se cumplirá en el sandbox y, si tampoco se cumple ninguna otra rama del nodo, el flujo toma la rama de respaldo del nodo (la rama sin condiciones). Esto no es una revisión ni un fallo de la rama: la condición simplemente no tiene nada que leer. Un campo ausente también hace fallar not equals y not in; consulta cómo leen las condiciones de bifurcación los datos de la sesión para ver la diferencia entre un campo ausente y una cadena vacía. Para probar un flujo que depende del estado en el sandbox, decide la bifurcación a partir de un valor que controles en la sesión y no a partir del documento:
  • Envía el estado en metadata al crear la sesión (por ejemplo, "metadata": {"credential_state": "IL"}) y bifurca según metadata.credential_state. Los metadatos se evalúan en el sandbox exactamente igual que en producción.
  • Conserva la condición kyc.region, derivada del documento, para el tráfico en producción si también necesitas que el documento demuestre el estado; en modo producción la región se lee del documento real.
Lo demás del enrutamiento es idéntico a producción: el grafo del flujo, las condiciones de bifurcación, los valores de metadata y expected_details, los nodos de acción y los nodos de estado se ejecutan de verdad. El sandbox nunca envía una sesión a revisión por su cuenta: una sesión del sandbox termina En revisión solo cuando el flujo la dirige allí (un escenario review_*, un valor mágico asignado a una acción de revisión o un nodo de estado en el grafo).

Códigos OTP y suscripción al envío de correos

  • OTP de teléfono: la comprobación de teléfono del sandbox acepta cualquier código bien formado (de 4 a 8 dígitos; incluido 123456). Una entrada mal formada sigue devolviendo 400.
  • OTP de correo electrónico: la comprobación de correo del sandbox acepta cualquier código bien formado (incluido 123456). Una entrada mal formada sigue devolviendo 400.
Por defecto, las sesiones del sandbox no envían correos (alertas de revisión, cambios de estado, OTP, reenvío de la verificación, nuevos enlaces de sesión, etc.). Para enviar un correo de todas formas, usa uno de estos patrones de suscripción en la dirección del destinatario:

Управление результатами: сценарии, магические значения, предварительная настройка и endpoint simulate

Есть пять способов управлять результатом в песочнице.

1. sandbox_scenario при создании сессии

Укажите slug сценария при создании сессии (POST /v3/session/). Процесс создания раскрывает встроенные в сценарий магические значения в поля ввода сессии, поэтому имитированные провайдеры возвращают нужный результат через реальный конвейер сценария.

2. Магические значения, введённые вручную

Задайте отдельные поля ввода самостоятельно, например expected_details.first_name = "SANDBOX_OCR_DOCUMENT_EXPIRED" или user_email = "sandbox+aml_hit@didit.test". Полный реестр см. в таблице магических значений выше.

3. Предварительная настройка (или повторная настройка) сессии до начала верификации

Задайте или замените настроенный сценарий у уже существующей сессии, пока она не перешла дальше статуса Not Started. Этот endpoint вызывает выбор сценария до начала верификации. Вы также можете вызвать его самостоятельно, чтобы создать собственный выбор сценария или тестовый стенд:
Ответ 200:
  • Аутентифицируйтесь с помощью собственного Session-Token сессии (возвращается как session_token при создании сессии), а не с помощью API-ключа приложения. Это эндпоинт для клиентской стороны.
  • Возвращает 400 для неизвестного slug сценария, а также 400, если сессия перешла дальше Not Started ("Scenario can only be armed before the verification starts.").
  • Возвращает 404, если Session-Token принадлежит продакшн-приложению (не песочнице) или не совпадает с session_id в пути.
  • Повторная настройка заменяет предыдущий сценарий. Очищаются только магические значения, которые записал предыдущий сценарий, а всё, что пользователь ввёл вручную (email, имя и т. д.), остаётся без изменений. Например: если вы настроили decline_phone_high_risk, а затем approve, номер телефона возвращается к пустому значению, но email, введённый клиентом, сохраняется после обоих вызовов.

4. Endpoint simulate

Принудительно установите конечный статус постфактум:
  • Консоль или API-ключ (требуется привилегия write:sessions; API-ключу с ограниченными правами нужен доступ на запись к сессиям): POST /v3/session/{session_id}/simulate/
  • Размещённый поток (заголовок Session-Token): POST /v3/session/{session_id}/sandbox/simulate/
Оба варианта работают для сессий песочницы KYC и KYB. Для продакшн-сессии возвращается 404, и такой же ответ возвращается, если Session-Token не совпадает с session_id в пути. Все поля тела запроса необязательны, но необходимо указать хотя бы одно из полей new_status, scenario или risk: send_webhooks: true отправляет именно те webhook, которые отправляет реальное изменение статуса: status.updated, а также события user.status.updated и user.data.updated (или business.status.updated и business.data.updated для сессии компании), которые вызывает это изменение, всем адресам назначения webhook, подписанным на них. При send_webhooks: false статус всё равно меняется, но webhook не записывается в журнал и не отправляется. Механизм восстановления пропущенных webhook никогда не отправляет это решение повторно, а консоль при этом обновляется в реальном времени. Следующее изменение статуса сессии отправляет webhook в обычном режиме.
Ответ 200:
  • Поле status содержит статус, который установила симуляция, а previous_status содержит статус, который был у сессии до неё.
  • scenario возвращает ваш slug, а в risk указан применённый кейс риска; каждое из полей равно null, если его нет.
  • send_webhooks возвращает применённое значение.
  • Возвращает 400 для неизвестного сценария или риска, если нельзя определить new_status, для любого другого new_status, а также если у сессии уже есть запрошенный статус (["The new status is the same as the current status."]).

5. sandbox_scenario в отдельном AML API

У серверного AML-скрининга нет конечного пользователя и сессии, которую можно настроить, поэтому slug указывается в самом запросе на скрининг (POST /v3/aml/):
  • decline_aml_hit возвращает одно совпадение в формате продакшна и завершает скрининг со статусом Declined; review_aml_possible_match завершает его со статусом In Review. Сценарий, который не настраивает результат AML, оставляет скрининг чистым.
  • При save_api_request: true (по умолчанию) скрининг сохраняется точно так же, как при работе с продакшн-ключом, поэтому возвращённый request_id можно использовать в GET /v3/session/{request_id}/decision/ и GET /v3/session/{request_id}/generate-pdf/.
  • Возвращает 400 для неизвестного slug сценария, а также 400, если API-ключ принадлежит продакшн-приложению.

Где появляется sandbox_scenario

Slug настроенного сценария (null, если сценарий не настроен) возвращается в одних интерфейсах API и намеренно опускается в других: Если вашей интеграции нужно ветвить логику на стороне сервера в зависимости от настроенного сценария, читайте его из конверта webhook или из любого из endpoint решения (v1 или v3).

Биллинг и использование

Использование песочницы учитывается, но никогда не тарифицируется:
  • Каждый замоканный вызов всё равно записывает событие использования (is_sandbox: true, стоимость 0.0000), чтобы объём запросов в песочнице был виден для отладки. Однако такие события никогда не добавляются к вашим итоговым показателям использования, никогда не списываются с баланса и никогда не попадают в счёт.
  • Баланс, пополнение и показатели использования в продакшн-среде в Business Console по умолчанию отфильтровывают использование песочницы. Эндпоинты использования, связанные с пополнением баланса, принимают параметр environment (live, значение по умолчанию, или sandbox), чтобы объём запросов в песочнице можно было просматривать отдельно. При этом его стоимость всегда нулевая, и он не расходует бесплатный тариф.
  • Проверка электронной почты и проверка телефона тарифицируются за каждый запрос, а не за результат по сессии, и песочница не может полностью воспроизвести это на уровне webhook. Проверки электронной почты и телефона в песочнице всё равно записывают событие использования за каждый запрос по стоимости 0.0000, как и любая другая замоканная функция. Это принятое, известное расхождение с поведением биллинга в продакшене, а не ошибка.
  • Формат ответа проверки по базам данных в песочнице намеренно отличается от формата конкретного провайдера в продакшене, поскольку реального провайдера для воспроизведения нет. Относитесь к payload проверки по базам данных в песочнице как к заменителю результата (статуса и кода предупреждения), а не как к побайтовой копии ответа реального провайдера.
Последнее изменение 7 ноября 2026 г.