> 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/kyc-web-sdk/integration/backend-integration/kyc-status-api.md).

# KYC Status API

{% hint style="info" %}
**Purpose Of This Page**

Documents `GET` `/verify/status` - the primary post-SDK call to retrieve the overall KYC outcome and per-operation status breakdown.
{% endhint %}

### Step 2 - KYC Status API

Call this API immediately after your backend receives the SDK response. It returns the overall KYC decision and the status of every individual operation (OCR, IDV, Liveness, FaceMatch).

#### Endpoint

<mark style="color:blue;">**`GET`**</mark> `/verify/v2/status?verificationId=UUID`

#### When to Call

1. Mobile app receives the SDK response
2. App forwards the payload to your backend
3. Backend calls `GET` `/verify/status` using the `verificationId`
4. Backend acts on `overallStatus` to route the user

#### Request

| Parameter        | Location     | Type          | Required | Description                                |
| ---------------- | ------------ | ------------- | -------- | ------------------------------------------ |
| `verificationId` | Query string | string (uuid) | Yes      | The `verificationId` from the SDK response |

#### Response Fields

| Field                 | Type            | Description                                                                        |
| --------------------- | --------------- | ---------------------------------------------------------------------------------- |
| `verificationId`      | string          | The KYC case ID                                                                    |
| `overallStatus`       | string (enum)   | Overall outcome: `VERIFIED`, `REVIEW`, `ERROR`, `IN_PROGRESS`, or `FAILED`         |
| `updatedTime`         | ISO 8601 string | Timestamp of the last status update                                                |
| `documentCaptureMode` | string          | FRONT\_BACK\_SEPARATE or BOTH\_SIDE                                                |
| `requiredOperations`  | string\[]       | Operations that must complete for this flow type (determined by SDK `kycFlowType`) |
| `fraudResult`         | object          | Fraud Shield evaluation (if enabled). Empty object if not applicable.              |
| `operations`          | object          | Per-operation status and transaction ID breakdown (see below)                      |

#### operations Object

Each operation contains its latest result and a list of all previous attempt IDs.

{% hint style="info" %}
**Null status means not yet attempted**\
If an operation has not been attempted, `latestExecution` will contain: `status: null`, `transactionId: null`, `updatedTime: null.`

This results in an `overallStatus` of `IN_PROGRESS` if that operation is in the `requiredOperations` list.
{% endhint %}

<details>

<summary>JSON Response</summary>

{% code expandable="true" %}

```json
"operations": {
 
  // Document operations — split by front/back
  "ocr": {
    "front": {
      "latestExecution": {
        "status":        "VERIFIED",            // VERIFIED | REVIEW | ERROR | null
        "transactionId": "70f5e8df-...",
        "updatedTime":   "2025-10-30T23:40:04.512"
      },
      "previousTransactionIds": ["earlier-id-1"]  // IDs from retried attempts
    },
    "back": { ... }   // Same structure
  },
  "idVerification": {
    "front": { ... },
    "back":  { ... }
  },
 
  // Non-document operations — use 'result' key (no front/back split)
  "livenessVerification": {
    "result": {
      "latestExecution":      { "status": "VERIFIED", "transactionId": "...", "updatedTime": "..." },
      "previousTransactionIds": []
    }
  },
  "faceMatchVerification": {
    "result": { ... }   // Same structure
  }
}
```

{% endcode %}

</details>

#### overallStatus Values

| Status        | When It Applies                                                                                                                               | Precedence  |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `FAILED`      | KYC session remained `IN_PROGRESS` beyond the configured timeout (user abandoned, SDK crashed, etc.). Terminal - no further updates accepted. | 1 (highest) |
| `IN_PROGRESS` | At least one required operation has not been attempted yet.                                                                                   | 2           |
| `ERROR`       | All required operations have been attempted, and at least one latest result is `ERROR`.                                                       | 3           |
| `REVIEW`      | All required operations are complete, none are ERROR, but one or more are `REVIEW`.                                                           | 4           |
| `VERIFIED`    | All required operations are complete and every latest result is `VERIFIED`.                                                                   | 5 (lowest)  |

#### Sample Responses

**Verified - All Checks Passed**

<details>

<summary>JSON Response</summary>

{% code expandable="true" %}

```json
{
  "verificationId": "005e9def-c93a-3703-af5b-424a42f7c08a",
  "overallStatus": "VERIFIED",
  "updatedTime": "2025-10-30T23:43:41.936",
  "documentCaptureMode": "FRONT_BACK_SEPARATE",
  "requiredOperations": ["ocr", "idVerification", "livenessVerification", "faceMatchVerification"],
  "fraudResult": {},
  "operations": {
    "ocr": {
      "front": { "latestExecution": { "status": "VERIFIED", "transactionId": "70f5e8df-..." }, "previousTransactionIds": [] },
      "back":  { "latestExecution": { "status": "VERIFIED", "transactionId": "5282b0b8-..." }, "previousTransactionIds": [] }
    },
    "idVerification": {
      "front": { "latestExecution": { "status": "VERIFIED", "transactionId": "70f5e8df-..." }, "previousTransactionIds": [] },
      "back":  { "latestExecution": { "status": "VERIFIED", "transactionId": "5282b0b8-..." }, "previousTransactionIds": [] }
    },
    "livenessVerification":  { "result": { "latestExecution": { "status": "VERIFIED", "transactionId": "47ad1045-..." }, "previousTransactionIds": [] } },
    "faceMatchVerification": { "result": { "latestExecution": { "status": "VERIFIED", "transactionId": "35d26180-..." }, "previousTransactionIds": [] } }
  }
}


```

{% endcode %}

</details>

**IN\_PROGRESS - Liveness and FaceMatch not yet done**

<details>

<summary>JSON Response</summary>

{% code expandable="true" %}

```json
{
  "verificationId": "434790d6-ecd4-4b4d-876d-9a208e260e27",
  "overallStatus": "IN_PROGRESS",
  "updatedTime": "2025-10-30T23:58:30.907",
  "documentCaptureMode": "FRONT_BACK_SEPARATE",
  "requiredOperations": ["ocr", "idVerification", "livenessVerification", "faceMatchVerification"],
  "fraudResult": {},
  "operations": {
    "ocr": {
      "front": { "latestExecution": { "status": "REVIEW",   "transactionId": "381e5639-..." }, "previousTransactionIds": [] },
      "back":  { "latestExecution": { "status": "REVIEW",   "transactionId": "381e5639-..." }, "previousTransactionIds": [] }
    },
    "idVerification": {
      "front": { "latestExecution": { "status": "VERIFIED", "transactionId": "381e5639-..." }, "previousTransactionIds": [] },
      "back":  { "latestExecution": { "status": "VERIFIED", "transactionId": "381e5639-..." }, "previousTransactionIds": [] }
    },
    "livenessVerification":  { "result": { "latestExecution": { "status": null, "transactionId": null, "updatedTime": null }, "previousTransactionIds": [] } },
    "faceMatchVerification": { "result": { "latestExecution": { "status": null, "transactionId": null, "updatedTime": null }, "previousTransactionIds": [] } }
  }
}


```

{% endcode %}

</details>

**ERROR - Fraud detected on Face Match**

<details>

<summary>JSON Response</summary>

{% code expandable="true" %}

```json
{
  "verificationId": "abc-123",
  "overallStatus": "ERROR",
  "operations": {
    "ocr":                   { "front": { "latestExecution": { "status": "VERIFIED" } } },
    "idVerification":        { "front": { "latestExecution": { "status": "VERIFIED" } } },
    "livenessVerification":  { "result": { "latestExecution": { "status": "VERIFIED" } } },
    "faceMatchVerification": { "result": { "latestExecution": { "status": "ERROR"    } } }
  },
  "fraudResult": {
    "configuredErrorThreshold":   "HIGH",
    "configuredWarningThreshold":  "MEDIUM",
    "result": {
      "verificationId": "abc-123",
      "riskLevel": "HIGH",
      "evaluatedAt": "2026-04-01T10:30:00.000+07:00",
      "deviceProfile":   { ... },
      "behaviorMetrics": { ... },
      "sessionContext":  { ... },
      "userProfile":     { ... },
      "ipProfile":       { ... },
      "ruleEvaluations": [ ... ]
    }
  }
}


```

{% endcode %}

</details>

#### Using previous TransactionIds for Reconciliation

The `operations` object returns not only the latest `transactionId` per operation, but also all previous attempt IDs from retries. You can pass any of these to the [*Transaction Details API*](/identity-stack/verify/kyc-web-sdk/integration/backend-integration/transaction-details-api.md).

<details>

<summary>Responses</summary>

{% code expandable="true" %}

```json
// From GET /verify/status response:
operations.ocr.front.latestExecution.transactionId = "70f5e8df-..."
operations.ocr.front.previousTransactionIds        = ["earlier-id-1", "earlier-id-2"]
 
// Pass any of these to the Transaction Details API:
GET /api/v1/transaction/70f5e8df-...      ← latest attempt
GET /api/v1/transaction/earlier-id-1      ← previous attempt (for reconciliation)
```

{% endcode %}

</details>
