Antes de empezar
- Usa la clave de API de una aplicación de sandbox. Las aplicaciones de producción nunca se comunican con el VASP de prueba.
- Activa Travel Rule con una razón social:
- Opcionalmente, suscribe un destino de webhook a
travel_rule.status.updated. Sandbox lo entrega con la marca"environment": "sandbox".
El VASP de prueba de Didit
GET /v1/sandbox/scenarios/ devuelve el perfil del VASP de prueba y todos los escenarios en su objeto travel_rule, para que tus pruebas lean los valores que activan cada escenario en lugar de incluirlos directamente en el código:
Todos los valores son datos de prueba. El VASP de prueba no es miembro de ninguna red de Travel Rule, y ningún resultado en sandbox demuestra que se pueda llegar a una contraparte o red real.
Escenarios salientes
Toda transaccióntravelRule saliente de una aplicación de sandbox que requiera un intercambio va al VASP de prueba. Elige el resultado con la dirección de la wallet del beneficiario (no distingue mayúsculas de minúsculas) o con un nombre de beneficiario de la forma Didit Test VASP <suffix>; si se indican ambos, prevalece la wallet. Si no se indica ninguno, o si el sufijo no figura en la tabla, la transferencia se completa (accept).
Una transferencia que no requiere intercambio nunca llega al VASP de prueba: una por debajo de tu threshold_amount, una a la propia wallet verificada de tu usuario y una cuya wallet de contraparte declaraste como wallet sin custodia. Un VASP de contraparte que tú o tu usuario final eligieron manualmente en el directorio se evalúa según las rutas que tendría una aplicación de producción: si su entrada tiene alguna (un endpoint TRP verificado, una red por la que envía tu aplicación o un contacto de cumplimiento), la transferencia va al VASP de prueba; si no tiene ninguna, la transferencia termina en COUNTERPARTY_VASP_NOT_FOUND, como ocurriría en una aplicación de producción.
rail de la transferencia es TEST_VASP, y la lista de transferencias muestra Didit Test VASP como su VASP beneficiario. Síguela en los webhooks travel_rule.status.updated o consulta GET /v3/transactions/{transaction_id}/.
name_mismatchcompara el nombre del beneficiario que enviaste con el nombre del titular que devuelve el VASP de prueba, según tu regla de nombre para el tipo de entidad del beneficiario (matching_rules.individual.nameomatching_rules.company.name, que siguen aname_matching_strictnesshasta que las configures). La transferencia y la entrada de la cronología que la decidió incluyenname_match(concompared_with: "counterparty_vasp") ydata_matchconmismatched_fields: ["name"].not_reachablemantiene la transferencia enAWAITING_COUNTERPARTYmientras se reintenta, condelivery.statusRETRYINGylast_errortest VASP is not answering, y luego la pasa aCOUNTERPARTY_VASP_NOT_REACHABLE. Envía{"action": "resend"}después para ejecutarla de nuevo.self_hostedhace que el VASP de prueba responda que la wallet es sin custodia. Registra la prueba con el widget de propiedad de wallet (que se genera para ti mientrasauto_wallet_verificationestá activado) o conPOST .../travel-rule/ownership/y{"confirmed": true}: la wallet se añade a tu libreta de direcciones con el nombre del beneficiario y la coincidencia de nombre decide la transferencia. Si hay coincidencia, se completa y la wallet se marca como verificada;{"confirmed": false}la rechaza.
Transferencias entrantes desde el VASP de prueba
Para probar el lado receptor, haz que el VASP de prueba te envíe una transferencia conPOST /v3/travel-rule/test-vasp/inbound/. Indica una de las wallets de la libreta de direcciones de tu propia aplicación: la transferencia se resuelve por la misma ruta entrante que una real, contra tu libreta de direcciones, tu modo de propiedad y tus reglas de nombre.
La respuesta
201 incluye transaction_id, txn_id, scenario, travel_rule_status, detail, test_vasp: true y la transferencia travel_rule. Una aplicación en producción recibe 400 ("The Didit Test VASP is only available on sandbox applications."), cualquier otro scenario recibe 400 y una aplicación con Travel Rule desactivada recibe 409.
Resuelve una transferencia en espera con
POST .../travel-rule/ownership/, como harías con una real: {"confirmed": true} la completa y {"confirmed": false} la rechaza.
Un depósito que tú mismo informas con POST /v3/transactions/ no es uno enviado por el VASP de prueba: permanece en AWAITING_COUNTERPARTY a la espera de su VASP de origen, y en su cronología se menciona el endpoint anterior. No dispara ningún webhook hasta que expira tras confirmation_timeout_hours. POST /v3/travel-rule/inbound/ sigue resolviendo un registro posterior al depósito contra tu libreta de direcciones, igual que en una aplicación en producción.
Webhooks en sandbox
travel_rule.status.updated se dispara para las aplicaciones de sandbox en cada cambio de estado, con "environment": "sandbox". Una transferencia a la que respondió el VASP de prueba incluye además rail: "TEST_VASP", test_vasp: true y test_vasp_scenario. El resto del sandbox se sigue comportando como se describe en Monitorización de transacciones en sandbox: las reglas no se evalúan, transaction.created y transaction.status.updated no se envían y no se factura nada.
Lo que el sandbox no demuestra
- Que una contraparte real, una membresía de red o el host TRP público de Didit funcionen. No se contacta con ninguno de ellos.
- Que tus credenciales de red sean válidas. Una membresía conectada se demuestra con su primer intercambio en producción.
- Las rutas del directorio de VASP reales: en una aplicación de sandbox, todas las rutas indican
unavailableconreason: sandbox_application, y todas las filas,reachable: false.