Skip to content
ES

API — Sesiones

This content is not available in your language yet.

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.