Catálogo de eventos
Los eventos a nivel de entidad (
user.status.updated, business.status.updated) también pueden dispararse como consecuencia de la actividad de las transacciones. Consulta los webhooks de entidades.
Las aplicaciones de sandbox no emiten los webhooks
transaction.created ni transaction.status.updated. Para probar esos eventos, usa una aplicación del entorno de producción o API & Webhooks → Try Webhook en la consola. Los intercambios de Travel Rule en sandbox sí emiten webhooks travel_rule.status.updated con environment: sandbox; usa el Didit Test VASP para probar un intercambio antes de pasar a producción.Envoltorio
Los webhooks de Didit usan un cuerpo plano: los campos del evento están en el nivel superior, junto a los campos del envoltorio, y no hay ningún objetodata anidado.
Cada entrega incluye:
Estructura de los payloads
transaction.created y transaction.status.updated
Ambos eventos comparten un mismo payload: un resumen compacto más el bloque action_required (o null):
GET /v3/transactions/{transaction_id}/. Este endpoint devuelve todos los detalles (partes, rule_runs, provider_results, travel_rule, cost_breakdown, decision_reason_code), incluido por qué cambió el estado.
transaction_rule_suggestions.created
Este evento se refiere a tu conjunto de reglas, no a una transacción concreta, por lo que no incluye ningún ID de transacción.
Nunca contiene datos personales: solo IDs, tipos, títulos y recuentos de las sugerencias.
Los campos habituales del envoltorio (
event_id, timestamp, application_id, environment) se añaden al cuerpo.
travel_rule.status.updated
FINISHED, CANCELLED o EXPIRED; una vez que una transferencia llega a uno de esos estados, no se envían más eventos de Travel Rule para ella.
Un evento puede repetir el estado del anterior, por ejemplo cuando un reenvío vuelve a no encontrar ningún rail y la transferencia permanece en COUNTERPARTY_VASP_NOT_FOUND.
rail es INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP (una transferencia de sandbox a la que respondió el Didit Test VASP, que además incluye test_vasp: true y test_vasp_scenario), o "" mientras no se haya seleccionado ningún rail (siempre "" en los registros sunrise).
Al crear una transacción, en un registro sunrise, en una consulta TRP entrante o en el tramo entrante por el rail INTERNAL, Didit envía primero transaction.created y, después, los eventos travel_rule.status.updated de la transacción.
Una regla que cambie el estado de la transacción durante ese paso también puede enviar transaction.status.updated antes de transaction.created.
Un registro sunrise que se asocia a una transacción de depósito que ya creaste no envía transaction.created.
Cada webhook se entrega y se reintenta por separado, así que un evento reintentado puede llegar después de uno posterior: usa transaction_id como clave en tu handler y vuelve a leer la transacción cuando necesites su estado actual.
Ejemplos de recorridos de estado
Aprobación simple
Revisión y luego aprobación
Verificación adicional (step-up)
Transferencia con Travel Rule
transaction.created se pone en cola primero; cada webhook se entrega por separado, así que no dependas del orden de llegada.
Una transferencia enviada a través de TRUST nunca recibe un evento COMPLETED, porque TRUST no devuelve nada que Didit pueda leer: permanece en AWAITING_COUNTERPARTY hasta que vence el plazo de confirmación y termina en EXPIRED. A través de GTR, VerifyVASP y Sygna Bridge, Didit lee la respuesta de la contraparte desde la red y el evento la refleja.
Verificación de firma
Cada entrega se firma con HMAC-SHA256 usando el secreto compartido del destino e incluye tres encabezados de firma más una marca de tiempo:Reintentos y garantías de entrega
- Ante un
5xx, un404, un tiempo de espera agotado o un fallo de conexión, Didit reintenta hasta 2 veces: aproximadamente 1 minuto después del fallo inicial y, después, unos 4 minutos más tarde. - Las entregas reintentadas reutilizan el mismo
event_id: úsalo para eliminar duplicados en tu handler. - Tras el último fallo, la entrega de ese evento se detiene y se notifica a tu organización; los destinos nunca se desactivan de forma silenciosa.
- Devuelve un
2xxrápidamente (encola y luego procesa): las confirmaciones lentas pueden provocar tiempos de espera agotados y entregas duplicadas.
Idempotencia
Procesa cada webhook exactamente una vez guardandoevent_id en tu propio almacén de deduplicación. Es posible que el mismo evento se vuelva a entregar si tu endpoint confirma lentamente o se desconecta a mitad de la solicitud.
Suscripción
Próximos pasos
Referencia de webhooks
Destinos, firma y reintentos.
Estados
Máquina de estados completa.
Guía de integración
Gestión de webhooks en producción.