> ## 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.

# Reading the response

> What each field of the /inference response means, how to interpret the diagnostics, and why the confidence values are not comparable to one another.

Everything below is **diagnostics**. The decision was already made from `status` and `spoofing`; this page is for understanding what happened, populating your logs, and filing tickets with context.

## Response fields

| Field | Type | What it's for |
| - | - | - |
| `spoofing` | boolean | **The verdict.** `false` with `200` is the only approval. |
| `id` | string | Unique transaction identifier. Always log it. |
| `code` | number | Mirrors the HTTP status code. |
| `message` | string | Human-readable result. Useful in logs, not for deciding. |
| `info` | object \| string \| null | Your reference and, when present, the diagnostics. See below. |
| `date` / `time` | string | When the service ran the analysis. |
| `values` | object | Internal model scores (`FAKE`, `REAL`). Diagnostics. |
| `confidence` | number | Confidence of whichever component answered. See the scale warning. |
| `imageQuality` | object | **Optional** map of quality indicators. See below. |
| `benchmark` | number | Milliseconds the analysis took. |
| `errorCode` / `errorMessage` | number / string | Internal detail. Diagnostics. |

<Warning>
  Do not build business logic on `errorCode`, `values`, `confidence`, or `info`. They are not part of the contract and their shape changes between service versions.
</Warning>

## `info`: three shapes, one reader

`info` is polymorphic. It can arrive as an object, as a string, or as `null` — and `null` shows up in two different places: the top-level `info` and the nested `info.info`.

<CodeGroup>
  ```json Object (diagnostics attached) theme={null}
  {
    "info": {
      "info": "onboarding-12345",
      "mode": "active",
      "service": "as-face",
      "user": "userName",
      "deepfake-filter": { "provider": "A", "detected": false, "confidence": 99 }
    }
  }
  ```

  ```json String (echo of what you sent) theme={null}
  {
    "info": "onboarding-12345"
  }
  ```

  ```json null (you sent no info) theme={null}
  {
    "info": null
  }
  ```
</CodeGroup>

```js theme={null}
function reference(body) {
  const i = body?.info;
  return i == null             ? null
       : typeof i === "string" ? i
       : i.info ?? null;
}
```

<Warning>
  **An object in `info` does not mean the person was blocked.** In our test set, all 47 approvals carried `info` as an object, with `deepfake-filter` and `detected: false` — the filter ran and found nothing. The only field that separates approve from do-not-approve is `spoofing`.
</Warning>

## `imageQuality` is optional, and so are its keys

`imageQuality` is a map of optional keys: it can be missing entirely, and when present it may carry some keys and not others. Across 116 test responses, 102 carried `face`, 10 carried `brightSpots`, and the 4 `422 No Face Detected` responses carried no `imageQuality` at all — consistent enough: no face, nothing to measure.

```json theme={null}
"imageQuality": {
  "blurry": false,
  "underExposure": false,
  "overExposure": false,
  "borderDetected": false,
  "face": {
    "is_centered_x": true,
    "is_centered_y": true,
    "is_close_to_borders": false,
    "is_too_small": false,
    "is_too_large": false
  }
}
```

Read every level defensively. `body.imageQuality?.face?.is_too_small` is correct; `body.imageQuality.face.is_too_small` throws the day a `422` arrives.

## Which component answered

When `info` is an object, its keys reveal what the service found. This table is for reading a case, not for deciding on one:

| Situation | Signals in `info` | Typical `imageQuality` |
| - | - | - |
| Clean analysis | `deepfake-filter` with `detected: false`, plus `mode` | `face` |
| Watermark or overlaid text | `text` and `matches[]` | `brightSpots` |
| Chromatic tampering ("blue people") | `blue-filter` | `brightSpots` |
| Deepfake detected — provider A | `deepfake-filter` with `detected: true` | `brightSpots` |
| Deepfake or AI-generated content — provider B | `deepfake-filter` with `detected: true` | `brightSpots` |
| Photocopy | Text in `info`, or `null` | `face` |
| Screenshot | Text in `info`, or `null` | `face` |
| Another screen's border in frame | `borderDetected: true` | `face` |

<Note>
  Never write logic against the *value* of `info.service`. Internal service names change. If you need to know whether diagnostics were attached, check for presence, not content.
</Note>

## Confidence values are not comparable

This is the most frequent misreading. Several numbers in the response are called "confidence", they use different scales, and **two of them point in opposite directions**:

| Value | Scale | What it measures | On detection |
| - | - | - | - |
| `deepfake-filter.confidence` (provider A) | 0–100 | Probability the image is **authentic** | Drops to `0` |
| `deepfake-filter.confidence` (provider B) | 0–1 | Probability the image is **fake** | Rises to `0.99` |
| `blue-filter.confidence` | 0–100 | Intensity of the chromatic tampering | — |
| `matches[].score` | 0–100 | Similarity of the found text to the reference list | — |

<Warning>
  Never compare, average, or apply a shared threshold to these values. A `confidence: 0` can mean "absolute certainty of fraud" (provider A) and so can `confidence: 0.99` (provider B). Any rule of the form "if confidence is above X" produces inverted decisions depending on which component answered.
</Warning>

<Card title="Errors" icon="triangle-exclamation" href="/en/vucs/antispoofing-face/errors">
  Status codes, how to tell your problems from the service's, and which are safe to retry.
</Card>


## Related topics

- [Identity Link API: Integration Guide](/en/identity-link/introduction.md)
- [Interpreting responses](/en/vucs/face-analysis/responses.md)
- [Identity Link API Error Codes and Responses](/en/identity-link/errors.md)
- [Face Analysis](/en/vucs/face-analysis/introduction.md)


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