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étodoRutaAuthDescripción
POST/v1/sessionsAPI keyCrear sesión
GET/v1/sessions/:idAPI keyDetalle de una sesión
GET/v1/sessionsAPI keyListar sesiones (paginado)
DELETE/v1/sessions/:idAPI keyEliminar sesión
GET/v1/sessions/pendingOperadorCola de revisión manual
POST/v1/sessions/:id/decisionOperadorAprobar / rechazar manualmente
POST/v1/sessions/:id/shareAPI keyGenerar share token (reusable KYC)
POST/v1/sessions/importAPI keyImportar verificación compartida
POST/v1/sessions/workflowsAPI keyCrear workflow
GET/v1/sessions/workflowsAPI keyListar workflows
GET/v1/sessions/workflows/:idAPI keyDetalle de workflow
PATCH/v1/sessions/workflows/:idAPI keyActualizar workflow
DELETE/v1/sessions/workflows/:idAPI keyEliminar workflow
Estado (status)Significado
not_startedCreada, sin actividad
in_progressRecibiendo documentos/biometría
pendingA la espera de pasos del usuario
in_reviewRequiere decisión manual del operador
approvedAprobada
declinedRechazada
abandonedAbandonada 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"
}
CampoTipoDescripción
workflowIdstring (UUID), opcionalWorkflow del que heredar features/config
vendorDatastring ≤255, opcionalTu identificador interno del usuario
featuresstring[], opcionalid · liveness · face_match · aml · age · poa · phone · email
callbackUrlstring (URL), opcionalURL 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_...
QueryDefaultDescripción
statusFiltra por estado
limit201–100
offset0Desplazamiento
{ "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" }
CampoTipoDescripción
approvebooleantrue aprueba, false rechaza
reasonstring ≤1000, opcionalMotivo 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": "shr_a1b2c3d4e5f6...", "expiresAt": "2026-07-21T10:00:00.000Z" } }

El receptor lo importa:

POST /v1/sessions/import
X-API-Key: zkyc_...
Content-Type: application/json
{ "shareToken": "shr_a1b2c3d4e5f6..." }
{ "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 }
}
CampoTipoDescripción
namestring 1–120Nombre del workflow
featuresstring[] (mín. 1)Features de las sesiones que lo usen
configobjeto, opcionalConfig 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

ComponenteTipoUbicación
POST /v1/sessionsRoute Expresssrc/sessions/routes.ts
GET /v1/sessions/:idRoute Expresssrc/sessions/routes.ts
GET /v1/sessions/pendingRoute Express (operador)src/sessions/routes.ts
POST /v1/sessions/:id/decisionRoute Express (operador)src/sessions/routes.ts
POST /v1/sessions/:id/shareRoute Expresssrc/sessions/routes.ts
POST /v1/sessions/importRoute Expresssrc/sessions/routes.ts
POST /v1/sessions/workflowsRoute Expresssrc/sessions/routes.ts
sessions.service.tsServicio de sesionessrc/sessions/sessions.service.ts
sessions.orchestrator.tsOrquestador de decisiónsrc/sessions/sessions.orchestrator.ts
sessionsTabla operativasrc/db/migrations/
session_resultsTabla resultados por featuresrc/db/migrations/
POST /v1/ocrInferencia ML (FastAPI :5200)inference/app/routers/ocr.py
POST /v1/livenessInferencia ML (FastAPI :5200)inference/app/routers/liveness.py
POST /v1/face-matchInferencia ML (FastAPI :5200)inference/app/routers/face.py

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