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

# Identity Verification

> How identity verification works in the Proof widget

Identity verification is handled entirely inside the widget. You do not build any verification UI yourself.

## First-time user

When a user opens the widget for the first time, the widget detects that no verified profile exists and walks them through:

1. **Document upload** — passport, national ID, or driver's licence.
2. **Liveness check** — a short selfie via camera. Camera permission must be granted (see [Mobile](/on-off-ramp/mobile)).

The widget renders the Sumsub KYC flow automatically when verification is required — you do not need to integrate Sumsub yourself. Once verified, the user proceeds directly to payment without leaving the widget. Typical verification time is a few minutes, but can be longer in some cases.

## Returning user

Verification status is remembered across sessions. A verified user skips directly to payment.

## Check verification status from your backend

<CodeGroup>
  ```bash cURL theme={null}
  curl https://DOMAIN/widget/users/user-123/kyc-status \
    -H "Authorization: Bearer <client_token>"
  ```

  ```javascript JavaScript theme={null}
  const kyc = await fetch(
    `https://DOMAIN/widget/users/${userId}/kyc-status`,
    { headers: { "Authorization": "Bearer <client_token>" } }
  ).then(r => r.json());

  console.log(kyc.status); // "verified", "pending", etc.
  ```
</CodeGroup>

```json Response theme={null}
{
  "partner_user_id": "user-123",
  "status": "verified"
}
```

Full reference: [`GET /widget/users/{id}/kyc-status`](/on-off-ramp/api-kyc-status).

## Statuses

| Status        | Meaning                                                             |
| ------------- | ------------------------------------------------------------------- |
| `not_started` | The user has never opened the widget or has not submitted documents |
| `pending`     | Documents submitted; under review                                   |
| `verified`    | Verification passed — the user can transact                         |
| `failed`      | Verification failed — the user must retry inside the widget         |

## Recommended UX

Embed the widget unconditionally. The widget will start verification automatically for users who need it. There is no error code that requires you to gate the launch yourself.

Optionally, call `GET /widget/users/{id}/kyc-status` first to show a custom message (e.g. "Verify your identity to buy crypto") before opening the widget.

## Camera permissions

The liveness check requires camera access. Without it, verification cannot complete.

* **iOS:** add `NSCameraUsageDescription` to `Info.plist`. See [Mobile](/on-off-ramp/mobile).
* **Android:** use Chrome Custom Tabs (no extra config) or grant `CAMERA` in your manifest if using `WebView`. See [Mobile](/on-off-ramp/mobile).
