Webhooks
Reciba eventos de Certivant en tiempo real en sus propios sistemas cuando cambia el estado de una verificación: configuración, verificación de firma HMAC, calendario de reintentos y referencia completa de tipos de evento.

Qué hace
Un webhook es una URL a la que enviamos una petición POST cada vez que ocurre algo en su organización de Certivant. En lugar de consultar nuestra API para saber si hay cambios («¿ha terminado ya la verificación?»), nos da una URL y le avisamos en el momento en que ocurre. Los eventos de webhook sirven para mantener sincronizados sus sistemas: flujos de alta de clientes, bases de datos de riesgo AML, etiquetas de CRM, paneles internos de cumplimiento normativo.
Dónde está
KYC → Webhooks en la barra lateral izquierda. (Los eventos de KYB se envían a los mismos puntos de conexión de webhook: no existe una configuración de webhook separada para KYB.)
Configuración
Elija una URL en su lado
Su punto de conexión debe:
- Aceptar peticiones POST por HTTPS con
Content-Type: application/json. - Responder
2xxrápidamente (en menos de 5 segundos) para confirmar la recepción. - Verificar la cabecera de firma (siguiente paso) antes de confiar en la carga útil.
Añada la URL en Certivant
KYC → Webhooks → Agregar punto de conexión. Se abre un campo en el mismo sitio: pegue la URL y haga clic en Guardar (la misma URL puede editarse más tarde en Ajustes → KYC/B). La tarjeta Puntos de conexión webhook muestra el punto de conexión predeterminado de toda la organización, los puntos de conexión por formulario y el secreto de firma.

Copie el secreto de firma
Después de guardar, verá un secreto de firma que solo se muestra una vez. Cópielo ahora: no volverá a mostrarse. Si lo pierde, rote el secreto para generar uno nuevo.
Verifique las firmas en su lado
Cada petición incluye una cabecera X-Certivant-Signature-V2 con el formato t=<unix time>,v1=<hex>. El valor v1 es el HMAC-SHA256 del tiempo unix, un punto y el cuerpo de la petición en bruto, firmado con el secreto que acaba de copiar. Verifíquelo y rechace los eventos cuyo tiempo difiera más de cinco minutos de su propio reloj, antes de analizar la carga útil. La receta, con código en varios lenguajes, está en la guía para desarrolladores.
La cabecera antigua X-KYC-Signature-Legacy, que firma solo el cuerpo, ya
no se envía (se eliminó el 24 de octubre de 2026). Si su receptor todavía la
comprueba, todos los eventos fallarán la verificación: cambie a
X-Certivant-Signature-V2.
Pseudocódigo:
const sig = req.headers["x-certivant-signature"];
const expected = hmac("sha256", secret).update(rawBody).digest("hex");
if (!timingSafeEqual(sig, expected)) return 401;
No omita este paso. Sin verificación de firma, cualquiera que adivine la URL de su punto de conexión puede enviarle eventos falsos.
Pruebe desde el panel
En la página Desarrollador, abra la sección Eventos de webhook. Elija un evento en el desplegable Evento de prueba: kyc.webhook.test (el predeterminado), kyc.request.created, kyc.request.approved, kyc.request.rejected o kyc.request.escalated, y haga clic en Enviar un evento de prueba. Certivant envía un evento sintético a su punto de conexión, firmado exactamente igual que uno real (X-Certivant-Signature-V2, con su secreto de webhook) y con test: true para que pueda distinguirlo. Confirme que su punto de conexión responde con un 2xx.

Tipos de evento
| Evento | Cuándo |
|---|---|
kyc.request.created | Alguien creó una solicitud de verificación (panel, API o formulario público). |
kyc.request.documents_ready | El solicitante subió todos los documentos requeridos; empezó el procesamiento. |
kyc.request.approved | El estado final es APPROVED (automático o manual). |
kyc.request.rejected | El estado final es REJECTED. |
kyc.request.escalated | Enviado a revisión manual. |
kyc.request.cancelled | Un revisor canceló la solicitud antes de completarla. |
kyb.* | Misma estructura que kyc.*, pero para verificaciones de empresas. |
monitoring.alert.created | Se disparó una nueva alerta de monitorización sobre un solicitante aprobado previamente. |
monitoring.alert.resolved | Un revisor resolvió una alerta. |
form.submitted | Un envío de formulario público. Útil si usa el formulario para recoger datos que no son de KYC. |
webhook.test | El evento de prueba sintético del botón Probar. Siempre se envía, con independencia de las suscripciones. |
La lista completa y las cargas útiles JSON están documentadas en KYC → Desarrollador → Eventos de webhook.
Estructura de la carga útil
Todos los eventos tienen el mismo sobre:
{
"id": "evt_2k3f9a...",
"type": "kyc.request.approved",
"createdAt": "2026-05-27T14:30:00Z",
"organizationId": "org_abc123",
"data": { /* event-specific payload */ }
}
El campo data varía según el tipo de evento. Por ejemplo, kyc.request.approved envía:
{
"request": { "id": "kyr_...", "status": "APPROVED", "type": "INDIVIDUAL", ... },
"applicant": { "id": "ka_...", "fullName": "Jane Doe", "email": "...", ... },
"decision": { "by": "auto" | "manual", "reviewerId": "user_..." | null, "note": "..." | null },
"policy": {
"id": "pol_..." | null,
"name": "default-kyc-policy",
"version": 3 | null,
"isDefault": true,
"decision": "approve" | "reject" | "escalate" | "live_verification",
"rulesFired": ["tier1-disqualified", "approve-by-score"],
"reason": "High-risk country",
"liveVerificationRequired": true
}
}
El bloque policy (en kyc.request.approved / rejected / escalated) indica qué política de riesgo decidió la solicitud y qué reglas se activaron. isDefault: true significa que se ejecutó la política predeterminada de Certivant (id/version corresponden a la fila de la política predeterminada de su organización, o son null si aún no se ha creado); una política personalizada informa de su id, name y version almacenados. rulesFired enumera los ids de las reglas que coincidieron, en orden de evaluación: use estos datos para bifurcar sus automatizaciones posteriores. reason es el motivo de la regla ganadora, cuando la regla lo define. decision: "live_verification" (con liveVerificationRequired: true, en kyc.request.escalated) significa que la política necesita una verificación de identidad en vivo antes de una decisión final: la solicitud espera en revisión manual hasta que la llamada decida. Consulte Diseñar una política de riesgo.
Si opera en modo socio (una organización que atiende a muchos clientes finales), cada sobre de evento incluye también subTenantName y subTenantExternalId: las etiquetas definidas en la solicitud cuando se creó mediante la API, para que su manejador pueda enrutar el resultado al cliente final correcto. Consulte la referencia de webhooks para desarrolladores para ver la ubicación exacta de cada campo.
Reintentos
Si su punto de conexión devuelve un código distinto de 2xx (o no responde a tiempo), reintentamos con retroceso exponencial:
attempt 1: immediately
attempt 2: 30 seconds later
attempt 3: 5 minutes later
attempt 4: 30 minutes later
attempt 5: 2 hours later
attempt 6: 6 hours later
attempt 7: 24 hours later
Tras 7 intentos fallidos, marcamos el evento como permanently_failed (fallo permanente) y dejamos de reintentarlo. Los eventos fallidos aparecen en el panel de webhooks con su último error; puede volver a enviar manualmente cualquiera de ellos con Reintentar.
Su punto de conexión debe ser idempotente. No deduplicamos los reintentos
por nuestra parte: su punto de conexión verá el mismo evento varias veces si
sus primeros intentos agotaron el tiempo pero finalmente tuvieron éxito.
Use el id del evento como clave y omita los eventos que ya haya procesado.
Varios puntos de conexión
Puede registrar varios puntos de conexión (por ejemplo, uno para su CRM y otro para su almacén de datos AML). Cada uno puede suscribirse a un conjunto distinto de tipos de evento. Cada punto de conexión tiene su propio secreto de firma: rotar uno no rompe los demás.
Webhooks por formulario
El webhook de toda la organización se dispara para cada evento relevante. Los formularios públicos pueden tener ADEMÁS una URL de webhook por formulario en sus ajustes, útil cuando un formulario alimenta un sistema independiente. Los webhooks por formulario se ejecutan además de los de la organización.
La página KYC → Webhooks muestra ahora ambos en un solo lugar: la URL de webhook de la organización en la parte superior, y una fila para la URL de webhook de cada formulario debajo, para que vea todos los destinos de entrega sin buscar en los ajustes de cada formulario.
El panel de webhooks
KYC → Webhooks enumera cada punto de conexión con:
- URL del punto de conexión y nombre descriptivo.
- Estado: activo / en pausa / con fallos.
- Última entrega: cuándo se envió la última petición POST.
- Tasa de éxito: % de intentos que devolvieron 2xx en los últimos 7 días.
- Entregas recientes: tabla con los eventos recientes, su código de estado, la latencia y el cuerpo de la respuesta.
Pause un punto de conexión para detener las entregas sin perder la configuración.
Solución de problemas
Mi punto de conexión recibe demasiadas peticiones
Los puntos de conexión reciben una llamada por evento, pero una organización muy activa puede generar decenas por minuto. Haga que su punto de conexión sea asíncrono: acepte el POST, responda 2xx de inmediato y procese la carga útil fuera del ciclo de vida de la petición. Si necesita que reduzcamos el ritmo, configure la opción Máximo de entregas simultáneas del punto de conexión.
La verificación de firma falla constantemente
Tres causas habituales:
- Analizar el cuerpo antes de verificar la firma. Use los bytes en bruto. Si usa Express +
body-parser, configurebodyParser.raw({ type: 'application/json' })específicamente para la ruta del webhook. - Secreto incorrecto. Rote el secreto y vuelva a pegarlo.
- Modificar el cuerpo en un middleware (gzip, BOM, codificación). La firma se calcula sobre los bytes exactos que enviamos.
Los eventos parecen duplicados
Son reintentos por respuestas lentas. Use event.id como clave de idempotencia.
El orden de los eventos es importante, pero los recibo desordenados
No garantizamos un orden estricto entre tipos de evento. Para el orden por solicitante, use el campo createdAt del evento: el orden dentro del ciclo de vida de un solicitante concreto es monótono.
Relacionado
- Registro de auditoría: cada envío de webhook también queda registrado aquí.
- Desarrollador (claves de API): si quiere consultar el estado mediante REST en lugar de recibir envíos.
- Formularios: vista previa y publicación: webhooks por formulario.
Verificación Live ID
Programe, realice, grabe y reproduzca sesiones de verificación por vídeo en directo basadas en el navegador en Certivant, sin necesidad de descargar ninguna aplicación para los solicitantes.
Desarrollador: claves de API y API REST
Emita y gestione claves de API, configure los ámbitos y use la API REST de Certivant para crear solicitudes de verificación y sincronizar el estado KYC de forma programática desde sus propios sistemas.