> For a complete page index, fetch https://docs.transak.com/llms.txt

# KYC Reliance

**KYC Reliance** lets partners reuse a user's existing, already-completed KYC verification instead of asking the user to verify again with Transak. When a user has been verified, whether through a provider like Sumsub or directly by the partner, that verified data is shared with Transak so the user skips redundant KYC. This reduces drop-off, speeds up onboarding, and keeps a single, consistent verification across your platform and Transak.

Transak supports two approaches to KYC Reliance:

Submit partner-completed KYC data to Transak directly over a sequential API flow.

Reuse existing Sumsub KYC data via a share token so already-verified users skip KYC.

## Watch: KYC Reliance and its Types

A short walkthrough of KYC Reliance and its two approaches: using Sumsub and using API.

## KYC Comparison

|                          | **KYC Reliance (API)**                                                                                                                                    | **[KYC Reliance (Sumsub)](/features/kyc-reliance#using-sumsub)**                                      | **Transak Widget KYC**                                                                             |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| **Use case**             | Use this when KYC has already been completed on your platform and you don’t want users to repeat the same KYC process on Transak.                         | Use when you rely on **Sumsub for KYC** and want Transak to use the same KYC data using Sumsub.       | Use when users complete KYC **directly inside the Transak widget** using the Transak KYC Provider. |
| **Identity checks**      | Pass User's **KYC** information to Transak and Transak verifies users information using via [KYC Reliance using API](/features/kyc-reliance#api-overview) | **Transak verifies users**  data from the **Sumsub token shared with Transak via Sumsub integration** | **Transak verifies users** within the widget with the Transak KYC Provider                         |
| **Data flow**            | Partner sends all user data (`profile details`, `documents`, `biometrics`) via [KYC Reliance using API](/features/kyc-reliance#api-overview)              | User completes KYC in **Sumsub**, data is shared with Transak via Sumsub integration                  | Widget collects user data and documents **directly** from the user                                 |
| **Supported KYC levels** | **Standard KYC only**                                                                                                                                     | **Standard KYC only**                                                                                 | **Lite KYC, Standard KYC & Enhanced KYC**                                                          |

## KYC Reliance using API (Recommended) \[#using-api]

[KYC Reliance using API](/features/kyc-reliance#api-overview) lets you submit KYC your platform has already completed (via `Sumsub`, `Onfido`, or any provider), so end-users don't repeat KYC for Transak. Transak validates the submission and relies on your KYC instead of re-running it, cutting friction and drop-off while meeting Transak's compliance requirements.

### Our Solution

<table>
  <tbody>
    <tr>
      <td>
        <strong>
          Provider agnostic
        </strong>

        Partners are not limited to a single KYC vendor. They can collect KYC data using providers like `Sumsub`, `Onfido`, and map that data via <strong>Transak’s [KYC Reliance using API](/features/kyc-reliance#api-overview)</strong>.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Aggregated payloads
        </strong>

        All required data such as personal details, address, purpose of usage, and country-specific ID documents can be submitted together in a <strong>single API call</strong>, instead of multiple calls.
      </td>
    </tr>
  </tbody>
</table>

### How to integrate?

| Action                                                                                                                                |
| ------------------------------------------------------------------------------------------------------------------------------------- |
| Follow the steps in the [Need help in Integration](/help/contact-us) section                                                          |
| Request **API key whitelisting** and ask to **enable [KYC Reliance using API](/features/kyc-reliance#api-overview)** for your API key |
| Share your **public IP addresses** with Transak for whitelisting to use our APIs in your backend                                      |

Call the [Identity Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-identity-details) with a **single combined payload**.

This should include the following data:

**Personal Details** (required)

| Key               | Sub Key        | Test data                       |
| ----------------- | -------------- | ------------------------------- |
| `personalDetails` | `firstName`    | Jane                            |
|                   | `lastName`     | Doe                             |
|                   | `dob`          | 1998-01-01                      |
|                   | `mobileNumber` | +33791112345                    |
| `addressDetails`  | `addressLine1` | 170 Rue du Faubourg Saint-Denis |
|                   | `countryCode`  | FR                              |
|                   | `postCode`     | 75010                           |
|                   | `state`        | Paris                           |
|                   | `city`         | Paris                           |
|                   | `addressLine2` | optional                        |

**PURPOSE OF USAGE** (required)

| key           | description                                                                                                      |
| ------------- | ---------------------------------------------------------------------------------------------------------------- |
| purposeList\* | `"Buying/selling crypto for investments"`, <br />`"Buying NFTs"`, <br />`"Buying crypto to use a web3 protocol"` |

**TIN Details** (optional)

| key              | description           |
| ---------------- | --------------------- |
| documentType\*   | \[US\_SSN]            |
| documentNumber\* | Identification number |

Use the same allowed `purposeList` values as existing API contract.
Country-specific tax ID details are required only when applicable, for example `US_SSN` for the `United States`.

Call the [Document Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-document-details) with this below fields:

| Key             | Description                                                                                                            |
| --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| idType\*        | Type of Document IDs (see <a href="#supported-document-ids"><strong>Supported Document IDs</strong></a> section below) |
| idCountryCode\* | Country code where the document was issued                                                                             |
| idNumber\*      | Document identification number                                                                                         |
| frontImage\*    | Front image of the document (base64, max 5MB)                                                                          |
| backImage       | Back image of the document (base64, max 5MB) (optional)                                                                |

Call the [Biometrics Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-biometrics-details) to submit the user's biometric verification media.

Both values must be **base64-encoded** and sent as data URIs. See <a href="#supported-formats"><strong>Supported formats</strong></a> for the accepted file types.

```
data:<mime-type>;base64,<base64_encoded_data>
```

Example: `data:image/png;base64,<base64_encoded_data>`

Either both or any other can be submitted for `selfie` and `liveness` to complete the KYC submission.

#### Supported Formats

| Media type                                        | Accepted formats |
| ------------------------------------------------- | ---------------- |
| **Selfie Image** (document ID front/back, selfie) | JPEG PNG WEBP    |
| **liveness Video**                                | MP4              |

#### Supported Document IDs

| idType               | Accepted documents                                             |
| -------------------- | -------------------------------------------------------------- |
| `PASSPORT`           | `passport`                                                     |
| `DRIVING_LICENCE`    | `Driving Licence`                                              |
| `ID_CARD`            | `National Identity Card`                                       |
| `PROOF_OF_RESIDENCE` | `Bank Statement`, `Resident Permit`, `Utility Bill`, `Payslip` |
| `VISA`               | `visa`                                                         |
| `UNKNOWN`            | Any other value not listed above                               |

### Field Validation

#### Personal & Address Fields

| Field                    | Constraint                                                                     |
| ------------------------ | ------------------------------------------------------------------------------ |
| **firstName / lastName** | 1–50 characters. ASCII only. <br /> Cannot contain `^ ! # $ % * = < > ; { }`   |
| **addressLine1**         | 3–200 characters. ASCII only. Cannot contain `! $ % ^ * = < >`                 |
| **addressLine2**         | **Optional** Same character restrictions as `addressLine1`                     |
| **city**                 | 2–50 characters                                                                |
| **state**                | 2–100 characters                                                               |
| **postCode**             | Must be a valid postal code for the given `countryCode`                        |
| **dob**                  | ISO 8601 date (`YYYY-MM-DD`). User must be ≥ 18 and \< 150 years old           |
| **mobileNumber**         | Must be a valid international phone number (E.164 format, e.g. `+33791112345`) |

#### Tin Details

| Value    | Applicable country | `documentNumber` format     |
| -------- | ------------------ | --------------------------- |
| `US_SSN` | `US`               | 9 digits (e.g. `123456789`) |

### How to encode images and video as Base64

All document images, selfies, and liveness media should be sent as `Base64-encoded` strings.

* The encoded value must be a single continuous string (no line breaks or spaces).
* Ensure the full file is encoded — do not truncate the string.

#### Encode a file as Base64 (example snippets)

```javascript title="Node.js"
const fs = require('fs');

// Supported image formats: JPEG, PNG, WEBP
// Supported video format: MP4
const filePath = './id-front.jpg';
const mimeType = 'image/jpeg'; // e.g. image/png, image/webp, video/mp4

const base64Data = fs.readFileSync(filePath, { encoding: 'base64' });
const encoded = `data:${mimeType};base64,${base64Data}`;
// Send `encoded` in the API request body
```

```python title="Python 3"
import base64
from pathlib import Path

# Supported image formats: JPEG, PNG, WEBP
# Supported video format: MP4
file_path = Path("id-front.jpg")
mime_type = "image/jpeg"  # e.g. image/png, image/webp, video/mp4

b64_data = base64.b64encode(file_path.read_bytes()).decode("ascii")
encoded = f"data:{mime_type};base64,{b64_data}"
# Send `encoded` in the API request body
```

```java title="Java"
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

// Supported image formats: JPEG, PNG, WEBP
// Supported video format: MP4
byte[] bytes = Files.readAllBytes(Path.of("id-front.jpg"));
String mimeType = "image/jpeg"; // e.g. image/png, image/webp, video/mp4
String b64Data = Base64.getEncoder().encodeToString(bytes);
String encoded = "data:" + mimeType + ";base64," + b64Data;
// Send `encoded` in the API request body
```

```go title="Go"
import (
	"encoding/base64"
	"fmt"
	"os"
)

// Supported image formats: JPEG, PNG, WEBP
// Supported video format: MP4
fileBytes, _ := os.ReadFile("id-front.jpg") // handle error in production
mimeType := "image/jpeg"                    // e.g. image/png, image/webp, video/mp4
b64Data := base64.StdEncoding.EncodeToString(fileBytes)
encoded := fmt.Sprintf("data:%s;base64,%s", mimeType, b64Data)
// Send `encoded` in the API request body
```

```php title="PHP"
<?php
// Supported image formats: JPEG, PNG, WEBP
// Supported video format: MP4
$path     = 'id-front.jpg';
$mimeType = 'image/jpeg'; // e.g. image/png, image/webp, video/mp4

$b64Data = base64_encode(file_get_contents($path));
$encoded = "data:{$mimeType};base64,{$b64Data}";
// Send `$encoded` in the API request body
```

### How does it work?

### Current Limitations

The KYC Reliance API must be called only from the partner’s backend. and subjected to the whitelisting of partner IP addresses. Direct API calls from the frontend apps are not supported.

### API Overview

Submits the user's `personal details`, `address`, `purpose of usage`, and optional `tax identifier (TIN)` data to initialize the KYC Reliance flow.

Submit ID proof document images (e.g. `PASSPORT`, `DRIVING_LICENCE`) as **base64-encoded** data.

Submit the user's `selfie image` or `liveness video` as **base64-encoded** data to complete the KYC submission.

### API Errors

| HTTP Code | Error Code | Message                                                                                                |
| --------- | ---------- | ------------------------------------------------------------------------------------------------------ |
| 400       | 9001       | userCountryCode is required                                                                            |
| 400       | 9001       | personalDetails is required                                                                            |
| 400       | 9001       | firstName is required in personalDetails                                                               |
| 400       | 9001       | lastName is required in personalDetails                                                                |
| 400       | 9001       | dob is required in personalDetails                                                                     |
| 400       | 9001       | addressDetails is required                                                                             |
| 400       | 9001       | countryCode is required in addressDetails                                                              |
| 400       | 9001       | postCode is required in addressDetails                                                                 |
| 400       | 9001       | purposeList is required and must be a non-empty array                                                  |
| 400       | 9001       | documentType must be US\_SSN or PAN\_NUMBER                                                            |
| 400       | 9001       | documentNumber is required in tinDetails                                                               |
| 400       | 9001       | documentProof is required                                                                              |
| 400       | 9001       | idType must be one of PASSPORT, DRIVING\_LICENSE, ID\_CARD, VISA, PROOF\_OF\_RESIDENCE, UNKNOWN        |
| 400       | 9001       | idCountryCode must be a 2-letter ISO uppercase country code                                            |
| 400       | 9001       | idNumber is required in documentProof                                                                  |
| 400       | 9001       | frontImage is required in documentProof                                                                |
| 400       | 9001       | frontImage must not exceed MAX\_BASE64\_IMAGE\_CHARS characters in documentProof                       |
| 400       | 9001       | backImage must not exceed MAX\_BASE64\_IMAGE\_CHARS characters in documentProof                        |
| 400       | 9001       | at least one of selfie or liveness is required                                                         |
| 400       | 9001       | selfie must not be empty                                                                               |
| 400       | 9001       | selfie must not exceed MAX\_BASE64\_IMAGE\_CHARS characters                                            |
| 400       | 9001       | liveness must not be empty                                                                             |
| 400       | 9001       | liveness must not exceed MAX\_BASE64\_VIDEO\_CHARS characters                                          |
| 401       | 1002       | Invalid or missing authentication token.                                                               |
| 403       | 9001       | Required role not found in user roles                                                                  |
| 400       | 3011       | partnerApiKey, kycLevel and userCountryCode are required                                               |
| 400       | 3011       | user not found                                                                                         |
| 403       | 3011       | KYC reliance v2 is not allowed for partner                                                             |
| 400       | 3012       | user not found                                                                                         |
| 403       | 3012       | KYC reliance v2 is not allowed for partner                                                             |
| 403       | 3012       | userId does not match this KYC request                                                                 |
| 400       | 3012       | Invalid kycDataUnit; expected one of valid units                                                       |
| 400       | 3012       | KYC is already approved                                                                                |
| 404       | 3012       | KYC request not found                                                                                  |
| 400       | 3012       | KYC request is not a Reliance V2 staged request                                                        |
| 400       | 3012       | KYC request is already complete                                                                        |
| 400       | 3012       | document-details to be called first                                                                    |
| 400       | 3012       | at least one of selfie or liveness is required for biometrics step                                     |
| 400       | 3012       | liveness must be a string or object                                                                    |
| 400       | 3012       | reliancePayload is required                                                                            |
| 400       | 3012       | Missing required reliance data                                                                         |
| 400       | 3012       | Invalid vendor verificationSteps                                                                       |
| 400       | 3012       | Missing personalDetails fields                                                                         |
| 400       | 3012       | Missing addressDetails fields                                                                          |
| 400       | 3012       | Missing tinDetails fields                                                                              |
| 400       | 3012       | Missing idType in idDocuments                                                                          |
| 400       | 3012       | Missing idNumber in idDocuments                                                                        |
| 400       | 3012       | Missing idCountry in idDocuments                                                                       |
| 400       | 3012       | Missing idDocument front image / Missing idDocument front link                                         |
| 400       | 3012       | Missing selfie image / Missing selfie link                                                             |
| 400       | 3012       | Missing documentProof.frontImage                                                                       |
| 400       | 3012       | Missing documentProof.selfieImage                                                                      |
| 400       | 3012       | Invalid date of birth                                                                                  |
| 400       | 3012       | Invalid countryCode                                                                                    |
| 400       | 3012       | tinDetails.countryCode mismatch                                                                        |
| 400       | 3012       | tinDetails is required for country                                                                     |
| 400       | 3012       | tinDetails.type mismatch                                                                               |
| 400       | 3012       | Invalid purposeOfUsage                                                                                 |
| 400       | 3012       | Invalid base64: must be a non-empty base64 string                                                      |
| 400       | 3012       | Invalid base64: base64 data is empty                                                                   |
| 400       | 3012       | Invalid image: unsupported MIME type. Allowed: image/png, image/jpeg, image/gif, image/bmp, image/webp |
| 400       | 3012       | Invalid image: decoded size exceeds 5MB limit                                                          |
| 400       | 3012       | Invalid liveness: decoded size exceeds 20MB limit                                                      |
| 400       | 3012       | Invalid URL: must be a non-empty string                                                                |
| 400       | 3012       | Invalid URL: must use http or https                                                                    |
| 400       | 3012       | Invalid URL: URL is not valid                                                                          |
| 400       | 3012       | Invalid URL: URL must have a file extension                                                            |
| 400       | 3012       | Invalid URL: SVG is not allowed. Use jpeg, jpg, png, or pdf                                            |
| 400       | 3012       | Invalid URL: extension not allowed. Allowed: jpeg, jpg, png, pdf, webp, mp4, webm                      |
| 500       | 3012       | Something went wrong!                                                                                  |
| 500       | 9999       | Transport failure                                                                                      |
| 400       | 3011       | Unable to get KYC reliance requirements                                                                |
| 400       | 3012       | Unable to submit KYC reliance data                                                                     |
| 400       | 2020       | This phone number is already registered.                                                               |

## KYC Reliance using Sumsub \[#using-sumsub]

**KYC Reliance using Sumsub** allows partners to reuse their existing Sumsub KYC data with Transak, eliminating the need for users to complete verification again.

### How does it work?

#### Mandatory Fields

For seamless user onboarding, ensure the following fields are validated in Sumsub and included in the shared token:

<table>
  <thead>
    <tr>
      <th>
        Field
      </th>

      <th>
        Validation
      </th>

      <th>
        Valid Format
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <strong>
          First Name
        </strong>
      </td>

      <td>
        1 to 50 characters
      </td>

      <td>
        John
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Last Name
        </strong>
      </td>

      <td>
        1 to 50 characters
      </td>

      <td>
        Doe
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Date of Birth (DOB)
        </strong>
      </td>

      <td>
        Age 18–150 years
      </td>

      <td>
        dd/mm/yyyy, dd-mm-yyyy, dd.mm.yyyy
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Mobile Number
        </strong>
      </td>

      <td>
        Valid number with + and country code
      </td>

      <td>
        +11234567890, +919876543210
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Address Line 1
        </strong>
      </td>

      <td>
        1 to 200 chars, at least one alphabetic, valid postcode format
      </td>

      <td>
        123 Main Street, 2nd Avenue
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Address Line 2
        </strong>
      </td>

      <td>
        Optional, 1 to 200 chars
      </td>

      <td>
        —
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          City
        </strong>
      </td>

      <td>
        1 to 50 characters
      </td>

      <td>
        Austin
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          State
        </strong>
      </td>

      <td>
        1 to 100 characters
      </td>

      <td>
        Texas
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Post Code
        </strong>
      </td>

      <td>
        Valid postcode
      </td>

      <td>
        45123
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Country Code
        </strong>
      </td>

      <td>
        Valid country code
      </td>

      <td>
        FRA, IND
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          ID Document
        </strong>
      </td>

      <td>
        Valid supported country document
      </td>

      <td>
        Passport, Driver's License, Residence Permit, ID Card
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Advanced Liveliness
        </strong>
      </td>

      <td>
        Valid live selfie
      </td>

      <td>
        Live selfie
      </td>
    </tr>
  </tbody>
</table>

### How to integrate?

#### Sumsub Configurations

Access your Sumsub account at [cockpit.sumsub.com](https://cockpit.sumsub.com/).

Go to `Integrations → Application Levels → Individual`, click **Create Level**, and name it `Transak KYC Reliance` (or use your preferred identifier).

Enable **Identity document** and **Selfie** verification types. Ensure all document types and selfie options are properly configured.

Partners need to share their respective email IDs with Transak to receive the donor access token via a secure link.

Access your Sumsub account at [cockpit.sumsub.com](https://cockpit.sumsub.com/).

Go to the Partners section in your Sumsub dashboard.

Click **Add Recipient** and enter the donor token provided via secure link in the pop-up.

#### Integration Options

Integrate our APIs in your backend to build a fully custom UI and user journey.

Redirect users to Transak's hosted flow via the Web to complete their seamless KYC data sharing.

Add the Transak Embed to your web app using an iframe.

Add the Transak Embed to your JavaScript app with our SDK.

Add the Transak Embed to your Android app.

Add the Transak Embed to your iOS app.

Add the Transak Embed to your React Native app.

#### Integration Steps

The steps below cover generating a Sumsub KYC share token and passing it to Transak.

Step-by-step guide to generate a Sumsub KYC share token and pass it to Transak.

### User Flow Demo

Initialize the widget with the appropriate query parameters using any integration method.

Enter your email address and verify using the OTP sent to your inbox. Proceed upon successful verification.

The system fetches KYC data using the shared token from Sumsub.

Transak has secured the KYC data. The user is ready to place an order instantly.