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

# KYC Reliance using APIs

[KYC Reliance using APIs](/features/kyc-reliance-using-api#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-using-api#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-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-using-api#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-using-api#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-using-api#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-using-api#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-using-api#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.