Headless Apple Pay (No Auth and No KYC)

Embed Apple Pay in your own interface without routing users through the Transak widget.
View as Markdown

Headless Apple Pay is a lightweight, embeddable UI module that allows partners to offer Apple Pay as a payment method directly within their own application without loading any widget.

Problem Statement

Currently, Transak requires loading the full widget for Apple pay, which forces users to go through multiple screens before reaching payment module. This creates friction and limits the partner control over the payment experience.

Here are some of the key challenges with the current approach:

Full widget required

Partners must load the entire Transak widget to confirm order with Apple pay as payment method.

Multiple screens before payment

Users navigate through several Transak screens before they ever see the Apple Pay button, increasing drop-off risk.

Disconnected payment experience

The payment flow feels separate from the partner’s own UI, breaking the continuity.

Limited partner control

Partners have no control over when or where Apple Pay appears as placement and styling are determined by the widget.

Our Solution

Headless Apple Pay exposes just the Apple Pay button as a standalone, embeddable component. Partners control where it sits, how it looks, and what happens after payment. Transak handles all the payment infrastructure in the background.

Here are some of the key benefits of the Headless Apple Pay solution:

Just the Apple Pay button

Embed only the Apple Pay button — no full widget required.

One tap to payment

Users see the Apple Pay button immediately and complete payment in a single tap, reducing drop-off.

Seamless checkout integration

The Apple Pay button sits inside the partner’s own checkout UI, keeping the experience continuous.

Full partner control

Partners decide where the button appears, how it looks, and what happens after payment.

How does it work?

Headless Apple Pay

Current Limitations

LimitationDetails
Headless Apple Pay APIs (Transaction Session API, Transaction Process API, Transaction Request Status API)

APIs are to be called only from the partner backend and subjected to the whitelisting of partner IP addresses. We don’t support API calls from the frontend due to security restrictions.

No supported device detection

The module does not check whether the user’s device supports Apple Pay. Partners must verify availability before loading the the Transak UI SDK.

Supported only for React Native integrations

The Transak UI SDK is currently available for React Native only. Web-based integrations are not supported at the moment.

Transaction Process API may timeout

The Transaction Process API can take time to process a request. In case of an API timeout or server error, poll the Transaction Request Status API to retrieve the current status of the transaction request.

Supported only for EU KYC users

The Headless Apple Pay (No Auth, No KYC) feature is currently supported only for EU KYC users. It is recommended that partners verify user eligibility via an IP based geography check before loading this flow. For broader coverage, please refer to Headless Apple Pay.

Coverage

S.NoCountryCode
1AndorraAD
2AustriaAT
3BelgiumBE
4CyprusCY
5CzechiaCZ
6DenmarkDK
7EstoniaEE
8FinlandFI
9FranceFR
10GeorgiaGE
11GermanyDE
12GreeceGR
13HungaryHU
14IcelandIS
15IrelandIE
16ItalyIT
17LatviaLV
18LiechtensteinLI
19LithuaniaLT
20LuxembourgLU
21MaltaMT
22MoldovaMD
23MontenegroME
24NetherlandsNL
25NorwayNO
26PolandPL
27PortugalPT
28RomaniaRO
29SerbiaRS
30SlovakiaSK
31SloveniaSI
32SpainES
33SwedenSE
34SwitzerlandCH

How to integrate?

1

Whitelist Your API Key & Enable Headless Apple Pay

Action
Follow the steps in the Need help in Integration section
Request API key whitelisting and ask to enable Headless Apple Pay for your API key
Share your public IP addresses with Transak for whitelisting to use our APIs in your backend
2

Generate a quote using the Quote API

Call the Get Quote API to get a quote for the transaction. Pass the apiKey, fiat amount, fiat currency, crypto currency, network, and order type.

Set paymentMethod to apple_pay while creating a quote.

A successful response returns a quoteId.

3

Create a transaction session (using Backend only)

Call the Transaction Session API from your backend using the quoteId and the user’s wallet address. You can optionally pass a config object to customise the look and feel of the Apple Pay component.

A successful response returns a sessionId.

4

Load the Apple Pay Component via Transak UI SDK

Use the Transak UI SDK to render the Apple Pay component. Pass the sessionId received in previous Step.

$npm install @transak/ui-components-rn
1import { TransakApplePay } from ‘@transak/ui-components-rn’;
2
3<TransakApplePay
4 sessionId={sessionId} // sessionId from Previous Step
5 environment={environment} // 'STAGING' | 'PRODUCTION'
6 onReady={() => {
7 // Component is ready
8 }}
9 onSuccess={({ requestId }) => {
10 // Payment data captured — use requestId in the next step
11 }}
12 onError={({ code }) => {
13 // Handle error
14 }}
15/>

Error codes

The onError callback receives a code value. Use it to handle specific failure scenarios:

CodeDescription
CONFIG_LOAD_FAILEDApple Pay configuration could not be loaded
MERCHANT_VALIDATION_FAILEDMerchant validation with Apple failed
PAYMENT_CAPTURE_FAILEDApple Pay payment capture failed
INVALID_OPTIONSInvalid or missing options passed to the SDK
IFRAME_LOAD_FAILEDThe embedded iframe failed to load
INVALID_STATESDK method called in an unexpected state

Here’s how the Apple Pay module appears :

Apple Pay - Embed UI
5

Process the payment with requestId (using Backend only)

Once the SDK fires onSuccess with a requestId, call the Transaction Process API from your backend to complete the payment and create the order.

A successful response returns the full order details.

6

Track the requestId (using Backend only)

Call the Transaction Request Status API to check whether the request has been processed. Poll this endpoint after calling the Transaction Process API until the status reaches a terminal state.

Once you receive an orderId, use the Get Order by ID API to fetch full order details.

API Overview

Errors & Fallback

API Errors

HTTP StatusError CodeMessage
4226003This feature is not enabled for your account. Please contact support.
4226004Apple Pay is not supported and is not part of this integration.
4226005Quote not found or could not be loaded.
4226005This payment method is not currently supported. Please try a different payment method.
5006005Failed to create a session for the user.
4226006The provided wallet address is invalid for the selected cryptocurrency and network.
HTTP StatusError CodeMessage
4224001Invalid wallet address. Please provide a valid wallet address to proceed.
4224002Please complete your KYC to place an order.
4224003Please upgrade your kyc to next level to proceed with this transaction.
4224005Order exists.
4224006Unable to create order.
4224013Minimum amount should be more than input amount.
4224015Invalid payment method for currency combination.
4224016FCA criteria not met, Please complete the assessments(For UK KYC Users).
4224021Something went wrong, try again later!
4046007Request ID not found.
4226009User account is disabled.
4006010Unable to create user account.
4226012KYC requirement is not approved for this transaction.
4226014Unable to process request. User location data is required for this transaction.
5006099Unable to process the order. Please try again.
HTTP StatusError CodeMessage
4046007Request ID not found.

Fallback

In case of the below error codes, partners should redirect users to the Headless Apple Pay (with Auth and KYC) as a fallback to ensure a smooth and uninterrupted experience.

HTTP StatusError CodeMessage
4224002Please complete your KYC to place an order.
4224003Please upgrade your kyc to next level to proceed with this transaction.
4224016FCA criteria not met, Please complete the assessments(For UK KYC Users).
4226009User account is disabled.
4006010Unable to create user account.
4226012KYC requirement is not approved for this transaction.
5006099Unable to process the order. Please try again.

The same applies if the Transaction Request Status API returns HTTP 200 with status as FAILED

1//Sample response
2{
3 "data": {
4 "status": "FAILED",
5 "reason": "User KYC is not approved."
6 }
7}

Interactive Demo