Skip to main content

Los campos de primer nivel

Las claves de resultado son cadenas

Cada bloque de resultado viene indexado por número de imagen como texto JSON: "0", "1"… La matriz biométrica es body.biometric["0"]["1"], no [0][1]. En lenguajes con tipos, deserialice como Map<String, …>.
La diagonal ("0" vs "0") siempre vale 100: es cada rostro contra sí mismo. Si además envió faceVectors, los vectores continúan la numeración después de las imágenes: 1 imagen + 1 vector ⇒ claves "0" (la imagen) y "1" (el vector). Referencias medidas con vu_v4 sobre las fotos de prueba del equipo: misma persona ≈ 93–95 · personas distintas ≈ 19. Con las mismas dos fotos, cosine da 78 y euclidean_l2 da 66: nunca compare puntajes de metodologías distintas.

inferenceConfidence cambia de forma

Aparece para cada imagen, siempre, pero con dos formas: Tipe code y confidence como opcionales. La correspondencia es fija: 200 = high, 202 = medium, 406 = low.
No confunda niveles. El code: 406 anidado dentro de inferenceConfidence no cambia el código HTTP ni el code de primer nivel, que siguen siendo 200. Una imagen de baja calidad no es un error de la API: es una señal para pedirle otra captura al usuario.
Qué degrada el veredicto: mascarilla, ojos cerrados, desenfoque, pose no frontal, maquillaje extremo, y —automáticamente— cualquier imagen por debajo de 360 px de lado.

Los 16 atributos de faceFeatures

Cada atributo es un puntaje 0–100 donde más alto = más presente: blurry, eyeglasses, sunglasses, faceMask, leftEyeClosed, rightEyeClosed, mouthOpen, beard, mustache, smiling, heavyMakeup, hat, earrings, necklace, necktie, lipstick. Úselos para guiar al usuario («quitese los lentes de sol»), no como condiciones de identidad. headPoseEstimation trae la pose en grados: leftRight (guiñada) y upDown (cabeceo). Cero es frontal perfecto; un rostro útil para biometría suele estar dentro de ±15°.

El antispoofing viene anidado y con escala propia

antiSpoofingFace["0"] contiene la respuesta completa del servicio de Antispoofing Facial, anidada tal cual:
Decida por su campo spoofing (booleano). No decida por su code ni su confidence internos: tienen la semántica del servicio de antispoofing, no la de Face Analysis.
Si el servicio de antispoofing no responde, antiSpoofingFace["0"] llega en null y el resto de la respuesta sigue siendo 200. Trate null como «sin veredicto» — nunca como aprobación.

Particularidades del deserializador

  1. Los bloques de resultado se indexan por cadena ("0", "1"), no por entero.
  2. inferenceConfidence tiene dos formas: code y confidence son opcionales.
  3. antiSpoofingFace[i] puede ser un objeto o null.
  4. confidences duplica a biometric: ignórelo, pero no falle si aparece.
  5. Con faceVectors, la numeración de resultados incluye los vectores a continuación de las imágenes.
  6. Los 500 llegan con cuerpo en texto plano, no JSON — ver Errores.

Siguiente: Errores

Códigos de error, los 500 en texto plano, el aborto de lote con imageNumber y qué se reintenta.
Última modificación el 9 de septiembre de 2026