Skip to main content

Add Cards to Digital Wallets

Overview

Digital wallets enable your customers to store a card's primary account number (PAN) as a tokenized digital account number. This token is presented to the merchant in place of the PAN, so the merchant cannot see or retain the payment card's information.

You can provision payment cards to digital wallets such as Apple Pay, Google Wallet, and Samsung Pay. Payment cards are added to digital wallets in four ways:

  • Manual entry: An account holder opens a digital wallet app on their phone and manually enters their card details.
  • In-app push provisioning: An account holder taps a software button — such as "Add to Apple Wallet" or "Add to Google Wallet" — inside your iOS or Android app, which triggers a provisioning flow native to the device. Works for virtual or physical cards.
  • Apple Pay Web Push Provisioning (WPP): An account holder selects a card on your website and provisions it to one or more Apple devices linked to their Apple ID.
  • Tap to Add: An account holder physically taps their card to the back of an NFC-enabled phone, which prompts the digital wallet to add it. Requires a physical Visa or Mastercard card.

The four methods differ in where the action happens, what your team needs to build, and what kind of card the cardholder uses:

MethodCardholder startWhat you buildCard constraint
Manual entryTheir wallet appNothingNone
In-app push provisioningYour iOS or Android appAn app integration with the wallet vendor's SDK plus the matching Highnote push provisioning mutationNone
Apple Pay Web Push ProvisioningYour websiteA web frontend plus a backend call to generateAppleWebPushProvisioningTokenApple Pay only
Tap to AddTheir wallet's "Add Card" screenNothingPhysical Visa or Mastercard

Prerequisites

Wallet provider enums

The Highnote API has two wallet-related enums that serve different purposes:

EnumValuesPurpose
DigitalWalletProviderAPPLE_PAY, GOOGLE_PAY, SAMSUNG_PAYSpecifies which digital wallets your card art is designed for.
Used when creating or updating a digital card profile.
WalletProviderTypeGOOGLE_PAY, SAMSUNG_PAYIdentifies wallet provider during push provisioning. Used in mutation addPaymentCardToGooglePay...
Why is Apple Pay not in Wallet Provider Type?

Apple Pay has a dedicated push provisioning protocol and mutation, addPaymentCardToApplePay.... Google Pay and Samsung Pay share a provisioning path, and use WalletProviderType to distinguish them.

Apple Pay prerequisites

Contact your Highnote representative for support.

You must complete the following steps before developing a push provisioning project. The Highnote team will assist with each step as you prepare for your push provisioning implementation:

  1. Your program must be in implementation or launched with a partner bank. During this process, your program undergoes due diligence with the partner bank, a BIN is assigned, and the tokenization request is prepared to be submitted to the network. You must complete this step before providing Apple Pay with your card program details.
  2. All Digital Wallet assets should be submitted and approved. You can find the list of assets here: Digital Wallet Designs
  3. Sign the Apple Pay Terms and Conditions and list Highnote as your program manager.
  4. Email applepayentitlements@apple.com and implementation-team@highnote.com with the following information:
  • A request to enable Apple Pay push provisioning in your app
  • Your App name as it appears on AppStore Connect
  • Your Developer team ID
  • Your ADAM ID (Example: 13254705253)
  • Your Bundle ID (Example: com.company.appname)
  • Application Launch URL (Example: myapp://apple_wallet)
  • Whether you already have an app published to the App Store

After receiving a response from the Apple Pay Entitlements team, you can expect the following questions:

  • Who is the sponsor bank you work with to offer your debit or credit product?
  • How do you plan to use Apple Pay? For example, your application provides users a method to add their card to Apple Pay directly using the Add to Wallet interface.
  • Will you offer both physical and virtual cards? Answer yes or no depending on your card product details.
  • What are your proposed use cases for in-app (push) provisioning? For example, you are adding the capability to add a card to Apple Pay directly from your application.
  • Will you use a third party in the development and/or management of Apple Pay? If yes, provide the third-party company name.
  • In what country is your business headquarters located? Provide your headquarters' location.
  • What is your Team Name? Provide the name of your company or division.

After completing the previous steps, you can access Apple Pay's Wallet API documentation for more information on building your push provisioning implementation.

Google Wallet prerequisites

Contact your Highnote representative for support.

Google requires you to complete the following steps before developing a push provisioning project. The Highnote team will assist with each step as you prepare for your push provisioning implementation:

  1. Apply for Google Wallet documentation access.
  2. Define package name for Activation Method. For example, com.grppl.android.shell.TheIssuer.
  3. Define action for Activation Method. For example, action.open_issuerapp.
  4. Define package name for App Launching. For example, com.grppl.android.shell.TheIssuer.
  5. Define action for App Launching. For example, action.open_issuerapp.
  6. Submit Google's Push Provisioning API Access request form.

After submitting the request form, you will receive a response prompting you to provide more information to describe your company. The Highnote team will assist with providing answers to additional information requests. You can expect the following responses:

  • Select the option that best describes your company. For example, you might select a financial company or card issuer operating under a BIN Sponsor.
  • Does your company have a signed CTA with Google?
  • Does your BIN/Sponsor or Program Manager have a signed CTA agreement with Google?
  • Name of program manager: For this response, you would provide the answer of Highnote.
  • App Package name
  • Launch date
  • Please select the appropriate network(s): Visa or Mastercard

After completing the previous steps, you can complete Google's Push Provisioning API UX Review Request.

Next steps

After completing the prerequisites for the digital wallets you wish to support, the Highnote team secures payment network push provisioning approval and establishes a kickoff meeting with your development team.

Google provides a standard solution that your development team can utilize. See Google's SDK releases for more information.

Apple Pay in-app push provisioning

The Apple Pay push provisioning process validates the following when an account holder adds a payment card to their Apple Wallet:

  • The paymentCardId provided is valid
  • The payment card has a status of ACTIVE
  • The payment card is allowed to be provisioned

If any of the above criteria fails validation, the request is rejected. If all validations pass, the API returns the response required by Apple's SDK for provisioning the card to the Apple Wallet.

AddPaymentCardToApplePayByDevicePushProvisioning
Query
mutation AddPaymentCardToApplePayByDevicePushProvisioning(
$input: AddPaymentCardToApplePayByDevicePushProvisioningInput!
) {
addPaymentCardToApplePayByDevicePushProvisioning(input: $input) {
__typename
... on PaymentCardDigitalWalletTokenApplePayDevicePushProvisioning {
encryptedPassData
activationData
ephemeralPublicKey
createdAt
paymentCard {
__typename
id
last4
}
}
... on UserError {
errors {
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{
  "input": {
    "paymentCardId": "MC4zOC5kd3RfMTIzNDU2Nzg5MA==",
    "deviceType": "MOBILE",
    "certificates": [
      "MIIH/TCCBeWgAwIBAgIQaBYE3/M08XHYCnNVmcFBcjANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAPBgNVBAoMCFNTTCBDb3JwMS4wLAYDVQQDDCVTU0wuY29tIEVWIFNTTCBJbnRlcm1lZGlhdGUgQ0EgUlNBIFIzMB4XDTIwMDQwMTAwNTgzM1oXDTIxMDcxNjAwNTgzM1owgb0xCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxFjAUBgNVBAUTDU5WMjAwODE2MTQyNDMxFDASBgNVBAMMC3d3dy5zc2wuY29tMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlvbjEXMBUGCysGAQQBgjc8AgECDAZOZXZhZGExEzARBgsrBgEEAYI3PAIBAxMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHheRkbb1FCc7xRKstwK0JIGaKY8t7JbS2bQ2b6YIJDgnHuIYHqBrCUV79oelikkokRkFvcvpaKinFHDQHUpWEI6RUERYmSCg3O8Wi42uOcV2B5ZabmXCkwdxY5Ecl51BbM8UnGdoAGbdNmiRmSmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08gdygSvRdUw55Jopredj+VGtjUkB4hFT4GQX/ght69Rlqz/+8u0dEQkhuUuucrqalm",
      "MIIH/TCCBeWgAwIBAgIQaBYE3/M08XHYCnNVmcFBcjANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAPBgNVBAoMCFNTTCBDb3JwMS4wLAYDVQQDDCVTU0wuY29tIEVWIFNTTCBJbnRlcm1lZGlhdGUgQ0EgUlNBIFIzMB4XDTIwMDQwMTAwNTgzM1oXDTIxMDcxNjAwNTgzM1owgb0xCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxFjAUBgNVBAUTDU5WMjAwODE2MTQyNDMxFDASBgNVBAMMC3d3dy5zc2wuY29tMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlvbjEXMBUGCysGAQQBgjc8AgECDAZOZXZhZGExEzARBgsrBgEEAYI3PAIBAxMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHheRkbb1FCc7xRKstwK0JIGaKY8t7JbS2bQ2b6YIJDgnHuIYHqBrCUV79oelikkokRkFvcvpaKinFHDQHUpWEI6RUERYmSCg3O8Wi42uOcV2B5ZabmXCkwdxY5Ecl51BbM8UnGdoAGbdNmiRmSmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08gdygSvRdUw55Jopredj+VGtjUkB4hFT4GQX/ght69Rlqz/+8u0dEQkhuUuucrqalm"
    ],
    "nonce": "9c023092",
    "nonceSignature": "4082f883ae62d0700c283e225ee9d286713ef74456ba1f07376cf17d71bf0be013f926d486619394060ced56030f41f84df916eaab5504e456a8530dc9c821f6ed3e3af62b5d8f3e4a22ca2018670fee4e"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"addPaymentCardToApplePayByDevicePushProvisioning": {
"__typename": "CardDigitalWalletTokenApplePayPushProvisioning",
"encryptedPassData": "IHvigJx0b2tlblVuaXF1ZVJlZmVyZW5jZUluY2x1ZGVkIjoiWFhYWFgiLAogICAgIOKAnHNpZ25hdHVyZUFsZ29yaXRobSI6IlhYWFhYWFhYIiwKICAgICDigJxzaWduYXR1cmUiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCIsCiAgICAg4oCcZXhwaXJhdGlvbkRhdGVJbmNsdWRlZCI6IlhYWFgiCn0=",
"activationData": "ewoicGFuOiAiNDExMTExMTExMTExMTExMSIsCiJleHAiOiAiMTIyNiIKfQ====",
"ephemeralPublicKey": "EPHEMERAL-PUBLIC-KEY",
"createdAt": "2021-07-07T23:22:30.475Z",
"paymentCard": {
"__typename": "PaymentCard",
"id": "MC4zOC5kd3RfMTIzNDU2Nzg5MA==",
"last4": "1234"
}
}
},
"extensions": {
"requestId": "some-request-id"
}
}

User experience

You must add an "Add to Apple Wallet" call to action in your iOS app that uses the mutation AddPaymentCardToApplePayByDevicePushProvisioning. Apple provides guidelines and assets for the button.

Apple Wallet provisioning experience

The following graphic is an example of an Apple Pay push provisioning user interface (UI) experience:

Apple Pay Provisioning UX

Provisioning flow

The following graphic displays the flow of data during the Apple Pay push provisioning process:

Apple Pay Provisioning Sequence

Apple Pay Web Push Provisioning

Apple Pay Web Push Provisioning (WPP) lets an account holder provision a card to one or more Apple devices linked to their Apple ID directly from a supported web browser. WPP is appropriate when your subscriber experience originates on the web rather than from an iOS app — for example, an account-management portal or a card-launch landing page.

WPP is supported for Visa and Mastercard products. Your Highnote representative will work with you to plan and launch your WPP use case.

Apple Pay Web Push Provisioning prerequisites

Before launching WPP, complete the following:

  1. Complete all Digital Wallet Tokenization design and configuration steps described in Tokenized card design and the Apple Pay prerequisites section above.
  2. Successfully complete either manual or in-app push provisioning with cards from your product. WPP cannot be your first provisioning surface — it builds on a working DWT integration.
  3. Receive sign-off from Apple for your WPP use case.
  4. Integrate with Highnote's WPP API as described below.
  5. Build, host, and test a website that provides the user experience described in the next section.
  6. Receive launch sign-off from Apple.

Contact your Highnote representative for non-production environment details, the partnerId assigned by Apple, and the "Add to Apple Wallet" website button assets.

User experience

Your website must provide the following user experience:

  1. The cardholder signs in to your site to identify their account.
  2. The cardholder initiates WPP by selecting one of their cards to provision.
  3. Your website displays Terms and Conditions, which the cardholder must accept.
  4. A pop-up browser window with a self-contained Apple sign-in experience (within Apple's domain) appears, where the cardholder signs in with their Apple ID.
  5. After signing in, the cardholder chooses one or more devices linked to their Apple ID to provision the card to, then confirms the provisioning result on each target device.
  6. Your website displays the result of the provisioning request for each selected Apple device.

Generate the provisioning token

Call the generateAppleWebPushProvisioningToken mutation from your website's backend to obtain a JSON Web Signature (JWS) object. The JWS is consumed by Apple's JavaScript library to initialize the WPP session.

The mutation validates that the paymentCardId is valid, the card is ACTIVE, and the card is allowed to be provisioned. If validation fails, the request is rejected.

GenerateAppleWebPushProvisioningToken
Query
mutation GenerateAppleWebPushProvisioningToken(
$input: GenerateAppleWebPushProvisioningTokenInput!
) {
generateAppleWebPushProvisioningToken(input: $input) {
__typename
... on AppleWebPushProvisioningToken {
jws {
protected
payload
signature
header {
kid
}
}
state
expiresAt
}
... on UserError {
errors {
code
description
errorPath
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{
  "input": {
    "paymentCardId": "<PAYMENT_CARD_ID>"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"generateAppleWebPushProvisioningToken": {
"__typename": "AppleWebPushProvisioningToken",
"jws": {
"protected": "eyJ4NXQjUzI1NiI6IlpXSmxPV1ZoWlRRNU5HUXpNalV5TjJNMU4yTTRZMlEzTmpBNFkyVXhNakJqWWpFME5URXdZMk16TlRBM04yRmxObVpsTkRZNU1UVTFZMlJoTVdZMlpnIiwiY3R5IjoiYXBwbGljYXRpb24vY3JlZGVudGlhbDtjaGFyc2V0PXV0Zi04IiwidHlwIjoiSk9TRStKU09OIiwiYWxnIjoiRVMyNTYifQ",
"payload": "eyJhdWQiOiJBcHBsZSIsInN1YiI6InByb3Zpc2lvbmluZ1RhcmdldCIsImxpZCI6ImVuLVVTIiwiaXNzIjoiRGVtb0NhcmRDb25maWcxIiwiZXhwIjoxNzU3OTcxNzA0NjgwLCJpYXQiOjE3NTc5NjgxMDQ2ODAsImFpZCI6Ijk3NzdlZWE5ZjNjNGUxMzhiN2Y2ODJlMjUxMDllNTAwIiwianRpIjoiOTI3MjExZjAtODc5MC0xNzY5LWFiOTAtNmVkNDhmYTk2ODUxIn0",
"signature": "99YU0TZ4n8XLbbeOsYttEq_LJjzr2VstlIJPXuKnZSg_Ktey9XwHYn__0JuQykmv5IyuLN_lqU7ySlwdgUCjbQ",
"header": {
"kid": "689ac97c-b566-473e-9e52-1b1caae187a2"
}
},
"state": "927211f0-8790-176a-ab90-6ed48fa96851",
"expiresAt": "2026-09-15T21:28:24.680Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

The response contains:

  • jws — the signed token your website passes to the Apple JavaScript library. Includes protected, payload, signature, and a header.kid (key identifier).
  • state — the provisioning session state identifier.
  • expiresAt — the token expiration time in ISO 8601 format. Generate a fresh token if the cardholder reaches the "Add to Apple Wallet" button after this time.

Integrate with Apple's JavaScript library

After your backend issues the JWS, your website integrates with Apple's initAddToAppleWallet JavaScript library to render the "Add to Apple Wallet" button and handle the provisioning flow. The integration consists of three parts:

  • Place the button. Use the "Add to Apple Wallet" assets provided by your Highnote representative. Reference Apple's Add to Apple Wallet button guidelines for sizing and placement.
  • Initialize the library. Call initAddToAppleWallet with the partnerId Apple assigned during your WPP implementation, the production domain https://apple-pay.apple.com, the DOM id of your button, a jwtResolver callback that fetches the JWS from your backend, and a resultResolver callback that receives the per-device provisioning result.
  • Handle the result. The resultResolver is invoked with a status code indicating success, partial success, timeout, or failure for each selected device. See JavaScript status codes for the full list.

Apple's Web Provisioning JavaScript documentation is the authoritative reference for the JavaScript implementation.

JavaScript status codes

Your resultResolver callback must handle the following status codes returned by Apple's JavaScript library.

1xx — interim

CodeDescription
10001The selected device connected after the web provisioning. The UI timed out, and the credential may be provisioned on the device.
10002The Issuer was contacted to begin provisioning for the selected device. The UI timed out, and the credential may be provisioned on the device.

2xx — success

CodeDescription
200Successful. Provisioning succeeded on all devices selected by the cardholder.
201Status unknown. Apple reached out to the device(s), but the device(s) didn't respond to the notifications within the UI timeout threshold. The credential might still provision after the timeout.
202No eligible devices.
206Partially successful. Provisioning succeeded on some of the devices selected by the cardholder. Not applicable if the flow is constrained to a single device.

4xx — client errors

CodeDescription
403User interaction failed. The Apple ID sign-in failed.
406The Issuer rejected or failed the provisioning attempt.
408Timeout. No result was obtained — the cardholder may have closed the pop-up window without interaction or moved to another app or window. See also code 444.
40801Timeout. The Apple UI failed to load.
412Bad JWS.
41201Bad JWS. Expired.
444Cardholder dismissed the page without completing the flow. The system may sometimes return a 408 instead if it can't identify this scenario.

5xx — server errors

CodeDescription
500Error. An unknown error on Apple systems.
50001Error. Apple failed to process the provisioning.

Google Wallet in-app push provisioning

The Google Wallet push provisioning process validates the following:

  • The paymentCardId provided is valid
  • The payment card has a status of ACTIVE
  • The payment card is allowed to be provisioned

If any of the above criteria fails validation, the request is rejected. If all validations pass, the API returns the response required by Google SDK for provisioning the card to the Google Wallet.

AddPaymentCardToGooglePayByDevicePushProvisioning
Query
mutation AddPaymentCardToGooglePayByDevicePushProvisioning(
$input: AddPaymentCardToGooglePayByDevicePushProvisioningInput!
) {
addPaymentCardToGooglePayByDevicePushProvisioning(input: $input) {
__typename
... on PaymentCardDigitalWalletTokenGooglePayPushProvisioning {
cardholderName {
formattedName
title
givenName
middleName
familyName
suffix
}
billingAddress {
streetAddress
extendedAddress
locality
region
countryCodeAlpha3
postalCode
}
displayName
network
opaquePaymentCard
paymentCard {
__typename
id
last4
}
tokenServiceProvider
createdAt
}
... on UserError {
errors {
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{
  "input": {
    "paymentCardId": "PAYMENT_CARD_ID",
    "deviceType": "MOBILE",
    "walletDetails": {
      "clientWalletProvider": "GOOGLE_PAY",
      "clientWalletAccountIdentifier": "1CFA8B242688E000",
      "clientDeviceIdentifier": "ed6abb56323ba656521ac476"
    }
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"addPaymentCardToGooglePayByDevicePushProvisioning": {
"__typename": "CardDigitalWalletTokenGooglePayDevicePushProvisioning",
"cardholderName": {
"formattedName": "John M Deo",
"familyName": "Deo",
"givenName": "John",
"middleName": "M"
},
"billingAddress": {
"streetAddress": "123 main st",
"extendedAddress": "Suite # 200",
"postalCode": "94102",
"region": "CA",
"locality": "San Francisco",
"countryCodeAlpha3": "USA"
},
"displayName": "Subscriber App",
"network": "MASTERCARD",
"opaquePaymentCard": "IHvigJx0b2tlblVuaXF1ZVJlZmVyZW5jZUluY2x1ZGVkIjoiWFhYWFgiLAogICAgIOKAnHNpZ25hdHVyZUFsZ29yaXRobSI6IlhYWFhYWFhYIiwKICAgICDigJxzaWduYXR1cmUiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCIsCiAgICAg4oCcZXhwaXJhdGlvbkRhdGVJbmNsdWRlZCI6IlhYWFgiCn0=",
"paymentCard": {
"__typename": "PaymentCard",
"id": "PAYMENT_CARD_ID",
"last4": "1234"
},
"tokenServiceProvider": "MASTERCARD",
"createdAt": "2022-07-07T23:22:30.475Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

User experience

You must add a "Save to Phone" call to action in your Android app that uses the mutation AddPaymentCardToGooglePayByDevicePushProvisioning. Google provides assets for the button.

Google Wallet provisioning experience

The following graphic is an example of a Google Wallet push provisioning user interface (UI) experience:

Google Pay Provisioning UX

Provisioning flow

The following graphic displays the flow of data during the Google Wallet push provisioning process:

Google Pay Provisioning Sequence

Manage digital wallet tokens

When a payment card is added to a digital wallet, a token provisioning request is sent to the digital wallet, network, and Highnote. The request may go to the PENDING_VERIFICATION state, which requires your account holder to verify their identity. The following verification methods may be configured for your product:

  • Email: A passcode is sent by Highnote to the customer's email, which the customer enters into the digital wallet.
  • SMS: A passcode is sent by Highnote to the customer's mobile phone, which the customer enters into the digital wallet.

The following states are associated with a digital wallet token provisioning request:

Token StateDescription
REQUESTEDThe account holder has requested a digital wallet token.
APPROVEDThe account holder successfully tokenized the payment card without additional identity verification. The token is ACTIVE and ready for transaction use.
DENIEDThe payment card cannot be tokenized and may be due to the payment card's state or invalid data provided.
PENDING_VERIFICATIONThe wallet provider, network, or issuer has requested additional identity details from the account holder to validate their identity.

Find a token

You can search for digital wallet tokens on a given payment card or a digital wallet token's associated payment card using the following query:

FindPaymentCard
Query
query FindPaymentCard($id: ID!) {
node(id: $id) {
... on PaymentCard {
id
bin
last4
expirationDate
network
status
formFactor
cardProductApplication {
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
}
}
cardDigitalWalletTokens(first: 10) {
pageInfo {
hasNextPage
}
edges {
cursor
node {
__typename
... on CardDigitalWalletToken {
id
status
createdAt
updatedAt
requesterName
cardDigitalWalletTokenStateTransitions(first: 10) {
pageInfo {
hasNextPage
}
edges {
cursor
node {
__typename
... on CardDigitalWalletTokenStateTransition {
state
reason
createdAt
updatedAt
}
}
}
}
}
}
}
}
}
}
}
Variables
{
"id": "PAYMENT_CARD_ID"
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"node": {
"id": "PAYMENT_CARD_ID",
"bin": "531592",
"last4": "4689",
"expirationDate": "2026-01-01T23:59:59Z",
"network": "MASTERCARD",
"status": "ACTIVE",
"formFactor": "PHYSICAL",
"cardProductApplication": null,
"cardDigitalWalletTokens": {
"pageInfo": {
"hasNextPage": false
},
"edges": [
{
"cursor": "some-cursor",
"node": {
"__typename": "CardDigitalWalletToken",
"id": "TOKEN_ID",
"status": "TERMINATED",
"createdAt": "2022-06-08T16:06:44.744Z",
"updatedAt": "2022-06-08T17:58:22.930Z",
"requesterName": "Google Pay",
"cardDigitalWalletTokenStateTransitions": {
"pageInfo": {
"hasNextPage": false
},
"edges": [
{
"cursor": "some-cursor",
"node": {
"__typename": "CardDigitalWalletTokenStateTransition",
"state": "TERMINATED",
"reason": "ACCOUNT_HOLDER_DELETED",
"createdAt": "2022-06-08T17:58:22.889Z",
"updatedAt": "2022-06-08T17:58:22.954Z"
}
},
{
"cursor": "some-cursor",
"node": {
"__typename": "CardDigitalWalletTokenStateTransition",
"state": "SUSPENDED",
"reason": "DEVICE_LOST",
"createdAt": "2022-06-08T16:07:36.701Z",
"updatedAt": "2022-06-08T16:07:36.734Z"
}
},
{
"cursor": "some-cursor",
"node": {
"__typename": "CardDigitalWalletTokenStateTransition",
"state": "ACTIVE",
"reason": null,
"createdAt": "2022-06-08T16:07:17.742Z",
"updatedAt": "2022-06-08T16:07:17.756Z"
}
},
{
"cursor": "some-cursor",
"node": {
"__typename": "CardDigitalWalletTokenStateTransition",
"state": "REQUESTED",
"reason": null,
"createdAt": "2022-06-08T16:06:44.749Z",
"updatedAt": "2022-06-08T16:06:44.811Z"
}
}
]
}
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Suspend token

Account holders can suspend a token temporarily or a customer support agent may suspend a token if additional verification is required by the account holder.

Suspended tokens may have the following reasons associated with the token:

Suspended ReasonDescription
DEVICE_LOSTDevice is reported as lost.
DEVICE_STOLENDevice is reported as stolen.
FRAUDULENT_TRANSACTIONSFraudulent transactions have been reported by Highnote or the account holder.
OTHERAny other reason for suspending the card digital wallet token.

Use the following mutation to suspend a token:

SuspendCardDigitalWalletToken
Query
mutation SuspendCardDigitalWalletToken(
$input: SuspendCardDigitalWalletTokenInput!
) {
suspendCardDigitalWalletToken(input: $input) {
__typename
... on CardDigitalWalletToken {
id
status
createdAt
updatedAt
requesterName
cardDigitalWalletTokenStateTransitions {
edges {
node {
state
reason
updatedAt
createdAt
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
__typename
message
}
}
}
Variables
{
  "input": {
    "cardDigitalWalletTokenId": "TOKEN_ID",
    "reason": "DEVICE_LOST"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"suspendCardDigitalWalletToken": {
"__typename": "CardDigitalWalletToken",
"id": "TOKEN_ID",
"status": "SUSPENDED",
"createdAt": "2022-06-12T07:30:18.346Z",
"updatedAt": "2022-06-12T07:30:46.748Z",
"requesterName": "Google Pay",
"cardDigitalWalletTokenStateTransitions": {
"edges": [
{
"node": {
"state": "SUSPENDED",
"reason": "DEVICE_LOST",
"updatedAt": "2022-06-12T07:30:46.753Z",
"createdAt": "2022-06-12T07:30:46.717Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": null,
"updatedAt": "2022-06-12T07:30:34.455Z",
"createdAt": "2022-06-12T07:30:34.446Z"
}
},
{
"node": {
"state": "REQUESTED",
"reason": null,
"updatedAt": "2022-06-12T07:30:18.729Z",
"createdAt": "2022-06-12T07:30:18.362Z"
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Unsuspend token

You may provide your customer support agents or your account holders the ability to reactivate or unsuspend a token after it has been suspended.

Suspended tokens that have been unsuspended or reactivated may have the following reasons associated with the token:

Unsuspend ReasonDescription
DEVICE_FOUNDA lost or stolen device has been found or recovered.
NON_FRAUDULENT_TRANSACTIONSAfter reviewing transaction history, the account holder or Highnote confirmed that there were no fraudulent transactions.
OTHERAny other reason for reactivating the card digital wallet token.

Use the following mutation to unsuspend a token:

UnsuspendCardDigitalWalletToken
Query
mutation UnsuspendCardDigitalWalletToken(
$input: UnsuspendCardDigitalWalletTokenInput!
) {
unsuspendCardDigitalWalletToken(input: $input) {
__typename
... on CardDigitalWalletToken {
id
status
requesterName
cardDigitalWalletTokenStateTransitions {
edges {
node {
state
reason
updatedAt
createdAt
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
__typename
message
}
}
}
Variables
{
  "input": {
    "cardDigitalWalletTokenId": "TOKEN_ID",
    "reason": "NON_FRAUDULENT_TRANSACTIONS"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"unsuspendCardDigitalWalletToken": {
"__typename": "CardDigitalWalletToken",
"id": "TOKEN_ID",
"status": "ACTIVE",
"requesterName": "Google Pay",
"cardDigitalWalletTokenStateTransitions": {
"edges": [
{
"node": {
"state": "ACTIVE",
"reason": "NON_FRAUDULENT_TRANSACTIONS",
"updatedAt": "2022-06-12T07:32:41.837Z",
"createdAt": "2022-06-12T07:32:41.818Z"
}
},
{
"node": {
"state": "SUSPENDED",
"reason": "DEVICE_LOST",
"updatedAt": "2022-06-12T07:30:46.753Z",
"createdAt": "2022-06-12T07:30:46.717Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": null,
"updatedAt": "2022-06-12T07:30:34.455Z",
"createdAt": "2022-06-12T07:30:34.446Z"
}
},
{
"node": {
"state": "REQUESTED",
"reason": null,
"updatedAt": "2022-06-12T07:30:18.729Z",
"createdAt": "2022-06-12T07:30:18.362Z"
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Terminate token

A token may be terminated by your customer support agents or account holders. Once a token is terminated, the token is deleted and can no longer be used to transact. A new token must be created once it is terminated.

Terminated tokens may have the following reasons associated with the token:

Termination ReasonDescription
ACCOUNT_HOLDER_DELETEDAccount holder has been deleted.
DEVICE_LOSTDevice is reported as lost.
DEVICE_STOLENDevice is reported as stolen.
FRAUDULENT_TRANSACTIONSFraudulent transactions have been reported by Highnote or the account holder.
OTHERAny other reason for terminating the card digital wallet token.

Use the following mutation to terminate a token:

TerminateCardDigitalWalletToken
Query
mutation TerminateCardDigitalWalletToken(
$input: TerminateCardDigitalWalletTokenInput!
) {
terminateCardDigitalWalletToken(input: $input) {
__typename
... on CardDigitalWalletToken {
id
status
requesterName
cardDigitalWalletTokenStateTransitions {
edges {
node {
state
reason
updatedAt
createdAt
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
__typename
message
}
}
}
Variables
{
  "input": {
    "cardDigitalWalletTokenId": "TOKEN_ID",
    "reason": "FRAUDULENT_TRANSACTIONS"
  }
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"terminateCardDigitalWalletToken": {
"__typename": "CardDigitalWalletToken",
"id": "TOKEN_ID",
"status": "TERMINATED",
"requesterName": "Google Pay",
"cardDigitalWalletTokenStateTransitions": {
"edges": [
{
"node": {
"state": "TERMINATED",
"reason": "FRAUDULENT_TRANSACTIONS",
"updatedAt": "2022-06-12T07:34:20.433Z",
"createdAt": "2022-06-12T07:34:20.420Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": "NON_FRAUDULENT_TRANSACTIONS",
"updatedAt": "2022-06-12T07:32:41.837Z",
"createdAt": "2022-06-12T07:32:41.818Z"
}
},
{
"node": {
"state": "SUSPENDED",
"reason": "DEVICE_LOST",
"updatedAt": "2022-06-12T07:30:46.753Z",
"createdAt": "2022-06-12T07:30:46.717Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": null,
"updatedAt": "2022-06-12T07:30:34.455Z",
"createdAt": "2022-06-12T07:30:34.446Z"
}
},
{
"node": {
"state": "REQUESTED",
"reason": null,
"updatedAt": "2022-06-12T07:30:18.729Z",
"createdAt": "2022-06-12T07:30:18.362Z"
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

View token status and details

Find the status of a token and its historical state transitions using the following query:

FindCardDigitalWalletToken
Query
query FindCardDigitalWalletToken($id: ID!) {
node(id: $id) {
... on CardDigitalWalletToken {
__typename
id
status
createdAt
updatedAt
requesterName
requesterIdentifier
tokenType
sourceEntryMethod
last4
expirationDate
cardDigitalWalletTokenStateTransitions(first: 10) {
edges {
node {
state
reason
createdAt
updatedAt
}
}
}
}
}
}
Variables
{
"id": "<DIGITAL_WALLET_TOKEN>"
}
⚠️ Please login to execute queries. Visit the dashboard to authenticate.
Result
{
"data": {
"node": {
"__typename": "CardDigitalWalletToken",
"id": "<DIGITAL_WALLET_TOKEN>",
"status": "TERMINATED",
"createdAt": "2022-06-12T07:30:18.346Z",
"updatedAt": "2022-06-12T07:34:20.424Z",
"requesterName": "Google Pay",
"requesterIdentifier": "11223344",
"tokenType": "ECOMMERCE",
"sourceEntryMethod": "CARD_ON_FILE",
"last4": "8744",
"expirationDate": "2028-01-31T23:59:59Z",
"cardDigitalWalletTokenStateTransitions": {
"edges": [
{
"node": {
"state": "TERMINATED",
"reason": "FRAUDULENT_TRANSACTIONS",
"createdAt": "2022-06-12T07:34:20.420Z",
"updatedAt": "2022-06-12T07:34:20.433Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": "NON_FRAUDULENT_TRANSACTIONS",
"createdAt": "2022-06-12T07:32:41.818Z",
"updatedAt": "2022-06-12T07:32:41.837Z"
}
},
{
"node": {
"state": "SUSPENDED",
"reason": "DEVICE_LOST",
"createdAt": "2022-06-12T07:30:46.717Z",
"updatedAt": "2022-06-12T07:30:46.753Z"
}
},
{
"node": {
"state": "ACTIVE",
"reason": null,
"createdAt": "2022-06-12T07:30:34.446Z",
"updatedAt": "2022-06-12T07:30:34.455Z"
}
},
{
"node": {
"state": "REQUESTED",
"reason": null,
"createdAt": "2022-06-12T07:30:18.362Z",
"updatedAt": "2022-06-12T07:30:18.729Z"
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}

Simulate digital wallet token provisioning

You can use Highnote's digital wallet token provisioning simulation to generate and activate a digital wallet token, and test token status events. For more information, see Simulate Digital Wallet Token Provisioning.