# Transak | Documentation # What is Transak Transak lets your users buy and sell crypto directly inside your app. It handles KYC, regulation and compliance, fiat payment methods, and crypto coverage so your team can stay focused on building product and growing revenue. Whether you are a startup or an established business, you can integrate Transak's fiat on-ramp and off-ramp in just a few minutes using our Integration Options. ## Products overview A one‑stop solution for users to buy crypto with fiat inside your app. A one‑stop solution for users to sell crypto to fiat inside your app. A one-click NFT solution where users buy NFTs with fiat. ## Get started? Sign up at the Partner Dashboard using your corporate email. You'll get immediate access to the order dashboard and staging API key, so you can start building and testing your integration right away. Submit your KYB form so our compliance team can review and approve your application. KYB is required to gain access to your production API key. Please use the same email address used to create your partner dashboard account. Once you have the partner account, you can get started with the integration into your platform. Choose your integration type. Click a tab to view the relevant 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 fiat-to-crypto purchase or crypto-to-fiat sale. 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. Explore our documentation for everything that's possible with Transak. Click a tab to view the relevant features. Authenticate users without re-login into Transak's flow Share KYC data from your platform with Transak using Sumsub Configure Embed behavior with URL parameters for On Ramp, Off Ramp, and NFT Checkout Customize the look and feel of the Transak widget using query parameters Check supported countries, fiat currencies, payment methods, crypto coverage, fees, and transaction limits across products. Countries, fiat currencies, payment methods, fees, and limits. Supported cryptocurrencies and blockchains. Supported payment methods, fees, and transaction limits for on-ramp flows. Supported payout methods, fees, and transaction limits for off-ramp flows. Supported payment methods, fees, and transaction limits for NFT Checkout. Reach out if you have questions. Contact the team and find resources to help with your integration. # Auth Reliance **Auth Reliance** allows partners to authenticate users without requiring them to re-login into the Transak authentication flow. This feature is exclusively available for [Whitelabel API integrations](/integration/api). ## Problem Statement Integrating third-party payment services often forces users to create separate accounts and log in multiple times, disrupting the user experience and increasing friction in the conversion funnel. Here are some of the **key challenges** with traditional authentication flows in payment integrations:
| Redundant authentication Users must re-authenticate with third-party services even though they're already logged into your platform. |
| Higher drop-off rates Additional authentication steps create friction points that lead to user abandonment and lower conversion rates. |
| Poor user experience Users are confused about why they need to create yet another account or log in again during payment flows. |
| Slower transaction flows Multiple login steps add unnecessary delays to time-sensitive payment transactions. |
| Seamless Authentication Users stay authenticated without re-entering credentials or creating new accounts. |
| Higher Conversion Reduce friction and drop-offs by eliminating redundant authentication steps. |
| Better UX Keep users in your app's flow without disrupting their journey. |
| Backend Security Server-to-server authentication with IP whitelisting ensures secure transactions. |
| Supported | Payment Methods |
|---|---|
| Yes | Bank transfers, Open banking |
| No | Cards, Apple Pay, Google Pay |
| Partner access token (see [guide](/guides/how-to-create-partner-access-token)) User's email address |
| Redundant verification Users must repeat KYC verification even though they're already verified on partner platform. |
| Slower onboarding Additional KYC steps significantly delay user onboarding and increase time to first transaction. |
| Poor user experience Users are frustrated by having to upload documents and complete verification multiple times. |
| Lower conversion rates Duplicate KYC requirements create drop-off points that reduce user conversion and activation. |
| Instant Onboarding Onboard verified users to Transak in under a minute without additional verification. |
| No Repeat KYC Users leverage their existing KYC verification without re-uploading documents or repeating checks. |
| Secure Data Sharing Self-serve, secure integration through Sumsub's token-based KYC data sharing. |
| Higher Conversion Eliminate KYC friction to significantly improve user activation and conversion rates. |
| 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 |
| The Applicant ID retrieved from Step 2 |
| Must be set to `transak` to share data with Transak |
| Token validity in seconds (e.g., 600 for 10 minutes). Maximum 1200 seconds (20 minutes). |
| Set to `SUMSUB` (hardcoded value for Sumsub provider) |
| The secured KYC share token generated in Step 3 |
| Field | Description |
|---|---|
| Order Webhook URL | Your HTTPS endpoint for order events |
| KYC Webhook URL | Your HTTPS endpoint for KYC events |
| Environment |
STAGING
or
PRODUCTION
|
| Event ID | KYC Status | Description |
|---|---|---|
KYC_SUBMITTED
|
SUBMITTED | Triggered when a user submits their KYC details |
KYC_APPROVED
|
APPROVED | Triggered when the user's KYC verification is approved |
KYC_REJECTED
|
REJECTED | Triggered when the user's KYC verification is rejected |
partnerOrderId
{"${END_CUSTOMER_ORDER_ID}"}
partnerOrderId
{"${API_KEY}_${partnerOrderId}"}
partnerOrderId
). Generate a unique order ID and pass it as the
partnerOrderId
query parameter before opening the widget.
{"${API_KEY}"}
API_KEY
&
ACCESS_TOKEN
. The payload is encrypted - decrypt it with your
ACCESS_TOKEN
using the
jsonwebtoken
npm library.
| High drop‑off Most new users abandon the flow before they ever complete a crypto purchase. |
| Wallet confusion Users don't understand wallets, gas fees, or public/private keys. |
| App switching Users must leave the dApp to buy crypto on an exchange, then come back. |
| Heavy jargon Technical terminology overwhelms non‑crypto‑native users. |
## How to integrate?
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 fiat-to-crypto purchase.
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.
# Off-Ramp
**Transak Off-Ramp** lets partner apps enable users to sell crypto directly within their own interface and receive fiat in their local bank account via different payout methods.
## Problem Statement
Off-ramping crypto to fiat remains fragmented: most dApps lose users because selling crypto requires understanding swaps and bridges, paying multiple fees, and constantly switching between platforms.
Here are some of the **key characteristics** of today's **major challenge** in the crypto off-ramp journey:
| High drop‑off Most users abandon the off-ramp flow due to the complexity of swapping and bridging assets. |
| Multiple fees Gas fees for every swap plus bridging fees make the off-ramp journey expensive. |
| App switching Users must leave the dApp to sell crypto on an exchange. |
| Heavy jargon Technical terminology overwhelms non‑crypto‑native users. |
| DeFi Apps Enable users to easily exit positions and convert crypto earnings to fiat. |
| Wallets Provide in-app off-ramp functionality for users to cash out their holdings. |
| Crypto Games Let players convert in-game crypto rewards to real-world currency. |
| DEXes Offer complete liquidity cycle: buy, trade, and cash out to fiat. |
| NFT dApps Enable creators and collectors to convert NFT sales proceeds directly to fiat. |
| Neo-Banks & Protocols Integrate fiat off-ramps for crypto-native financial services and institutional platforms. |
redirectURL with walletRedirection=true to redirect users to your webpage with order data.
walletRedirection=true to receive a WALLET\_REDIRECTION frontend event with order metadata.
| High drop-off Most users abandon the flow before completing their NFT purchase due to the multiple steps required. |
| Multiple fees Users pay gas fees for crypto purchase, token approvals, and the final NFT transaction. |
| App switching Users must leave the marketplace to buy crypto on an exchange, then come back to complete the purchase. |
| Technical complexity Understanding gas tokens, approvals, and transaction signing overwhelms non‑crypto‑native users. |
| Individual Collections Perfect for single NFT collections looking to enable fiat purchases. |
| Agencies & Launchpads No-code solutions and agencies managing multiple NFT projects. |
| Marketplaces Multi-collection marketplaces for primary and secondary sales. |
| Enterprises Gaming, loyalty programs, memberships, and subscription services. |
| Feature | Transak | Other Competitors |
|---|---|---|
| Multiple mints | Unlimited | Max 5 |
| Cryptocurrency support | Any token supported | Only native token or USDC |
| Smart contract requirements | Any custom contract | Your contract must accept buyer's wallet address |
| Transaction limits | Min \$0.01 | Min $3 - $5 |
| Smart contract supported | Self-serve for any custom contract | Limited types of contract |
| Chargeback protection | Yes | Yes |
| Blockchains Supported Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, Cronos, Immutable zkEVM, and all EVM-compatible chains. |
| Pricing No fees charged to partner or business. Network and Processing fees are charged directly to the buyer of the NFT. |
| NFT Standards Supported Supports ERC-721, ERC-721A, and ERC-1155 compliant collections for primary and secondary sales. |
| Contract Types Supported Any custom smart contract on EVM chains — just provide the calldata for execution. |
| Wallets Integrate fiat on/off-ramps directly into wallet interfaces for seamless user experience. |
| DEXs or CEXs Enable users to buy and sell crypto within your exchange platform using fiat. |
| DApps Add fiat payment options to decentralized applications for broader user accessibility. |
| Fintech Apps Power remittances, neobanks, and cross-border payment solutions with crypto rails. |
| Product | Supported | Limitations |
|---|---|---|
| On Ramp | Yes |
Card / Apple Pay: Semi-widget flow required. Navigate to Transak's Widget to add cards and place orders. Google Pay: Not supported. Bank Transfers: Fully supported through APIs. Lite KYC: Fully supported through APIs (Personal & Address details). Standard KYC: Navigate to Transak's provider widget to upload Document ID Proof and conduct Liveness checks. |
| Off Ramp | No | NA |
| NFT Checkout | No | NA |
| KYC Reliance Via Sumsub | Yes | Not supported for US KYC users |
| Transak Stream - Off Ramp | No | NA |
| Transak Stream - On Ramp | No | NA |
| Condition | Next step |
|---|---|
response = 200 and data.kyc.status === "APPROVED"
|
Proceed to Create Order — Bank Transfer, Create Order — Cards, or Create Order — Apple Pay flow |
response = 200 and data.kyc.status === "NOT\_SUBMITTED"
|
Proceed to KYC Flow |
response = 200 and data.kyc.status === "ADDITIONAL\_FORMS\_REQUIRED"
|
Proceed to Additional KYC Flow |
response = 401
|
Proceed to Not Logged In Flow — the User Access Token is missing, expired, or invalid. Re-authenticate using the Not Logged In Flow tab (Send User OTP → Verify User OTP). |
| The user's email address The one-time password from the user's inbox Returned in the Send User OTP response |
| Condition | Next step |
|---|---|
data.kyc.status === "APPROVED"
|
Proceed to Create Order (Bank Transfer / Cards / Apple Pay Flow) |
data.kyc.status === "NOT_SUBMITTED"
|
Proceed to KYC Flow |
data.kyc.status === "ADDITIONAL_FORMS_REQUIRED"
|
Proceed to Additional KYC Flow |
| Condition | Next step |
|---|---|
data.kyc.status = APPROVED
|
Move forward with the Create Order Flow |
data.kyc.status = NOT\_SUBMITTED
|
Follow Step 2 |
data.kyc.status = ADDITIONAL\_FORMS\_REQUIRED
|
Follow Step 3 |
| User's first name User's last name Mobile number with country code Date of birth (ISO 8601) |
| Street address City State or province Postal or zip code Country code (ISO 3166-1 alpha-2) |
| Upload a photo ID — Passport, Driver's License, or National ID Submit a selfie for real-time identity validation |
| 9-digit Social Security Number |
| Accepted values: `SALARY`, `BUSINESS`, `INVESTMENTS`, `SAVINGS` |
| Generate a **new KYC Share Token** and repeat from Step 1. Proceed to **Get KYC Steps**. |
| When | Next step |
|---|---|
data.kyc.status = APPROVED
|
No further steps in the KYC process. Proceed to Get User Limits. |
data.kyc.status = NOT\_SUBMITTED
|
User details need to be submitted. Proceed to Patch User Details. |
data.kyc.status = ADDITIONAL\_FORMS\_REQUIRED
|
More steps in the KYC process are required. Proceed to Get Additional Requirements. |
| Proceed to **Cancel Order** Proceed to **Create Order** |
| Proceed to **Confirm Payment** **Cancel Order** → repeat **Get User Limits** **Get Quote** → repeat **Get User Limits** |
| When | Next step |
|---|---|
data.kyc.status = APPROVED
|
No further steps in the KYC process. Proceed to Get User Limits. |
data.kyc.status = NOT\_SUBMITTED
|
User details need to be submitted. Proceed to Patch User Details. |
data.kyc.status = ADDITIONAL\_FORMS\_REQUIRED
|
More steps in the KYC process are required. Proceed to Get Additional Requirements. |
| Proceed to **Cancel Order** Proceed to **Create Widget URL** |
| When | Next step |
|---|---|
data.kyc.status = APPROVED
|
No further steps in the KYC process. Proceed to Get User Limits. |
data.kyc.status = NOT\_SUBMITTED
|
User details need to be submitted. Proceed to Patch User Details. |
data.kyc.status = ADDITIONAL\_FORMS\_REQUIRED
|
More steps in the KYC process are required. Proceed to Get Additional Requirements. |
| Proceed to **Cancel Order** Proceed to **Create Widget URL** |
| When | Next step |
|---|---|
data.kyc.status = APPROVED
|
No further steps in the KYC process. Proceed to Get User Limits. |
data.kyc.status = NOT\_SUBMITTED
|
User details need to be submitted. Proceed to Patch User Details. |
data.kyc.status = ADDITIONAL\_FORMS\_REQUIRED
|
More steps in the KYC process are required. Proceed to Get Additional Requirements. |
| Proceed to **Cancel Order** Proceed to **Create Order** |
| The Open Banking authorization URL |
| Event Name | Description |
|---|---|
TRANSAK_WIDGET_INITIALISED
|
Widget initialised with query params |
TRANSAK_WIDGET_OPEN
|
Widget fully loaded |
TRANSAK_ORDER_CREATED
|
Order created by user |
TRANSAK_ORDER_SUCCESSFUL
|
Order is successful |
TRANSAK_ORDER_CANCELLED
|
Order is cancelled |
TRANSAK_ORDER_FAILED
|
Order is failed |
TRANSAK_WIDGET_CLOSE
|
Widget is about to close |
| Event Name | Description |
|---|---|
TRANSAK_WIDGET_INITIALISED
|
Widget initialised with query params |
TRANSAK_WIDGET_OPEN
|
Widget fully loaded |
TRANSAK_ORDER_CREATED
|
Order created by user |
TRANSAK_ORDER_SUCCESSFUL
|
Order is successful |
TRANSAK_ORDER_CANCELLED
|
Order is cancelled |
TRANSAK_ORDER_FAILED
|
Order is failed |
TRANSAK_WIDGET_CLOSE
|
Widget is about to close |
| Feature | Approach |
|---|---|
| How to redirect users back to your app after a transaction | [Deeplink](#deeplinking) |
| How to get order data (e.g. status, order ID, amount) | [Deeplink](#deeplinking), [Events](#events) |
| Listen to WebView events (order created, widget close, etc.) | [Events](#events) |
| Event Name | Description |
|---|---|
TRANSAK_WIDGET_INITIALISED
|
Widget initialised with query params |
TRANSAK_WIDGET_OPEN
|
Widget fully loaded |
TRANSAK_ORDER_CREATED
|
Order created by user |
TRANSAK_ORDER_SUCCESSFUL
|
Order is successful |
TRANSAK_ORDER_CANCELLED
|
Order is cancelled |
TRANSAK_ORDER_FAILED
|
Order is failed |
TRANSAK_WIDGET_CLOSE
|
Widget is about to close |
| Feature | Approach |
|---|---|
| How to redirect users back to your app after a transaction | [Deeplink](#deeplinking) |
| How to get order data (e.g. status, order ID, amount) | [Deeplink](#deeplinking), [Events](#events) |
| Listen to WebView events (order created, widget close, etc.) | [Events](#events) |
| Event Name | Description |
|---|---|
TRANSAK_WIDGET_INITIALISED
|
Widget initialised with query params |
TRANSAK_WIDGET_OPEN
|
Widget fully loaded |
TRANSAK_ORDER_CREATED
|
Order created by user |
TRANSAK_ORDER_SUCCESSFUL
|
Order is successful |
TRANSAK_ORDER_CANCELLED
|
Order is cancelled |
TRANSAK_ORDER_FAILED
|
Order is failed |
TRANSAK_WIDGET_CLOSE
|
Widget is about to close |
| Prop | Description |
|---|---|
transakConfig
|
Supports widgetUrl and referrer as mandatory parameters
|
onTransakEvent
|
Callback function to listen to widget events |
| Event Name | Description |
|---|---|
TRANSAK_WIDGET_INITIALISED
|
Widget initialised with query params |
TRANSAK_ORDER_CREATED
|
Order created by user |
TRANSAK_ORDER_SUCCESSFUL
|
Order is successful |
TRANSAK_ORDER_CANCELLED
|
Order is cancelled |
TRANSAK_ORDER_FAILED
|
Order is failed |
TRANSAK_WALLET_REDIRECTION
|
Widget is about to redirect to passed URL |
TRANSAK_WIDGET_CLOSE
|
Widget is about to close |
123456789 to create a test account.
ABCDE1234A to place INR order.
| Consistent Pricing Quotes from the Get Price API match exactly what users see inside the Transak Widget — no surprises at checkout. |
| Region-Accurate Fees Pricing varies by region. Passing the correct country code ensures fees, limits, and rates are calculated for the right market. |
| JWT token to include as a `Bearer` token in subsequent API requests. Unix timestamp (seconds) indicating when the token expires. |
| Extra steps for users Users may need to repeat selections or details that your app already knows, which adds avoidable friction to the flow. |
| Limited journey control Partners cannot fully shape the user experience. |
| Repeated data entry Asking users to re-enter wallet, email, or KYC details can slow conversion and create an inconsistent experience. |
| Higher drop-off risk Every additional step can increase abandonment, especially when the partner app could have handled part of the journey upfront. |
|
Recommended parameters `apiKey`, `productsAvailed`, `fiatAmount`, `fiatCurrency`, `cryptoCurrencyCode`, `network`, `paymentMethod`, `hideExchangeScreen` |
|
Useful APIs [Get Price](/api/public/get-price), [Get Fiat Currencies](/api/public/get-fiat-currencies), [Get Crypto Currencies](/api/public/get-crypto-currencies) |
|
Required parameters `walletAddress`, `disableWalletAddressForm=true` |
|
Required parameter `email` |
|
Required parameter `userData` |
|
How it works Once the event is received, you can close the widget or move users to the next step in your own flow instead of keeping them on the completion screen. |
|
Supported integrations [JavaScript SDK](/integration/web/js-sdk), [Android](/integration/mobile/native-android), [iOS](/integration/mobile/native-ios), [React Native](/integration/mobile/react-native) |
|
Supported options [Get Order By ID](/api/public/get-order-by-order-id), [Webhooks](/features/webhooks), [WebSockets](/features/websockets) |
|
Supported option [Get Orders](/api/public/get-orders) |
| Your Partner Access Token from Step 1. User Authorization Token — only required for integrations using the User Authentication API. |
| Object containing all widget configuration. Your API key from the [Transak Partner Dashboard](https://dashboard.transak.com/). Your domain URL (web) or application package name (mobile). |
widgetUrl is valid for 5 minutes from creation.
sessionId can only be used once.
widgetUrl.
sessionId is required for every fresh user flow.
| Externally Owned Accounts (EOAs) Controlled by a private key (e.g. MetaMask). Can send transactions and interact with contracts, but cannot execute complex logic or batch operations. |
| Contract Accounts (CAs) Smart contract code deployed on-chain. Can execute complex logic and interact with other contracts, but require deployment and cannot initiate transactions on their own. |
| EIP-4337 Smart Accounts Combine the best of both worlds — smart contract functionality within a single wallet. Enable account abstraction across DeFi, GameFi, DAOs, and more. |
| True Composability Dynamic execution where each step can reference outputs from previous steps. |
| Cross-Chain Orchestration A single signature authorizes complex flows spanning multiple chains simultaneously. |
| Universal Gas Abstraction Pay for gas on any chain using tokens from any other supported chain. |
| EOA Wallet Support Works with standard wallets like MetaMask — no smart wallet deployment required. |
| Orchestrator A Companion Smart Account that represents the user's wallet. Invisible to users — handles batching, permissions, and fee payments. |
| MEE Client Collects instructions, bundles them, and coordinates execution across chains. |
| Instructions Transaction objects created by dApps. Built using composable patterns that allow dynamic, multi-step execution. |
| Fee Token Specifies which token to use for gas, allowing users to pay fees with any supported token on any chain. |
| Easy User Onboarding Works with existing EOA wallets — no smart wallet setup required for your users. |
| Fiat On-Ramp Let users buy crypto directly within your dApp via Transak's on-ramp. |
| Single Signature UX One signature covers complex multi-step and multi-chain operations. |
| Gasless Transactions Users pay transaction fees with any supported token — no native gas token required. |
| Chain Agnostic Natively orchestrates operations across chains with a single authorization. |
| Custom Transaction Bundling Batch multiple actions across chains in one transaction (e.g. Approve + Deposit). |
Address: {account}
USDC Balance: {balance ? `${formatUnits(balance, 6)} USDC` : '–'}
MEE client ready – you can now orchestrate multichain transactions!
> )} {status &&{status}
} {meeScanLink && ( )}