> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vu-one.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Interpretación de respuestas

> Cómo leer la respuesta de Face Analysis: la matriz biométrica con claves de cadena, el veredicto de calidad que cambia de forma y el antispoofing anidado.

## Los campos de primer nivel

| Campo | Qué es |
| - | - |
| `id` | El identificador de la transacción. Registrelo siempre: es lo primero que pide soporte. |
| `info` | Su referencia, devuelta tal cual. |
| `code` / `message` | El resultado global: `200` / `Operation end successfully`. |
| `biometric` | La matriz de similitud 0–100. **El campo sobre el que se decide.** |
| `confidences` | Un **duplicado** de `biometric` que existe por compatibilidad con integraciones antiguas. No lo lea. |
| `faceLocation` | El recuadro del rostro detectado en cada imagen, en píxeles. Informativo. |
| `faceFeatures` | Los 16 atributos 0–100, si los pidió. |
| `headPoseEstimation` | La pose en grados, si la pidió. |
| `inferenceConfidence` | El veredicto agregado de calidad. **Aparece siempre**, con dos formas distintas — ver abajo. |
| `antiSpoofingFace` | La respuesta del servicio de antispoofing, anidada, si la pidió. |
| `faceVector` | El vector de 512 valores por rostro, si envió `returnFaceVector`. |
| `faceImage` | El recorte alineado del rostro en base64, si envió `returnFaceImage`. |
| `benchmark` | Tiempo interno de proceso. No es un puntaje: no decida sobre él. |

## 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, …>`.

```json theme={null}
{
  "biometric": {
    "0": { "0": 100, "1": 93 },
    "1": { "1": 100, "0": 93 }
  }
}
```

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:

| Forma | Cuándo |
| - | - |
| `{"message": "...", "code": 200 \| 202 \| 406, "confidence": "high" \| "medium" \| "low"}` | Pidió `faceFeatures` **y** `headPoseEstimation` juntas, o la imagen mide menos de 360 px. |
| `{"message": "headPoseEstimation and faceFeatures need to be enabled..."}` — sin `code` ni `confidence` | Cualquier otro caso. |

Tipe `code` y `confidence` como **opcionales**. La correspondencia es fija: `200` = `high`, `202` = `medium`, `406` = `low`.

<Warning>
  **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.
</Warning>

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](/vucs/antispoofing-facial/introduccion), anidada tal cual:

```json theme={null}
{
  "antiSpoofingFace": {
    "0": {
      "code": 200,
      "spoofing": false,
      "confidence": 99.2
    }
  }
}
```

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.

<Warning>
  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.
</Warning>

## 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](/vucs/face-analysis/errores).

<Card title="Siguiente: Errores" icon="triangle-exclamation" href="/vucs/face-analysis/errores">
  Códigos de error, los `500` en texto plano, el aborto de lote con `imageNumber` y qué se reintenta.
</Card>


## Related topics

- [Leer la respuesta](/vucs/antispoofing-facial/respuestas.md)
- [Prueba de vida y biometría facial en Identity Link](/identity-link/prueba-de-vida.md)
- [Códigos de error y respuestas de la Identity Link API](/identity-link/errores.md)
- [Leer resultados KYC de verificaciones de identidad](/identity-link/kyc.md)
- [Crear y gestionar enlaces de verificación](/identity-link/enlaces.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.