In-App Push Provisioning
Learn how to add cards to digital wallets with in-app push provisioning.
Before setting up digital wallet in-app push provisioning, the implementation steps for digital wallets must be complete.
Push provisioning allows your cardholders to add their virtual or physical cards to their digital wallets with the tap of a button in your mobile app. This lets them skip manually typing in their card information.
Guide: Enabling Push Provisioning
There are three main steps to enabling push provisioning:
- Obtaining Entitlements from the wallets
- Sharing your Entitlements with Lithic
- Setting up the Add to Wallet button
1. Obtaining Entitlements from the Wallets
Entitlements from Apple
To obtain entitlements from Apple, the owner of your Apple developer account (the account holder) must submit a request using Apple's Apple Pay In-App Provisioning request form.
The form asks a series of program-related questions. Be prepared to provide:
- Card issuer name: the name of your company, e.g., PayPal
- App name: the name of your app, e.g., PayPal Mobile
- Apple/Adam ID: can be found from App Store Connect
- A description of how your app will use this capability
- The sponsor bank you are working with to offer your debit or credit product
- Whether you plan to offer both a physical and digital card for customers
- Whether you plan to use a third party in the development and/or management of your app when using Apple Pay (if so, the company name)
Once Apple Pay approves your request, they will follow up with the remaining setup steps, including entitlement configuration and metadata/payment data configuration.
Entitlements from Google
To obtain entitlements from Google, request access to Google’s Push Provisioning API here:
- Push Provisioning API Access Request:
<https://support.google.com/faqs/contact/pp_api_allowlist?authuser=1> - Push Provisioning API UX Review Request:
<https://support.google.com/faqs/contact/pp_api_ux>
Entitlements from Samsung
To obtain entitlements from Samsung, your dev team must create an account and request access to the Samsung Pay developer portal. Once access has been granted, complete the following onboarding steps in the portal:
- Create a push provisioning service, providing service details such as the service name and issuer name
- Register the app that will handle push provisioning card enrollment, or select an existing one
- Submit a service release request with your production app for Samsung's review
- Once Samsung approves the request, release the service to make push provisioning available
Your developers can find detailed set-up instructions in the portal and reach out to Samsung with any inquiries.
2. Sharing Entitlements with Lithic
Once you’ve completed the entitlements process with the digital wallets, you’ll need to share the following with Lithic:
Apple:
- Application Identifiers
- Adam ID
- Application Launch URL
Share these with your implementation or customer success manager.
For Google & Samsung, you'll need to obtain Push Provisioning API Access (see link above) to be added to Google's allowlist.
3. Setting up the Add to Wallet button
Once you’ve shared your entitlements with Lithic, you’re ready to set up your Add to Wallet button in your mobile app! When your users click Add to Wallet, you’ll make a series of calls to the wallets and Lithic to kick off the digital wallet tokenization process.
Push Provisioning with Apple
Push provisioning with Apple Wallet involves several parties: your app, Apple Wallet/Servers, and Lithic (your issuer).
- First, your user triggers push provisioning by pressing the “Add to Apple Wallet” button in the app.
- Your app will then call Apple, who will generate Public Certificates and a nonce. Those determine how Lithic encrypts payment data.
- The Apple Public Certificates and nonce are provided to your app.
- Your app then passes this certificate and nonce to Lithic as part of your call to the
/cards/{card_token}/provisionendpoint (see Provision Card - Digital Wallet). - We then return several pieces of information to your app: an
ephemeralPublicKey,encryptedPassData, andactivationData. - Your app passes this data to Apple, who coordinates with the card network to kick off the regular digital wallet tokenization flow.
Check out Apple's Wallet documentation for more detail.
Push Provisioning with Apple (activationData Only)
activationData Only)If you only require activationData (e.g. a card is already added to Apple Wallet and only needs to be activated) you can omit steps 2 and 3 above. By omitting the certificate, nonce, and nonce_signature in the /cards/{card_token}/provision request body you will only receive the activationData in the response body which can then be passed to Apple.
Push Provisioning with Google
Push provisioning with Google Wallet is similar, and runs through Google’s TapAndPay SDK. The integration is called Unified Android Push Provisioning.
Google is ending support for legacy in-app push provisioning at the end of 2026. Every app with an in-app “Add to Google Wallet” button must be migrated before then. If you are still using the previous in-app provisioning, see Migrating to Google UPP for what to change.
Once you’ve been approved for access to Google’s Push Provisioning API, go to Google’s Integration Steps page to see their documentation.
For Google, you’ll work with us, the TSP (Token Service Provider) in Google’s parlance, to generate and encrypt an OPC (Opaque Payment Card).
This guide shows using the UPP (Unified Push Provisioning) flow. This requires API Version
2026-07-01. Apple Pay and Samsung Pay behavior is unchanged on this version.Google Pay UPP is not available in the sandbox environment.
“This API version” means
2026-07-01. On2026-07-01, all Google Pay in-app push provisioning routes through UPP, whether or not you sendserver_session_idandgoogle_opc_requested. Apple Pay and Samsung Pay integrations that call the same endpoint are not affected.
The Google UPP parameters below — the
server_session_idandgoogle_opc_requestedrequest parameters, and thegoogle_provisioning_payloadresponse parameter — require theapi-version: 2026-07-01request header. On earlier API versions the request and response are unchanged.
api-versionis a request header that selects which version of the Lithic API serves a given request. Its value is a date, sent with novprefix, e.g."api-version: 2026-07-01". Send it alongside yourAuthorizationheader on the/cards/{card_token}/provisioncall. The version dropdown in these docs prefixes the same version with av, but the header value should not include it. See API Versioning for the full list of versions and how to choose one.
- Your user triggers push provisioning by pressing the “Add to Google Wallet” button in your app.
- Your app calls Google’s TapAndPay SDK. When the SDK calls back into your app for the payment credentials, make your
/cards/{card_token}/provisionrequest from inside that callback, passingclient_wallet_account_idandclient_device_id. On API version2026-07-01,client_device_idis optional, and you can additionally sendserver_session_idandgoogle_opc_requestedif you need the FPAN (Funding Primary Account Number) payload. - Lithic returns a base64 encoded
provisioning_payloadrepresenting the card, which drives the tokenization flow. On API version2026-07-01, when you sendgoogle_opc_requestedastrue, the response also carriesgoogle_provisioning_payloadfor the FPAN flow. - Your app returns the payloads to the TapAndPay SDK to complete provisioning.
Push Provisioning with Samsung
Push provisioning with Samsung Pay uses the Samsung Pay SDK and requires access to the Samsung Pay developer portal (see Entitlements from Samsung). As with Google, Lithic acts as the TSP that generates and encrypts the payload Samsung provisions to the wallet.
- Your user triggers push provisioning by pressing the “Add to Samsung Wallet” button in your app. Use Samsung’s official button assets and follow their button design guidelines; the assets are available through the Samsung Pay developer portal.
- Your app confirms Samsung Wallet is ready and gathers the wallet and device identifiers Samsung provides.
- Pass
client_wallet_account_idandclient_device_idin your/cards/{card_token}/provisionrequest. Both are required regardless of network, though the values are only used for cards on the Visa network. - Lithic returns a base64 encoded
provisioning_payloadrepresenting the card. - Your app hands this payload to the Samsung Pay SDK to complete provisioning.
For SDK setup, method signatures, and how to pass the payload, see Samsung’s push provisioning documentation.
Provision Card - Digital Wallet
API Reference: Provision card (Digital Wallet)
As part of the push provisioning flow, when your user presses the “Add to Wallet” button, you’ll want to call Lithic to generate an encrypted provisioning_payload. This cryptographic payload represents a payment card that can be passed to a device's digital wallet.
To determine if a transaction originated from a card once provisioned to the wallet, use the token_info field in ASA.
POST https://api.lithic.com/v1/cards/{card_token}/provisionSample Request
curl https://api.lithic.com/v1/cards/f5f905f5-8a8e-49bf-a9b4-c0adaa401456/provision \
-X POST \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '
{
"digital_wallet":"APPLE_PAY"
}
'| Parameter | Description |
|---|---|
| card_token (required, path parameter) | Globally unique identifier for the card to be added to a device's digital wallet. String. Permitted values: 36-digit version 4 UUID (including hyphens). |
certificate (only applicable if digital_wallet is APPLE_PAY) | Apple's public leaf certificate, provided by the device's wallet. Omit to receive only activationData in the response. String. Permitted values: Base64 encoded in PEM format with headers ( -----BEGIN CERTIFICATE-----) and trailers omitted. |
client_wallet_account_id (only applicable if digital_wallet is GOOGLE_PAY or SAMSUNG_PAY) | Consumer ID that identifies the wallet account holder entity. Required for both Google Pay and Samsung Pay regardless of network, though the value is only used for cards on the Visa network and is ignored on Amex and Mastercard. String. |
client_device_id (only applicable if digital_wallet is GOOGLE_PAY or SAMSUNG_PAY) | Stable device identification set by the wallet provider. On API version 2026-07-01, optional for Google Pay and required for Samsung Pay; on earlier API versions it is required for both. These requirements apply regardless of network, though the value is only used for cards on the Visa network and is ignored on Amex and Mastercard. String. |
| digital_wallet (required) | Name of digital wallet to which the card will be added. String. Permitted values: APPLE_PAY, GOOGLE_PAY, SAMSUNG_PAY. |
google_opc_requested (only applicable if digital_wallet is GOOGLE_PAY; requires API version 2026-07-01) | Set to true to also receive google_provisioning_payload, the payload for the FPAN flow, alongside provisioning_payload, the payload for the tokenization flow. Requires server_session_id. Google's SDK indicates whether it wants the Google OPC when it calls back into your app for the payment credentials; relay that value rather than deciding it yourself. Boolean. Defaults to false. |
nonce (only applicable if digital_wallet is APPLE_PAY) | Number provided by the device's wallet to prevent replay attacks. Omit to receive only activationData in the response. String. Permitted values: Base64 cryptographic nonce. |
nonce_signature (only applicable if digital_wallet is APPLE_PAY) | Device-specific signature for the nonce provided by the device's wallet. Omit to receive only activationData in the response. String. Permitted values: Base64 nonce signature. |
server_session_id (only applicable if digital_wallet is GOOGLE_PAY; requires API version 2026-07-01) | Google Pay Push Provisioning session identifier required for the FPAN flow. Required when google_opc_requested is true; accepted and ignored otherwise. Sending google_opc_requested as true without server_session_id returns a 400 response. Google's SDK supplies this value in the same callback; pass it through unchanged. String. Permitted values: 36-digit version 4 UUID (including hyphens). |
Sending server_session_id or google_opc_requested on an earlier API version is accepted and silently ignored.
Sample Response: Apple Pay
Object containing the fields required to add a card to Apple Pay. Applies only to Apple Pay wallet. The details may vary based on the digital wallet provider; consult the wallet's documentation for more info.
{
"provisioning_payload": {
"activationData": "...",
"ephemeralPublicKey": "...",
"encryptedData": "..."
}
}Sample Response: Google Pay or Samsung Pay
The provisioning_payload is a base64 encoded JSON payload. The details of this payload may vary based on the digital wallet provider; consult the wallet's documentation for more info. On API version 2026-07-01, a Google Pay response also carries google_provisioning_payload; see the sample below.
{
"provisioning_payload": "eyJjYXJkSW5mbyI...Q3MjRFRUEzQkI3OEU="
}Sample Response: Google Pay with UPP (API version 2026-07-01)
On API version 2026-07-01, a Google Pay request that sets google_opc_requested to true and supplies server_session_id returns both payloads. google_provisioning_payload is a base64 encoded, encrypted payload representing card data for the Google Pay UPP FPAN flow.
{
"provisioning_payload": "eyJjYXJkSW5mbyI...Q3MjRFRUEzQkI3OEU=",
"google_provisioning_payload": "eyJlbmNyeXB0ZWREYXRhIjo...RjA5QUIxMkM0RA=="
}On API version 2026-07-01, a Google Pay response carries google_provisioning_payload: it is populated when google_opc_requested was true, and returned as null rather than omitted when it was not. On earlier API versions the parameter is absent from the response entirely:
{
"provisioning_payload": "eyJjYXJkSW5mbyI...Q3MjRFRUEzQkI3OEU=",
"google_provisioning_payload": null
}
google_provisioning_payloadis returned by the UPP flow, which is in Beta and is not currently available in the sandbox environment.
Updated 9 days ago
