Skip to main content
Los webhooks permiten que tu backend reciba notificaciones HTTP en tiempo real mientras una persona avanza por una verificación de Identity Link. En lugar de consultar la API en bucle, registrás una URL y VU publica un payload JSON firmado cada vez que un paso se completa o falla.
Los webhooks son parte de la API, así que requieren plan Premium o Pro, igual que POST /oauth/token. Ver Planes.

Registrar un endpoint

El cuerpo acepta exactamente dos campos: url (obligatorio) y description (opcional). Cualquier otro campo se rechaza. La llamada responde 201:
La respuesta no trae ningún secreto. La firma no es por endpoint: hay un único secreto de firma por cuenta, y todos los endpoints que registres reciben payloads firmados con él.

Dónde vive el secreto de firma

Tu webhookSecret es un valor de 256 bits que la aplicación muestra en Configuración → Desarrolladores, junto a tu Client Id y tu Client Secret. El mismo valor vuelve en un GET /users/me autenticado. Para rotarlo, usá Refrescar en esa pantalla o llamá:
La respuesta contiene el secreto nuevo. La rotación tiene efecto inmediato, así que desplegá el valor nuevo en tu validador antes de rotar, o asumí una ventana corta de entregas rechazadas.

Eventos

Doce eventos cubren el ciclo de vida. started se dispara cuando un paso empieza, successful cuando se aprueba y failed cuando se pierde de forma definitiva.
Un intento fallido con reintentos disponibles no genera webhook: simplemente se le pide a la persona que vuelva a intentar y remainingRetries baja en uno. Los eventos *.failed marcan el intento agotado, que es también el momento en que el enlace se consume.

Payload

Todos los payloads tienen la misma forma de dos claves: un type y un objeto data.
_externalUserId y _metadata se copian del enlace que originó la verificación. Si el enlace no llevaba externalUserId, el campo llega como cadena vacía; sin metadata, _metadata es {}.

Geolocalización en los eventos terminales

verification.successful y verification.failed además traen data.geolocation, cuando se capturó una ubicación. Los eventos intermedios nunca la traen: en verification.started la captura todavía no ocurrió.
Las claves ausentes se omiten en lugar de viajar como null, así que tratá todos los campos como opcionales.
La geolocalización del webhook es un subconjunto. permission y sample se quitan, y los campos antifraude policy, ipDistanceKm y serverIp nunca viajan por webhook, igual que están ausentes de los endpoints públicos. Si tu lógica de riesgo los necesita, consultá la verificación con un token después de recibir el evento.

Validar la firma

VU firma el payload con HMAC-SHA256 sobre el cuerpo exacto de la request, usando como clave el webhookSecret de tu cuenta, y manda el digest hexadecimal en el header X-Signature-SHA256. Validá contra el cuerpo crudo. Si parseás y volvés a serializar el JSON, los bytes cambian y la comparación falla.

Entrega y reintentos

Los reintentos son deliberadamente cortos. VU hace hasta 3 intentos, separados por 100 ms, y se detiene apenas tu endpoint responde 200, 201, 202 o 204. Cualquier otra cosa —un 500, un timeout, un redirect— consume un intento. Después del tercero, el evento se descarta y no se reenvía nunca.
Ese presupuesto es demasiado chico para absorber un handler lento, así que:
  • Respondé de inmediato y procesá de forma asincrónica. Confirmá dentro de unos pocos cientos de milisegundos y mandá el trabajo a una cola.
  • Sé idempotente. El mismo evento puede llegar más de una vez, y verification.started se vuelve a emitir en la rama adaptativa en algunos caminos de reintento.
  • No trates al webhook como única fuente de verdad. Reconciliá con GET /verifications/{id}/status?linkId={linkId} todo lo que tenga impacto comercial: una verificación cuyo webhook se perdió sigue teniendo su estado correcto en la API.
  • Leé el resultado antes de que expire. Pasado el expiresAt de la verificación, GET /verifications/{id} responde 410. En Planes está cómo se calcula esa ventana.

Administrar endpoints

PATCH acepta url y description. Todas las rutas requieren el mismo token Bearer que el resto de la API.
Las rutas de /webhook-endpoints viven en la misma URL base que POST /links: https://api.identity.vu-one.com/api/v1. No hay un host aparte. Si responden 404 con given resource is not implemented, la ruta no coincidió: revisá la URL base, el path y el método en Errores.

Siguientes pasos

  • Leé los datos extraídos de la verificación en la guía de Resultados KYC.
  • Entendé cómo se corresponden los eventos de prueba de vida con los tipos de webhook en Prueba de vida.
  • Revisá los códigos de error si falla el registro del webhook en la página de Errores.
Última modificación el 30 de agosto de 2026