Saltar al contenido principal
Transaction Monitoring emite tres eventos de webhook que, en conjunto, cubren el ciclo de vida completo de una transacción, además de un cuarto opcional que anuncia nuevas sugerencias de reglas. Todos usan la infraestructura estándar de webhooks de Didit con firma HMAC-SHA256. Consulta la referencia de webhooks para ver destinos, firma y pruebas.

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 objeto data 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):
El payload es deliberadamente escueto: al recibirlo, obtén el registro completo con 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

Se dispara en cada transición, incluido el paso a 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

Los dos primeros eventos provienen de la misma solicitud, y 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:
Consulta la referencia de webhooks para ver el código de verificación completo, incluida la comprobación de vigencia de la marca de tiempo.

Reintentos y garantías de entrega

  • Ante un 5xx, un 404, 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 2xx rápidamente (encola y luego procesa): las confirmaciones lentas pueden provocar tiempos de espera agotados y entregas duplicadas.

Idempotencia

Procesa cada webhook exactamente una vez guardando event_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.
Última modificación el 1 de noviembre de 2026