Skip to main content

📄 Guide

Push provisioning lets a cardholder add a DCS-issued Visa card to Apple Wallet (iOS) or Google Wallet (Android) with a single tap inside your app, instead of typing the card number into the wallet app. As a licensed issuer with its own BINs, DCS is the party that integrates with Apple’s and Google’s tokenization and provisioning authorization. Unlike the capabilities that can only redirect the user, the DeCard-Managed model does expose its own wallet binding REST endpoints (/card/v1/apple-bind-wallet and /card/v*/google-bind-wallet): your app forwards the cryptographic material the wallet gives it to DCS, DCS calls Visa tokenization, and DCS returns the provisioning payload the wallet needs, which your app passes back to the system wallet to finish the job.
Recommendation for new Apple Pay integrations: use DCSProvisioningSDK. The SDK uses a temporary ticket from POST /card/v1/bind-wallet-ticket and encapsulates the later PassKit and DCS exchange. This page keeps the underlying wallet binding REST endpoints for field reference, existing direct integrations and Google Pay integrations.
Prerequisite: the user must have passed KYC and been issued a card, and you must hold that card’s identifier (the last four digits of the PAN cardMantissa for Apple and Google V1, or cardId for Google V2). For the issuing flow, see Issuing Cards.

Mental model: tokenization

Digital wallets protect a card through tokenization: the real card number (PAN) is replaced by a unique digital token.
  • One token per card per device: every “card × device” pair gets its own token, and the tokens are independent of each other.
  • End-to-end protection: the token stands in for the real PAN at transaction time, so the plaintext PAN never reaches the merchant or the wallet.
  • Token lifecycle (five stages): created when the card is added → activated after verification → used in place of the real PAN at transaction time → rotated periodically for security → destroyed when the card is removed.

Two provisioning paths

This page is about in-app provisioning, which requires integration work on your side and calls to the DCS wallet binding API. Manual provisioning needs no development at all (DCS supports it by default) and is done by the cardholder inside the wallet app; the steps are reproduced below so you can reuse them in your own help content.

Apple Pay manual provisioning (iPhone, 3 steps)

  1. Open the Wallet app: open Wallet on the iPhone and tap ”+” in the top right corner.
  2. Enter the card details: hold the card near the iPhone to add it, or tap “Enter Card Details Manually” and follow the on-screen instructions.
  3. Verify identity: choose a verification method when prompted (SMS or email) and enter the code to finish.

Google Pay manual provisioning (Android, 7 steps)

  1. Open the Google Wallet app: the cardholder opens Google Wallet and must be signed in to a Google account for mobile payments to work.
  2. Start adding a card: the cardholder taps “Add to Wallet” to begin manual provisioning.
  3. Choose the card type: if prompted, the cardholder selects “Payment card”.
  4. Enter the card details manually: the cardholder chooses “Or enter details manually” and types in the card number, expiry date and CVV.
  5. Accept the terms: the cardholder reviews and accepts the terms and conditions.
  6. Verify identity: a verification code is sent by SMS or email for identity verification.
  7. Finish provisioning: the cardholder enters the code and, on success, sees a confirmation in the Google Wallet app.
The exact steps vary a little with the handset, the OS version and wallet app updates. Contact the DCS team if anything is unclear.

The four roles

On the Apple side DCS acts as the BIN Sponsor and the partner as the Program Manager; on the Google side DCS acts as the Issuer and the partner as the Program Manager.

Commercial onboarding (one-off, before go-live)

Before cards can be provisioned into wallets in production, you, DCS and Apple or Google have to complete a one-off round of authorization and certification. Apple and Google run separate tracks:

Apple Pay onboarding

Google Pay onboarding

The screen-by-screen detail on the wallet side is governed by Apple’s and Google’s own issuer documentation, which this page does not reproduce. Contact the DCS team for further integration detail.

Runtime provisioning flow (in-app provisioning)

Once you are integrated, every tap on “add to wallet” in your app triggers the exchange shown below. Apple is used as the example; Google works the same way and differs only in the request and response fields:
The diagram shows the underlying direct flow. With DCSProvisioningSDK, your app hands the ticket and card parameters to the SDK, which encapsulates the exchange of PassKit device artifacts with DCS; see the Implementation Guide.
In-app provisioning sequence diagramIn-app provisioning sequence diagram
The Apple in-app provisioning cryptographic flow in nine steps: ① the app starts provisioning → ② the wallet asks Apple for certificates and a nonce → ③ Apple returns them → ④ the wallet passes the certificates, nonce and nonce signature back to the app → ⑤ the app forwards them to the DCS wallet binding service → ⑥ DCS generates an ephemeral key pair, encrypts the payment data with a shared key derived from Apple’s public key, generates the encrypted OTP, and returns the encrypted data together with the ephemeral public key → ⑦ the app sends the encrypted data, the ephemeral public key and the encrypted OTP to the wallet → ⑧ the wallet verifies the provisioning with Apple → ⑨ Apple and the payment network operator (PNO) complete standard provisioning. Apple Pay in-app provisioning cryptographic flow:
Apple Pay in-app provisioning cryptographic flow

Wallet binding API

The Apple binding endpoint is POST /card/v1/apple-bind-wallet (it identifies the card with the last four digits of the PAN, cardMantissa). For Google, DCS offers V1 and V2; use V2 for every new Google integration (it identifies the card precisely with cardId).
The only difference between Google V2 and V1 is how the card is identified: V2 uses cardId where V1 uses cardMantissa. externalUserId is required in both versions, and every other field is identical.

Apple Pay wallet binding

Request fields

The required fields are externalUserId / applePublicCertificates / appleNonce / appleNonceSignature; cardMantissa is optional.

Request example (masked)

Response

A successful call returns the common envelope { code, message, messageDetail, data } with code = SYS_SUCCESS. data holds the payload Apple Wallet needs to complete tokenization:

Google Pay wallet binding

Request fields

Google V2 requires only externalUserId and cardId; clientCustomerId and deviceId are both optional. V1 requires only externalUserId.

Request example (V2, masked)

Response

On success code = SYS_SUCCESS and data holds what Google Pay needs for tokenization:
Every example value is a placeholder. Never put a real externalUserId, cardId, cardMantissa, cryptographic material, API key or secret, or any cardholder personal data into a request or a log.Authentication: the examples omit the authentication headers to keep the focus on the business fields. A real call must carry X-DAPI-API-KEY / X-DAPI-SIGN / X-DAPI-TIMESTAMP / X-DAPI-NONCE (HMAC-SHA256 signature); for the rules, see the Authentication Guide.

Error handling

Before it can be provisioned, the card must be in a normal, usable state: activated, not frozen and not canceled. If the status is anything else, activate the card or lift the restriction first, then start provisioning.

Testing notes

  • Push provisioning has to be tested with production cards: Visa provides no sandbox tokenization cards, so the full provisioning flow cannot be verified in the sandbox.
  • iOS builds must be installed through TestFlight for testing; running straight from Xcode makes provisioning fail.
Today, provisioning success or failure does not generate an extra webhook event. Treat the response from this API and from Apple or Google Wallet as authoritative. Asynchronous provisioning events would require new platform capability.

Next steps