Saltar al contenido principal
POST
curl

Wallets sin custodia

Cuando la wallet de la contraparte se declaró sin custodia (counterparty.payment_method.method_type: "unhosted_wallet"), la transferencia queda en espera en UNCONFIRMED_OWNERSHIP. Llamar a este endpoint con confirmed: true registra que tu cliente verificó quién controla esa wallet y completa la transferencia (COMPLETED), tanto en retiros salientes como en depósitos entrantes. Un depósito entrante cuyo hash on-chain ya se conoce pasa a FINISHED. La wallet verificada es la de la contraparte: el destino de un retiro saliente, o el origen (la wallet del ordenante) de un depósito entrante. Didit la añade a la libreta de direcciones de wallets como wallet con propiedad verificada a nombre de la contraparte, de modo que se compara con el nombre de la contraparte (el ordenante, en el caso de un depósito). Si la libreta de direcciones ya contiene esa wallet con un nombre de titular diferente, la transferencia pasa a COUNTERPARTY_MISMATCHED_DATA. Si la transferencia no indica ninguna wallet de la contraparte, envía wallet_address en el cuerpo de la solicitud. Cuando ni la transferencia ni la solicitud aportan una dirección de wallet, la solicitud se rechaza con 400. confirmed: false rechaza la transferencia (COUNTERPARTY_VASP_GENERAL_DECLINE).

Autorizaciones

x-api-key
string
header
requerido

La clave de API de tu aplicación, que encontrarás en Developers -> API keys en la Business Console. La clave principal tiene acceso completo. Una clave con nombre puede tener un alcance limitado: ninguno, lectura o escritura por recurso, limitada a algunos flujos o a sesiones aprobadas, a una lista de direcciones IP y a una fecha de caducidad. 401 significa que la clave es incorrecta, se revocó o expiró; 403 significa que no se envió ninguna clave, que la clave no tiene acceso a este recurso o acción, o que la solicitud provino de una dirección fuera de su lista de IP; 404 en una ruta de sesión significa que la sesión está fuera de los flujos o estados de la clave. Una clave sin acceso a contenido multimedia recibe las URL de imágenes, videos y PDF como null, y una clave sin permiso de escritura en sesiones recibe los enlaces y tokens de sesión como null. Consulta https://docs.didit.me/console/api-keys.

Parámetros de ruta

transaction_id
string<uuid>
requerido

UUID estable de Didit de la transacción que tu aplicación mantiene para esta transferencia: la transacción del lado del beneficiario en una transferencia por la vía INTERNAL, o la transacción que creaste (saliente o entrante) cuando la wallet de la contraparte se declaró como wallet sin custodia.

Cuerpo

application/json
confirmed
boolean
requerido

true para confirmar la propiedad, false para negarla.

wallet_address
string
predeterminado:""

Transferencias TRP entrantes: la dirección de pago que Didit devuelve al VASP ordenante cuando apruebas. De forma predeterminada es la dirección de la entrada coincidente de la libreta de direcciones y, si no la hay, beneficiary_data.wallet_address. En una transferencia declarada a una wallet sin custodia que no indica ninguna wallet de la contraparte, es la wallet cuya propiedad verificaste; sin ella, la solicitud se rechaza con 400. Se ignora en las demás transferencias.

Respuesta

La transferencia actualizada. En una transferencia entrante, los originator_data/beneficiary_data de la contraparte permanecen enmascarados (data_masked: true) hasta que se confirma la propiedad; después, data_unmasked registra cuándo, por qué y quién lo hizo.

Objeto de transferencia completo que devuelven los endpoints de confirmación de propiedad y de finalizar/cancelar. Mientras la propiedad de la wallet de una transferencia entrante no esté confirmada, los originator_data y beneficiary_data de la contraparte se devuelven enmascarados (se conserva la primera letra de cada palabra; la wallet, la cadena y el enrutamiento del VASP siguen siendo legibles) y data_masked es true.

uuid
string<uuid>
status
enum<string>
Opciones disponibles:
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>
Opciones disponibles:
INBOUND,
OUTBOUND
rail
enum<string> | null

La vía por la que se enrutó la transferencia, o null cuando no se seleccionó ninguna vía (por ejemplo, por debajo del umbral, con una wallet sin custodia de la contraparte, con un registro posterior al depósito o sin una contraparte alcanzable). INTERNAL significa que ambas partes son aplicaciones de Didit; EMAIL significa que se llegó a la contraparte mediante un enlace de recogida enviado por correo electrónico. TEST_VASP significa que el VASP de prueba de Didit respondió a la transferencia del sandbox. Por GTR, VERIFYVASP y SYGNA, Didit lee la respuesta de la contraparte en la respuesta de la red o consultándola cada 5 minutos. TRUST solo envía, por lo que una transferencia por TRUST permanece en AWAITING_COUNTERPARTY hasta que expira. Una vía de red solo se usa cuando has conectado tu propia membresía a esa red. Se elige después de que la creación de la transacción responde, por lo que es null en esa respuesta.

Opciones disponibles:
INTERNAL,
TRP,
GTR,
TRUST,
VERIFYVASP,
SYGNA,
EMAIL,
TEST_VASP,
null
protocol
string | null
ivms_version
string
Ejemplo:

"ivms101.2023"

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

Parte ordenante. En una transferencia entrante, los valores de la contraparte están enmascarados hasta que se confirma la propiedad.

beneficiary_data
object

Parte beneficiaria. En una transferencia entrante, los valores de la contraparte están enmascarados hasta que se confirma la propiedad.

name_match
object · null · null

La comparación de nombres que decidió la transferencia, o null hasta que se haya ejecutado una. Mientras las partes están enmascaradas, y en la copia del otro cliente de un intercambio INTERNAL, transfer_name, compared_name, matched_names y mismatched_names se ocultan. score y matched pueden no coincidir: matched sigue el nivel de exigencia y score es la similitud entre los dos nombres completos.

data_match
object | null

Comparación campo a campo de los datos de las partes de la transferencia con lo que la otra parte sabe del titular de la wallet. Indica campos y resultados, nunca valores, por lo que sigue siendo legible mientras los datos de la contraparte están enmascarados. Es null hasta que se realiza una comparación.

mismatched_fields
string[]

Atajo para data_match.mismatched_fields. Vacío cuando nada difiere.

data_unmasked
object | null

Registro de auditoría del momento en que se desenmascararon los datos de la contraparte. Es null mientras los datos siguen enmascarados, y en las transferencias salientes.

data_masked
boolean

True mientras los datos personales de la contraparte están enmascarados en esta respuesta.

created_at
string<date-time>
delivery
object | null

Estado del último mensaje que esta transferencia debe a la otra parte. Es nulo cuando la transferencia nunca debió ninguno (por ejemplo, por debajo de threshold_amount, una wallet sin custodia declarada o un registro de sunrise).

discovery
object[]

Cómo buscó Didit la contraparte, con una entrada por cada paso ejecutado. Vacío cuando no se ejecutó ningún descubrimiento, por ejemplo, en una transferencia entrante.

reason
string

Por qué está bloqueada una transferencia COUNTERPARTY_VASP_NOT_FOUND o COUNTERPARTY_VASP_NOT_REACHABLE; "" para cualquier otro estado. Primero lo determina una entrega fallida, solo en COUNTERPARTY_VASP_NOT_REACHABLE: email_undeliverable (el proveedor de correo rechazó el correo de cumplimiento y no queda ninguna dirección que probar: al enviarlo, en un recordatorio o como rebote permanente notificado más tarde) o delivery_failed (el canal que realizaba la entrega falló de forma definitiva: un canal de red rechazó el mensaje o agotó los reintentos, un host de identidad TRP no respondió o el host TRP de la contraparte no aceptó la consulta). En caso contrario, lo determina la traza discovery: awaiting_end_user (ningún paso indicó una contraparte a la que Didit pueda llegar), directory_match_no_route (un paso indicó un VASP del directorio que no tiene ruta), picked_member_without_proven_wallet (el usuario final eligió un cliente de Didit que no ha demostrado el control de la wallet) o no_directory_match cuando la traza no da ningún otro motivo. Un reenvío hace avanzar la transferencia, por lo que el motivo se borra. Consulta Por qué está bloqueada una transferencia.

next_actions
object[]

Qué hace avanzar la transferencia; [] para cualquier estado que no sea COUNTERPARTY_VASP_NOT_FOUND o COUNTERPARTY_VASP_NOT_REACHABLE. email_undeliverable ofrece update_compliance_email y después resend. delivery_failed ofrece resend. Un motivo de descubrimiento ofrece select_counterparty_vasp, declare_self_hosted, add_vasp_hint y resend.

chain_details
object

Cómo identifica la cadena de la transferencia sus dos wallets, cuando no se trata simplemente de una dirección que paga a otra. Vacío ({}) en una transferencia de una cadena basada en cuentas (EVM, Solana, Tron), donde las dos direcciones son las wallets. La coincidencia, el enrutamiento y la libreta de direcciones leen las wallets primero de aquí.

Última modificación el 1 de noviembre de 2026