> 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 — either 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.

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

[KYC Reliance using APIs](/features/kyc-reliance#api-overview) lets you submit KYC already completed on your platform, so end-users don't have to repeat KYC for Transak.

If you've already verified a user through `Sumsub`, `Onfido`, or any other provider your platform uses send that verified data to Transak via the [KYC Reliance using APIs](/features/kyc-reliance#api-overview). Transak validates the submission and relies on your KYC instead of re-running KYC from scratch.

This eliminates duplicate KYC for end-users cutting friction and drop-off while maintaining Transak's compliance requirements.

### KYC Comparison (KYC Reliance (API) vs. Sumsub vs. Transak Widget)

|                          | **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 APIs](/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 APIs](/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**                                                          |

### 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 APIs](/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>

    <tr>
      <td>
        <strong>
          No duplicate UX in the partner's app
        </strong>

        Users who have already completed KYC on the partner’s platform do not need to repeat the same process in Transak. Their verified profile can be reused seamlessly across Transak products.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Seamless experience & Faster onboarding
        </strong>

        User KYC data verified on your platform is submitted to Transak via [KYC Reliance using APIs](/features/kyc-reliance#api-overview). This means users who have already been verified on your platform can proceed directly to the order—without any KYC screens appearing in the white-label flows.
      </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 APIs](/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, PAN\_NUMBER]   |
| documentNumber\* | tax identification number |

Use the same allowed `purposeList` values as existing API contract.
Country-specific tax ID details are required only when applicable, for example `PAN_NUMBER` for India or `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`, `DriversLicense`                            |
| `ID_CARD`            | `national_identity_card`, `AadharCard`                         |
| `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`)                   |
| `PAN_NUMBER` | `IND`              | 10-character alphanumeric (e.g. `ABCDE1234F`) |

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

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

### Problem Statement

Traditional integration flows require users to complete KYC verification separately for each platform, creating unnecessary friction and delays in the user journey.

Here are some of the **key challenges** with duplicate KYC processes:

<table>
  <tbody>
    <tr>
      <td>
        <strong>
          Redundant verification
        </strong>

        Users must repeat KYC verification even though they're already verified on partner platform.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Slower onboarding
        </strong>

        Additional KYC steps significantly delay user onboarding and increase time to first transaction.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Poor user experience
        </strong>

        Users are frustrated by having to upload documents and complete verification multiple times.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Lower conversion rates
        </strong>

        Duplicate KYC requirements create drop-off points that reduce user conversion and activation.
      </td>
    </tr>
  </tbody>
</table>

### Our Solution

KYC Reliance allows partners to share their existing KYC data with Transak using Sumsub, eliminating duplicate verification and creating a seamless one-click onboarding experience.

Here are some of the **key benefits** of the KYC Reliance solution:

<table>
  <tbody>
    <tr>
      <td>
        <strong>
          Instant Onboarding
        </strong>

        Onboard verified users to Transak in under a minute without additional verification.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          No Repeat KYC
        </strong>

        Users leverage their existing KYC verification without re-uploading documents or repeating checks.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Secure Data Sharing
        </strong>

        Self-serve, secure integration through Sumsub's token-based KYC data sharing.
      </td>
    </tr>

    <tr>
      <td>
        <strong>
          Higher Conversion
        </strong>

        Eliminate KYC friction to significantly improve user activation and conversion rates.
      </td>
    </tr>
  </tbody>
</table>

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