Ir al contenido
EN

Inicio rápido

Esta guía integra Zentto KYC en una aplicación backend en cinco pasos: obtener la API key, instalar el SDK, crear el cliente, ejecutar una verificación completa (sesión + documento + liveness + face-match) y consultar el resultado.

EntornoURL
Producciónhttps://kyc.zentto.net
Desarrollohttp://localhost:5100

Todas las rutas tienen el prefijo /v1 directo (no existe prefijo por dominio tipo /v1/kyc/...). El SDK ya las arma por ti.

La verificación server-to-server se autentica con el header X-API-Key: zkyc_.... Cada empresa (tenant) genera su propia key:

  • Desde el dashboard de operadores (sección API keys), o
  • Vía API con un usuario operador: POST /v1/keys.

La key se muestra una sola vez al crearla. Guárdala en una variable de entorno (KYC_API_KEY) del backend; nunca la expongas en el frontend. Ver Autenticación.

El paquete @zentto/kyc-sdk es privado (requiere acceso al scope @zentto/*):

Ventana de terminal
npm install @zentto/kyc-sdk
import { ZenttoKyc } from "@zentto/kyc-sdk";
const kyc = new ZenttoKyc({
apiKey: process.env.KYC_API_KEY, // zkyc_...
baseUrl: "https://kyc.zentto.net",
});

Flujo típico: crear una sesión con las features deseadas, subir el documento de identidad, validar la prueba de vida y comparar el rostro de la selfie contra el del documento. Los uploads pasan al SDK como FileInput ({ data, filename, contentType? }).

import { readFile } from "node:fs/promises";
// 1. Crear la sesión de verificación
const { session } = await kyc.sessions.create({
features: ["id", "liveness", "face_match", "aml"],
vendorData: "user-1234", // tu identificador interno (opcional)
callbackUrl: "https://miapp.com/kyc/callback",
});
console.log(session.id, session.verificationUrl);
// 2. Verificación del documento de identidad (anverso + reverso)
const idResult = await kyc.documents.idVerification({
sessionId: session.id,
frontImage: {
data: await readFile("./front.jpg"),
filename: "front.jpg",
contentType: "image/jpeg",
},
backImage: {
data: await readFile("./back.jpg"),
filename: "back.jpg",
contentType: "image/jpeg",
},
});
// 3. Liveness (prueba de vida) sobre la selfie
await kyc.biometrics.liveness({
sessionId: session.id,
image: {
data: await readFile("./selfie.jpg"),
filename: "selfie.jpg",
contentType: "image/jpeg",
},
});
// 4. Face-match: selfie vs rostro del documento
await kyc.biometrics.faceMatch({
sessionId: session.id,
userImage: {
data: await readFile("./selfie.jpg"),
filename: "selfie.jpg",
contentType: "image/jpeg",
},
refImage: {
data: await readFile("./front.jpg"),
filename: "front.jpg",
contentType: "image/jpeg",
},
});

Cada subida que incluya sessionId consolida su resultado en la sesión y recalcula la decisión global. Un hit AML nunca auto-aprueba: la sesión queda en in_review para decisión manual del operador.

Puedes recibir el resultado por webhook firmado (recomendado, ver Webhooks) o por polling:

const { session } = await kyc.sessions.get(session.id);
console.log(session.status); // approved | in_review | declined | ...

Mismo flujo usando el header X-API-Key:

Ventana de terminal
# 1. Crear sesión
curl -X POST https://kyc.zentto.net/v1/sessions \
-H "X-API-Key: $KYC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"features":["id","liveness","face_match","aml"],"vendorData":"user-1234"}'
# 2. Verificación de documento (multipart)
curl -X POST https://kyc.zentto.net/v1/documents/id-verification \
-H "X-API-Key: $KYC_API_KEY" \
-F "front_image=@./front.jpg" \
-F "back_image=@./back.jpg" \
-F "sessionId=<SESSION_ID>"
# 3. Liveness
curl -X POST https://kyc.zentto.net/v1/biometrics/liveness \
-H "X-API-Key: $KYC_API_KEY" \
-F "image=@./selfie.jpg" \
-F "sessionId=<SESSION_ID>"
# 4. Face-match
curl -X POST https://kyc.zentto.net/v1/biometrics/face-match \
-H "X-API-Key: $KYC_API_KEY" \
-F "user_image=@./selfie.jpg" \
-F "ref_image=@./front.jpg" \
-F "sessionId=<SESSION_ID>"
# 5. Consultar resultado
curl https://kyc.zentto.net/v1/sessions/<SESSION_ID> \
-H "X-API-Key: $KYC_API_KEY"

Zentto KYC replica el modelo de Didit (sesiones, documentos, biometría, AML, KYB, webhooks firmados). Equivalencias principales:

Concepto DiditZentto KYC
API key del dashboardAPI key zkyc_... (X-API-Key)
Workflow / verification flowWorkflow (POST /v1/sessions/workflows) + workflowId al crear sesión
Crear verification sessionPOST /v1/sessions
Estados de la sesiónnot_started · in_progress · pending · in_review · approved · declined · abandoned
ID document verificationPOST /v1/documents/id-verification
Liveness / Face matchPOST /v1/biometrics/liveness · POST /v1/biometrics/face-match
AML screeningPOST /v1/aml/screen
KYB (business verification)POST /v1/kyb
Reusable KYCPOST /v1/sessions/:id/share + POST /v1/sessions/import
Webhooks firmadosPOST /v1/webhooks con firma HMAC-SHA256 (X-Zentto-Signature)
SDK / API client@zentto/kyc-sdk

Diferencias clave frente a Didit: el servicio es self-hosted (los datos biométricos no salen de tu infraestructura) y sin coste por verificación.