Перейти к основному содержанию
POST
curl

Некастодиальные кошельки

Когда для кошелька контрагента указано, что он некастодиальный (counterparty.payment_method.method_type: "unhosted_wallet"), перевод ожидает в статусе UNCONFIRMED_OWNERSHIP. Вызов этого endpoint с confirmed: true фиксирует, что ваш клиент подтвердил, кто контролирует этот кошелёк, и завершает перевод (COMPLETED) как для исходящих выводов, так и для входящих депозитов. Входящий депозит, ончейн-хэш которого уже известен, переходит в статус FINISHED. Проверяется кошелёк контрагента: кошелёк назначения исходящего вывода или источник входящего депозита, то есть кошелёк отправителя. Didit добавляет его в адресную книгу кошельков с отметкой о подтверждённом владении и привязывает к имени контрагента, поэтому сверка выполняется по имени контрагента (для депозита по имени отправителя). Если в адресной книге этот кошелёк уже записан на другое имя владельца, перевод переходит в статус COUNTERPARTY_MISMATCHED_DATA. Если в переводе не указан кошелёк контрагента, передайте wallet_address в теле запроса. Если ни перевод, ни запрос не содержат адрес кошелька, запрос отклоняется с ошибкой 400. confirmed: false отклоняет перевод (COUNTERPARTY_VASP_GENERAL_DECLINE).

Авторизации

x-api-key
string
header
обязательно

API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в Business Console. Основной ключ имеет полный доступ. Именованный ключ может иметь ограниченную область действия: без доступа, чтение или запись для каждого ресурса, ограничение определенными сценариями или одобренными сессиями, списком IP-адресов и сроком действия. 401 означает, что ключ неверен, отозван или его срок действия истек; 403 означает, что ключ не был передан, у ключа нет доступа к этому ресурсу или действию, либо запрос поступил с адреса вне его списка IP-адресов; 404 на маршруте сессии означает, что сессия не входит в сценарии или статусы ключа. Ключ без доступа к медиа получает URL изображений, видео и PDF как null, а ключ без прав на запись сессий получает ссылки на сессии и токены как null. См. https://docs.didit.me/console/api-keys.

Параметры пути

transaction_id
string<uuid>
обязательно

Стабильный UUID транзакции Didit, которую ваше приложение хранит для этого перевода: транзакция на стороне получателя при переводе по каналу INTERNAL или транзакция, созданная вами (исходящая или входящая), если кошелёк контрагента был заявлен как некастодиальный.

Тело

application/json
confirmed
boolean
обязательно

true для подтверждения владения, false для отклонения.

wallet_address
string
по умолчанию:""

Входящие переводы TRP: адрес платежа, который Didit возвращает исходному VASP при одобрении. По умолчанию используется адрес из совпадающей записи адресной книги, затем beneficiary_data.wallet_address. Для заявленного перевода с некастодиального кошелька без указания кошелька контрагента: кошелёк, владение которым вы подтвердили; без него запрос отклоняется с кодом 400. Игнорируется для других переводов.

Ответ

Обновлённый перевод. Для входящего перевода originator_data/beneficiary_data контрагента остаются маскированными (data_masked: true) до тех пор, пока не будет подтверждена структура владения, затем data_unmasked фиксирует, когда, почему и кем.

Полный объект перевода, возвращаемый endpoint’ами подтверждения владения и завершения/отмены. Пока владение кошельком для входящего перевода не подтверждено, данные контрагента originator_data и beneficiary_data возвращаются маскированными (сохраняется первая буква каждого слова; кошелёк, сеть и маршрутизация VASP остаются читаемыми), а флаг data_masked равен true.

uuid
string<uuid>
status
enum<string>
Доступные опции:
AWAITING_COUNTERPARTY,
ON_HOLD,
COMPLETED,
FINISHED,
CANCELLED,
EXPIRED,
COUNTERPARTY_MISMATCHED_DATA,
COUNTERPARTY_VASP_NOT_FOUND,
COUNTERPARTY_VASP_NOT_REACHABLE,
UNCONFIRMED_OWNERSHIP,
COUNTERPARTY_VASP_GENERAL_DECLINE,
NOT_ENOUGH_COUNTERPARTY_DATA,
NOT_APPLICABLE
direction
enum<string>
Доступные опции:
INBOUND,
OUTBOUND
rail
enum<string> | null

Транспортная сеть (rail), через которую был направлен перевод, или null, если сеть не была выбрана (например, ниже порога, некастодиальный кошелёк контрагента, регистрация после депозита или отсутствие доступного контрагента). INTERNAL означает, что обе стороны являются приложениями Didit; EMAIL означает, что контрагент получил ссылку для получения по электронной почте. TEST_VASP означает, что Didit Test VASP ответил на перевод в песочнице. В сетях GTR, VERIFYVASP и SYGNA Didit считывает ответ контрагента из ответа сети или опрашивает её каждые 5 минут. TRUST работает только на отправку, поэтому перевод через TRUST остаётся в статусе AWAITING_COUNTERPARTY до истечения срока действия. Сетевой rail используется только тогда, когда вы подключили собственное участие (membership) для этой сети. Он выбирается после возврата ответа создания транзакции, поэтому в этом ответе он равен null.

Доступные опции:
INTERNAL,
TRP,
GTR,
TRUST,
VERIFYVASP,
SYGNA,
EMAIL,
TEST_VASP,
null
protocol
string | null
ivms_version
string
Пример:

"ivms101.2023"

required
boolean
ownership_confirmed
boolean | null
deadline_at
string<date-time> | null
timeline
object[]
counterparty_vasp
object | null
originator_data
object

Сторона-отправитель. Для входящего перевода значения контрагента маскируются до тех пор, пока владение не будет подтверждено.

beneficiary_data
object

Сторона-получатель. Для входящего перевода значения контрагента маскируются до подтверждения владения.

name_match
object · null · null

Сравнение имен, на основе которого было принято решение по переводу, или null до выполнения проверки. Пока стороны маскированы, а также в копии транзакции INTERNAL у другого клиента, поля transfer_name, compared_name, matched_names и mismatched_names скрыты. Значения score и matched могут расходиться: matched следует уровню строгости, а score отражает степень сходства двух полных имен.

data_match
object | null

Сравнение по каждому полю данных стороны перевода с тем, что известно другой стороне о владельце кошелька. Указывает поля и результаты, но никогда значения, сохраняя читаемость при маскировании данных контрагента. Имеет значение null до запуска сравнения.

mismatched_fields
string[]

Сокращение для data_match.mismatched_fields. Пусто, если различий нет.

data_unmasked
object | null

Запись аудита момента, когда данные контрагента были демаскированы. Имеет значение null, пока данные всё ещё замаскированы, а также для исходящих переводов.

data_masked
boolean

Имеет значение true, пока персональные данные контрагента маскируются в этом ответе.

created_at
string<date-time>
delivery
object | null

Текущий статус последнего сообщения, которое этот перевод должен отправить другой стороне. Null, если перевод не требовал отправки сообщения (например, ниже threshold_amount, заявленный некастодиальный кошелёк или регистрация в рамках sunrise-периода).

discovery
object[]

Как Didit выполнял поиск контрагента: по одной записи на каждый выполненный шаг. Пусто, если поиск не выполнялся, например для входящего перевода.

reason
string

Причина, по которой перевод со статусом COUNTERPARTY_VASP_NOT_FOUND или COUNTERPARTY_VASP_NOT_REACHABLE приостановлен; "" для любого другого статуса. Неудачная доставка определяет её в первую очередь и только при COUNTERPARTY_VASP_NOT_REACHABLE: email_undeliverable (почтовый провайдер отклонил комплаенс-письмо, и адресов для повторной попытки не осталось: при отправке, при напоминании или в виде постоянного сбоя доставки, о котором сообщено позже) или delivery_failed (канал доставки окончательно вышел из строя: сетевой канал отклонил сообщение или исчерпал лимит повторных попыток, хост идентификации TRP не ответил либо TRP-хост контрагента не принял запрос). В противном случае её определяет трассировка discovery: awaiting_end_user (ни на одном шаге не указан контрагент, с которым Didit может связаться), directory_match_no_route (на шаге указан VASP из каталога, у которого нет маршрута), picked_member_without_proven_wallet (конечный пользователь выбрал клиента Didit, который не подтвердил контроль над кошельком) или no_directory_match, если трассировка не возвращает иной причины. Повторная отправка продвигает перевод дальше, поэтому причина сбрасывается. См. Почему перевод приостановлен.

next_actions
object[]

Действия, продвигающие перевод дальше; [] для любого статуса, кроме COUNTERPARTY_VASP_NOT_FOUND или COUNTERPARTY_VASP_NOT_REACHABLE. email_undeliverable предлагает update_compliance_email, затем resend. delivery_failed предлагает resend. Причина типа discovery предлагает select_counterparty_vasp, declare_self_hosted, add_vasp_hint и resend.

chain_details
object

Как блокчейн перевода именует два своих кошелька, когда перевод выполняется не просто с одного адреса на другой. Пусто ({}) для переводов в сетях на основе аккаунтов (EVM, Solana, Tron), где эти два адреса и есть кошельки. Сопоставление, маршрутизация и адресная книга читают кошельки в первую очередь отсюда.

Последнее изменение 7 ноября 2026 г.