> 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:
#### [KYC Reliance using API (Recommended)](/features/kyc-reliance#using-api)
Submit partner-completed KYC data to Transak directly over a sequential API flow.
#### [KYC Reliance using Sumsub](/features/kyc-reliance#using-sumsub)
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
|
**Provider agnostic**
Partners are not limited to a single KYC vendor. They can collect KYC data using providers like `Sumsub`, `Onfido`, and map that data via **Transak’s [KYC Reliance using API](/features/kyc-reliance#api-overview)**.
|
|
**Aggregated payloads**
All required data such as personal details, address, purpose of usage, and country-specific ID documents can be submitted together in a **single API call**, instead of multiple calls.
|
### How to integrate?
#### Whitelist Your API Keys
| 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 |
#### Submit user details (profile, address, purpose, and ID Document details)
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"`, `"Buying NFTs"`, `"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`.
#### Submit identity documents
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 [**Supported Document IDs**](#supported-document-ids) 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) |
> **Info**
>
> **idNumber** field is Optional only for `PROOF_OF_RESIDENCE` document type. For all other document types, idNumber is required.
#### Submit biometrics (selfie and liveness)
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 [**Supported formats**](#supported-formats) for the accepted file types.
```
data:;base64,
```
Example: `data:image/png;base64,`
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. 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)
#### Node.js
**`Node.js`**
```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
**`Python 3`**
```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
**`Java`**
```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
**`Go`**
```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
**`PHP`**
```php title="PHP"
|
Limitation
|
Details
|
|
**KYC Reliance APIs**
|
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.
|
|
**FCA Flow (For UK Users) not supported**
|
Partners can integrate the APIs to submit the FCA requirements. See the [How to Submit FCA Requirements](https://docs.transak.com/guides/how-to-submit-fca) guide for step-by-step instructions.
|
### API Overview
#### [Identity Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-identity-details)
Submits the user's `personal details`, `address`, `purpose of usage`, and optional `tax identifier (TIN)` data to initialize the KYC Reliance flow.
#### [Document Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-document-details)
Submit ID proof document images (e.g. `PASSPORT`, `DRIVING_LICENCE`) as **base64-encoded** data.
#### [Biometrics Details API](/api/whitelabel/kyc-reliance-api/kyc-reliance-biometrics-details)
Submit the user's `selfie image` or `liveness video` as **base64-encoded** data to complete the KYC submission.
### API Errors
#### API Errors Codes
| 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:
|
Field
|
Validation
|
Valid Format
|
|
**First Name**
|
1 to 50 characters
|
John
|
|
**Last Name**
|
1 to 50 characters
|
Doe
|
|
**Date of Birth (DOB)**
|
Age 18–150 years
|
dd/mm/yyyy, dd-mm-yyyy, dd.mm.yyyy
|
|
**Mobile Number**
|
Valid number with + and country code
|
+11234567890, +919876543210
|
|
**Address Line 1**
|
1 to 200 chars, at least one alphabetic, valid postcode format
|
123 Main Street, 2nd Avenue
|
|
**Address Line 2**
|
Optional, 1 to 200 chars
|
—
|
|
**City**
|
1 to 50 characters
|
Austin
|
|
**State**
|
1 to 100 characters
|
Texas
|
|
**Post Code**
|
Valid postcode
|
45123
|
|
**Country Code**
|
Valid country code
|
FRA, IND
|
|
**ID Document**
|
Valid supported country document
|
Passport, Driver's License, Residence Permit, ID Card
|
|
**Advanced Liveliness**
|
Valid live selfie
|
Live selfie
|
|
**SSN (Social Security Number)**
|
Required for `US` users. 9 digits
|
123456789
|
#### Submitting SSN via Sumsub
For `US` users, the SSN must be set on the **TIN field** of the Sumsub applicant, `info.tin` or `fixedInfo.tin` how ever Partner want to sets.
### Current Limitations
|
Limitation
|
Details
|
|
**FCA Flow (For UK Users) not supported**
|
Partners can integrate the APIs to submit the FCA requirements. See the [How to Submit FCA Requirements](https://docs.transak.com/guides/how-to-submit-fca) guide for step-by-step instructions.
|
|
**Purpose of Usage submission not supported**
|
Purpose of usage is not collected as part of KYC Reliance via Sumsub.
|
### How to integrate?
#### Sumsub Configurations
#### Dashboard
#### Log in to Sumsub Dashboard
Access your Sumsub account at [cockpit.sumsub.com](https://cockpit.sumsub.com/).
#### Create Application Level
Go to `Integrations → Application Levels → Individual`, click **Create Level**, and name it `Transak KYC Reliance` (or use your preferred identifier).
#### Configure Required Documents
Enable **Identity document** and **Selfie** verification types. Ensure all document types and selfie options are properly configured.
#### Donor Access Token
#### Request Donor Access Token From Transak
Partners need to share their respective email IDs with Transak to receive the donor access token via a secure link.
#### Log in to Sumsub Dashboard
Access your Sumsub account at [cockpit.sumsub.com](https://cockpit.sumsub.com/).
#### Navigate to Reusable Identity → Partners
Go to the Partners section in your Sumsub dashboard.
#### Add Recipient
Click **Add Recipient** and enter the donor token provided via secure link in the pop-up.
#### Integration Options
#### API
#### [Whitelabel API](/integration/api)
Integrate our APIs in your backend to build a fully custom UI and user journey.
#### Web
#### [Redirection](/integration/web/website-redirection)
Redirect users to Transak's hosted flow via the Web to complete their seamless KYC data sharing.
#### [iFrame](/integration/web/iframe)
Add the Transak Embed to your web app using an iframe.
#### [JavaScript SDK](/integration/web/js-sdk)
Add the Transak Embed to your JavaScript app with our SDK.
#### Mobile WebView
#### [Android](/integration/mobile/native-android)
Add the Transak Embed to your Android app.
#### [iOS](/integration/mobile/native-ios)
Add the Transak Embed to your iOS app.
#### [React Native](/integration/mobile/react-native)
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.
#### [How to Share Sumsub KYC with Transak](/guides/how-to-share-sumsub-kyc)
Step-by-step guide to generate a Sumsub KYC share token and pass it to Transak.
### User Flow Demo
#### Load the Widget
Initialize the widget with the appropriate query parameters using any integration method.
#### Email Verification
Enter your email address and verify using the OTP sent to your inbox. Proceed upon successful verification.
#### KYC Data Fetching
The system fetches KYC data using the shared token from Sumsub.
#### Order Placement
Transak has secured the KYC data. The user is ready to place an order instantly.
> Reuse a user's existing KYC verification with Transak to avoid redundant checks