> For the complete documentation index, see [llms.txt](https://docs.vida.id/identity-stack/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.vida.id/identity-stack/verify/biometric-verification/biometric-verification-v2/api-reference/invalid-data-of-biometric-verification.md).

# Invalid Data of Biometric Verification

An Invalid Data scenario occurs when a user attempts Face Match + Liveness verification but supplies incomplete or incorrect data. For example, submitting a blank face image alongside a valid ID card image.

In such cases:

* **Image Liveness Verification fails automatically**, since it requires a valid face image to detect real-time facial movements and confirm the presence of a live person.
* Because Image Face Match Verification depends on a successful Liveness result, **the API does not proceed with the face match step, and no response is returned for that operation.**

This dependency is unchanged in v2. What's new in v2: a single request can surface **multiple validation errors at once**, each scoped to the specific operation(s) it affects via the `operations` field in the error object — rather than only ever returning one error at a time (see the confirmed multi-error example above under Performing Biometric Verification).

This validation flow preserves the platform's security standards by preventing incomplete or fraudulent data from passing through. To avoid triggering it, clients should ensure both the face image and ID card image are valid and clear before submitting a verification request.

### Headers

<table><thead><tr><th width="180.44921875">Name</th><th width="164.78515625">Type</th><th>Description</th></tr></thead><tbody><tr><td>Authentication*</td><td>String</td><td>Bearer &#x3C;Token></td></tr><tr><td>Content-Type</td><td></td><td>Format type of request body</td></tr></tbody></table>

### Request Body

<table><thead><tr><th width="180.46875">Name</th><th width="164.52734375">Type</th><th>Description</th></tr></thead><tbody><tr><td>operations*</td><td>String</td><td><p>[</p><p>"imageFaceMatchVerification",</p><p>"imageLivenessVerification"</p><p>]</p></td></tr><tr><td>payload*</td><td>String</td><td><p>{ </p><p>"partnerTrxId": "random-uuid",</p><p>"groupId": "random-uuid",</p><p>"faceImage": "Base64 of blank image encoded.,</p><p>"croppedFaceImage"or"idFrontSideImage": "Encoded Base64 idcard"</p><p>}​</p></td></tr><tr><td>userConsent*</td><td>String</td><td><p>{ </p><p>"userIP": "0.0.0.0", </p><p>"country": "MYS", </p><p>"obtained": true, </p><p>"obtainedAt": "1680700959" </p><p>}</p></td></tr></tbody></table>

#### Payload fields

| Field                  | Type            | Rule                                  | Description                                                   |
| ---------------------- | --------------- | ------------------------------------- | ------------------------------------------------------------- |
| partnerTrxId           | String          | Required                              | A unique ID you generate for this transaction                 |
| groupId                | String          | Required                              | An ID that links this request to the rest of the KYC flow     |
| faceImage              | String (Base64) | Send this or `livenessTransactionIds` | The selfie image                                              |
| livenessTransactionIds | Array\<String>  | Send this or `faceImage`              | The transaction ID from an earlier Liveness Verification call |
| croppedFaceImage       | String (Base64) | Send this or idFrontSideImage         | The face, cropped from the ID card                            |
| idFrontSideImage       | String (Base64) | Send this or croppedFaceImage         | The front of the ID card                                      |

### Sample Response - Single Error <a href="#sample-request-and-response" id="sample-request-and-response"></a>

<details>

<summary>Sample Response</summary>

```json
{
  "transactionId": "unique transaction id generated to identify this transaction",
  "partnerTrxId": "partner transaction id submitted by customer in request",
  "groupId": "reference id to track complete KYC flow",
  "errors": [
    {
      "message": "No face detected",
      "code": 1055,
      "operations": ["imageFaceMatchVerification", "imageLivenessVerification"]
    }
  ]
}
```

</details>

### Sample Response - Multiple Error <a href="#response" id="response"></a>

<details>

<summary>Sample Response</summary>

{% code expandable="true" %}

```json
{
  "transactionId": "unique transaction id generated to identify this transaction",
  "partnerTrxId": "partner transaction id submitted by customer in request",
  "groupId": "reference id to track complete KYC flow",
  "errors": [
    {
      "message": "croppedFaceImage should be a valid base64 encoded string",
      "code": 5003,
      "fieldName": "payload.croppedFaceImage",
      "operations": ["imageFaceMatchVerification"]
    },
    {
      "message": "faceImage should be a valid base64 encoded string",
      "code": 5003,
      "fieldName": "payload.faceImage",
      "operations": ["imageFaceMatchVerification", "imageLivenessVerification"]
    }
  ]
}
```

{% endcode %}

</details>

### Sample Response - Missing Required Fields

<details>

<summary>Sample Response</summary>

{% code expandable="true" %}

```json
{
  "transactionId": "unique transaction id generated to identify this transaction",
  "partnerTrxId": "partner transaction id submitted by customer in request",
  "groupId": "reference id to track complete KYC flow",
  "errors": [
    {
      "message": " At least one of [faceImage, livenessTransactionIds] must be not blank.",
      "code": 5001,
      "fieldName": "payload.[faceImage, livenessTransactionIds]",
      "operations": ["imageFaceMatchVerification"]
    },
    {
      "message": " At least one of [idFrontSideImage, croppedFaceImage] must be not blank.",
      "code": 5001,
      "fieldName": "payload.[idFrontSideImage, croppedFaceImage]",
      "operations": ["imageFaceMatchVerification"]
    }
  ]
}
```

{% endcode %}

</details>

### Sample Response - Empty Array

When `livenessTransactionIds` is sent as an empty array:

<details>

<summary>Sample Response</summary>

{% code expandable="true" %}

```json
{
  "transactionId": "unique transaction id generated to identify this transaction",
  "partnerTrxId": "partner transaction id submitted by customer in request",
  "groupId": "reference id to track complete KYC flow",
  "errors": [
    {
      "message": "livenessTransactionIds must contain at least one non-blank transactionId",
      "code": 5003,
      "fieldName": "payload.livenessTransactionIds",
      "operations": ["imageFaceMatchVerification"]
    }
  ]
}
```

{% endcode %}

</details>

When `faceImage` is sent as an empty array:

<details>

<summary>Sample Response</summary>

{% code expandable="true" %}

```json
{
  "transactionId": "unique transaction id generated to identify this transaction",
  "partnerTrxId": "partner transaction id submitted by customer in request",
  "groupId": "reference id to track complete KYC flow",
    "errors": [
        {
            "message": " At least one of [faceImage, livenessTransactionIds] must be not blank.",
            "code": 5001,
            "fieldName": "payload.[faceImage, livenessTransactionIds]",
            "operations": [
                "imageFaceMatchVerification"
            ]
        }
    ]
}
```

{% endcode %}

</details>
