Ir al contenido
EN

API — Biometría

Los endpoints de biometría ejecutan prueba de vida, comparación facial, estimación de edad y búsqueda facial. Requieren API key (X-API-Key: zkyc_...) y usan multipart/form-data.

Prefijo: /v1/biometrics.

MétodoRutaAuthDescripción
POST/v1/biometrics/livenessAPI keyPrueba de vida (anti-spoofing)
POST/v1/biometrics/face-matchAPI keyComparación facial 1:1
POST/v1/biometrics/ageAPI keyEstimación de edad
POST/v1/biometrics/face-searchAPI keyBúsqueda facial 1:N
POST/v1/biometrics/face-search/indexAPI keyIndexar un rostro

Los endpoints que aceptan sessionId consolidan su resultado en la sesión y recalculan la decisión global.

POST /v1/biometrics/liveness
X-API-Key: zkyc_...
Content-Type: multipart/form-data
CampoTipoRequerido
imagearchivo
sessionIdtextoNo
{ "ok": true, "result": { "status": "live", "score": 0.94, "method": "minifasnet" } }
statusSignificado
liveRostro real (persona presente)
spoofSuplantación detectada
uncertainNo concluyente (p. ej. fallback heurístico sin modelo ONNX)
Ventana de terminal
curl -X POST https://kyc.zentto.net/v1/biometrics/liveness \
-H "X-API-Key: $KYC_API_KEY" \
-F "image=@./selfie.jpg" \
-F "sessionId=9b1c0e2a-..."
const res = await kyc.biometrics.liveness({
sessionId: "9b1c0e2a-...",
image: { data: selfieBuf, filename: "selfie.jpg", contentType: "image/jpeg" },
});

Compara la selfie del usuario contra una imagen de referencia (típicamente el rostro del documento).

POST /v1/biometrics/face-match
X-API-Key: zkyc_...
Content-Type: multipart/form-data
CampoTipoRequerido
user_imagearchivo
ref_imagearchivo
sessionIdtextoNo
{ "ok": true, "result": { "status": "match", "score": 0.88 } }
statusSignificado
matchMisma persona
no_matchPersonas distintas
uncertainNo concluyente
Ventana de terminal
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=9b1c0e2a-..."
const res = await kyc.biometrics.faceMatch({
sessionId: "9b1c0e2a-...",
userImage: { data: selfieBuf, filename: "selfie.jpg" },
refImage: { data: frontBuf, filename: "front.jpg" },
});

Si falta user_image o ref_image, la API responde 400 missing_file.

POST /v1/biometrics/age
X-API-Key: zkyc_...
Content-Type: multipart/form-data
CampoTipoRequerido
imagearchivo
sessionIdtextoNo
{ "ok": true, "result": { "estimated_age": 27, "confidence": 0.82 } }
const res = await kyc.biometrics.ageEstimation({
sessionId: "9b1c0e2a-...",
image: { data: selfieBuf, filename: "selfie.jpg" },
});

Busca el rostro contra el índice global para detectar duplicados o fraude (la misma persona registrándose varias veces).

POST /v1/biometrics/face-search
X-API-Key: zkyc_...
Content-Type: multipart/form-data
CampoTipoRequerido
imagearchivo
{
"ok": true,
"result": {
"total_matches": 2,
"matches": [
{ "session_id": "9b1c0e2a-...", "score": 0.91 },
{ "session_id": "c3d4e5f6-...", "score": 0.77 }
]
}
}
const res = await kyc.biometrics.faceSearch({
image: { data: selfieBuf, filename: "selfie.jpg" },
});

Inserta el embedding del rostro en el índice 1:N, asociado a una sesión, para que futuras búsquedas lo encuentren.

POST /v1/biometrics/face-search/index
X-API-Key: zkyc_...
Content-Type: multipart/form-data
CampoTipoRequerido
imagearchivo
sessionIdtexto
{ "ok": true, "result": { "indexed": true } }
const res = await kyc.biometrics.faceIndex({
sessionId: "9b1c0e2a-...",
image: { data: selfieBuf, filename: "selfie.jpg" },
});

Si falta sessionId, la API responde 400 missing_field.

Vista no técnica: el usuario toma un selfie y el sistema verifica que es una persona real y coincide con el documento.

Flujo del usuario — KYC · Biometría

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

Vista técnica: liveness/face-match/age → FastAPI :5200 (InsightFace + MiniFASNet) → score → actualiza sesión | face-search → Qdrant.

Flujo técnico — KYC · Biometría

ComponenteTipoUbicación
POST /v1/biometrics/livenessRoute Express (multipart)src/biometrics/routes.ts
POST /v1/biometrics/face-matchRoute Express (multipart)src/biometrics/routes.ts
POST /v1/biometrics/ageRoute Express (multipart)src/biometrics/routes.ts
POST /v1/biometrics/face-searchRoute Express (multipart)src/biometrics/routes.ts
POST /v1/biometrics/face-search/indexRoute Express (multipart)src/biometrics/routes.ts
POST /v1/livenessInferencia ML (FastAPI :5200)inference/app/routers/liveness.py
POST /v1/face-matchInferencia ML (FastAPI :5200)inference/app/routers/face.py
POST /v1/ageInferencia ML (FastAPI :5200)inference/app/routers/face.py
inference/app/models/liveness.pyMiniFASNet ONNX (anti-spoofing)inference/app/models/liveness.py
inference/app/models/face.pyInsightFace/ArcFace (face-match, edad)inference/app/models/face.py
inference/app/models/search.pyEmbeddings + Qdrant (face-search 1:N)inference/app/models/search.py
face_embeddingsColección Qdrant (embeddings 512-dim)Qdrant vector DB
session_resultsTabla resultados biometríasrc/db/migrations/
sessions.orchestrator.tsRecalcula decisión global post-inferenciasrc/sessions/sessions.orchestrator.ts

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