Ir al contenido
EN

API — Sesiones

Una sesión representa una verificación de identidad de un usuario. Se crea con un conjunto de features, se alimenta con documentos y biometría, y termina con una decisión. Todos los endpoints requieren autenticación por API key (X-API-Key: zkyc_...), salvo donde se indica rol operador.

Prefijo: /v1/sessions.

Método Ruta Auth Descripción
POST /v1/sessions API key Crear sesión
GET /v1/sessions/:id API key Detalle de una sesión
GET /v1/sessions API key Listar sesiones (paginado)
DELETE /v1/sessions/:id API key Eliminar sesión
GET /v1/sessions/pending Operador Cola de revisión manual
POST /v1/sessions/:id/decision Operador Aprobar / rechazar manualmente
POST /v1/sessions/:id/share API key Generar share token (reusable KYC)
POST /v1/sessions/import API key Importar verificación compartida
POST /v1/sessions/workflows API key Crear workflow
GET /v1/sessions/workflows API key Listar workflows
GET /v1/sessions/workflows/:id API key Detalle de workflow
PATCH /v1/sessions/workflows/:id API key Actualizar workflow
DELETE /v1/sessions/workflows/:id API key Eliminar workflow
Estado (status) Significado
not_started Creada, sin actividad
in_progress Recibiendo documentos/biometría
pending A la espera de pasos del usuario
in_review Requiere decisión manual del operador
approved Aprobada
declined Rechazada
abandoned Abandonada por el usuario

La decisión (decision) puede ser approved, declined o in_review. Regla fija: un hit AML nunca auto-aprueba — fuerza in_review para revisión manual.

POST /v1/sessions
X-API-Key: zkyc_...
Content-Type: application/json
{
"workflowId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"vendorData": "user-1234",
"features": ["id", "liveness", "face_match", "aml"],
"callbackUrl": "https://miapp.com/kyc/callback"
}
Campo Tipo Descripción
workflowId string (UUID), opcional Workflow del que heredar features/config
vendorData string ≤255, opcional Tu identificador interno del usuario
features string[], opcional id · liveness · face_match · aml · age · poa · phone · email
callbackUrl string (URL), opcional URL de retorno del flujo de verificación

Respuesta 201 Created:

{
"ok": true,
"session": {
"id": "9b1c0e2a-3d4f-4a5b-8c6d-7e8f9a0b1c2d",
"status": "not_started",
"sessionToken": "stk_a1b2c3...",
"verificationUrl": "https://kyc.zentto.net/verify/stk_a1b2c3...",
"features": ["id", "liveness", "face_match", "aml"]
}
}
Ventana de terminal
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","aml"],"vendorData":"user-1234"}'
const { session } = await kyc.sessions.create({
features: ["id", "liveness", "face_match", "aml"],
vendorData: "user-1234",
});
GET /v1/sessions/9b1c0e2a-3d4f-4a5b-8c6d-7e8f9a0b1c2d
X-API-Key: zkyc_...
{ "ok": true, "session": { "id": "9b1c0e2a-...", "status": "approved", "features": ["id", "liveness"] } }
const { session } = await kyc.sessions.get("9b1c0e2a-...");
GET /v1/sessions?status=approved&limit=20&offset=0
X-API-Key: zkyc_...
Query Default Descripción
status — Filtra por estado
limit 20 1–100
offset 0 Desplazamiento
{ "ok": true, "sessions": [ { "id": "9b1c0e2a-...", "status": "approved" } ], "total": 1, "limit": 20, "offset": 0 }
const { sessions, total } = await kyc.sessions.list({ status: "approved", limit: 20 });
DELETE /v1/sessions/9b1c0e2a-...
X-API-Key: zkyc_...
{ "ok": true }
GET /v1/sessions/pending
X-API-Key: zkyc_<operador>
{ "ok": true, "sessions": [ { "id": "9b1c0e2a-...", "status": "in_review" } ], "total": 1 }
const { sessions } = await kyc.sessions.pending();
POST /v1/sessions/9b1c0e2a-.../decision
X-API-Key: zkyc_<operador>
Content-Type: application/json
{ "approve": true, "reason": "Documento legible y face-match OK" }
Campo Tipo Descripción
approve boolean true aprueba, false rechaza
reason string ≤1000, opcional Motivo de la decisión
{ "ok": true, "session": { "id": "9b1c0e2a-...", "status": "approved" } }
await kyc.sessions.decide("9b1c0e2a-...", { approve: true, reason: "OK" });

Una sesión aprobada puede generar un shareToken para reutilizar la verificación en otra app/tenant, sin repetir el proceso.

POST /v1/sessions/9b1c0e2a-.../share
X-API-Key: zkyc_...
{ "ok": true, "share": { "shareToken": "<SHARE_TOKEN>", "expiresAt": "2026-07-21T10:00:00.000Z" } }

El receptor lo importa:

POST /v1/sessions/import
X-API-Key: zkyc_...
Content-Type: application/json
{ "shareToken": "<SHARE_TOKEN>" }
{ "ok": true, "imported": { "id": "c3d4e5f6-...", "status": "approved" } }
const { share } = await kyc.sessions.share("9b1c0e2a-...");
const { imported } = await kyc.sessions.import(share.shareToken);

share solo funciona si decision = approved. El shareToken tiene 16–80 caracteres y un TTL configurable (default 30 días).

Un workflow encapsula un conjunto de features (+ config) reutilizable al crear sesiones vía workflowId.

POST /v1/sessions/workflows
X-API-Key: zkyc_...
Content-Type: application/json
{
"name": "Onboarding estándar",
"features": ["id", "liveness", "face_match", "aml"],
"config": { "minAge": 18 }
}
Campo Tipo Descripción
name string 1–120 Nombre del workflow
features string[] (mín. 1) Features de las sesiones que lo usen
config objeto, opcional Config extra; admite minAge (0–150)

Respuesta 201 Created:

{ "ok": true, "workflow": { "id": "f47ac10b-...", "name": "Onboarding estándar", "features": ["id", "liveness", "face_match", "aml"] } }
GET /v1/sessions/workflows
GET /v1/sessions/workflows/:id
PATCH /v1/sessions/workflows/:id
DELETE /v1/sessions/workflows/:id

PATCH acepta name, features, config e isActive (todos opcionales).

const { workflow } = await kyc.sessions.createWorkflow({
name: "Onboarding estándar",
features: ["id", "liveness", "face_match", "aml"],
});
await kyc.sessions.updateWorkflow(workflow.id, { features: ["id", "liveness"] });
await kyc.sessions.listWorkflows();
await kyc.sessions.deleteWorkflow(workflow.id);

Vista no técnica del proceso de verificación completo desde el punto de vista del usuario final.

Flujo del usuario — KYC · Sesiones

Editable en draw.io: descarga el SVG → en draw.io: File → Import from → Device → selecciona el SVG. Cada nodo queda editable.

Vista técnica: crear sesión → subir documento/selfie → inferencia → decisión orquestada → webhook.

Flujo técnico — KYC · Sesiones

Componente Tipo Ubicación
POST /v1/sessions Route Express src/sessions/routes.ts
GET /v1/sessions/:id Route Express src/sessions/routes.ts
GET /v1/sessions/pending Route Express (operador) src/sessions/routes.ts
POST /v1/sessions/:id/decision Route Express (operador) src/sessions/routes.ts
POST /v1/sessions/:id/share Route Express src/sessions/routes.ts
POST /v1/sessions/import Route Express src/sessions/routes.ts
POST /v1/sessions/workflows Route Express src/sessions/routes.ts
sessions.service.ts Servicio de sesiones src/sessions/sessions.service.ts
sessions.orchestrator.ts Orquestador de decisión src/sessions/sessions.orchestrator.ts
sessions Tabla operativa src/db/migrations/
session_results Tabla resultados por feature src/db/migrations/
POST /v1/ocr Inferencia ML (FastAPI :5200) inference/app/routers/ocr.py
POST /v1/liveness Inferencia ML (FastAPI :5200) inference/app/routers/liveness.py
POST /v1/face-match Inferencia ML (FastAPI :5200) inference/app/routers/face.py

Editable en draw.io: descarga el SVG → File → Import from → Device.