Skip to main content

Classic Cloud Token Framework


Overview

The Cloud Token Framework (CTF) is the framework for binding a device and a network token. CTF enables merchants to perform one-time issuer identification and verification and securely binds a user's device to a Visa network token. CTF reduces fraud rates and improves transaction conversion.

Use Classic CTF when your app requires device-level cryptographic binding to a Visa network token in a mobile in-app environment. If your integration instead requires FIDO-based passkey authentication for e-commerce checkout (browser or mobile web), use Payment Passkey instead.

Prerequisites

To send device binding requests, you must have a self-signed certificate associated with your merchant account. See Cloud Token Framework Key Generation.

A token requestor must pass local authentication information. The token requestor can select up to two of these authentication factors for the cardholder to verify their identity at checkout:

Knowledge — Knowledge verification factors include information that only the cardholder knows. For example, a password.

Possession — Possession verification factors include something that only the cardholder has. For example, a pre-registered mobile phone, a card reader, or a key generation device.

Inherence — Inherence verification factors include something that the cardholder is. For example, biometric data. Biometric data includes facial recognition, a fingerprint, voice recognition, or a behavioral biometric.

Cloud Token Framework Key Generation

Follow these steps to generate the credentials required to send device binding requests:

When you follow these steps you create these files:

  • root-ca-private-key.pem
  • root-ca-certificate.pem
  • device-signing-private-key.pem
  • device-signing.csr
  • device-signing-certificate.pem
File NameDescription and Usage
root-ca-private-key.pemPrivate CA key. Keep this key offline and do not share it.
root-ca-certificate.pemSelf-signed CA public certificate. This certificate must be associated with the token requestor account to establish the trust anchor for device-issued certificates.
device-signing-private-key.pemDevice-signing private key. This key stays on the device or secure storage and is used to sign the authenticatedIdentities data that is sent in these API requests: POST /tms/v2/tokenized-cards/{id}/bindings, POST /tms/v2/tokens/{id}/payment-credentials, POST /pts/v2/payments
device-signing.csrCertificate signing request (CSR) for the device-signing key. This can be discarded post-issuance.
device-signing-certificate.pemIssued device-signing certificate. This certificate is submitted in the POST /tms/v2/devices API request.

Create Your Master Key and Certificate

Create your master key (root-ca-private-key.pem) and certificate (root-ca-certificate.pem).

Example command:

# Private CA key (keep offline, never share)openssl genrsa -out root-ca-private-key.pem 2048# Self-signed CA certificate (public) with proper CA extensionsopenssl req -x509 -new -nodes -key root-ca-private-key.pem -days 3650 -out root-ca-certificate.pem

Generate a Signing Key Pair for Each Device

Generate a signing key pair for each device. This creates device-signing-private-key.pem, device-signing.csr, and device-signing-certificate.pem.

# Device signing private keyopenssl genrsa -out device-signing-private-key.pem 2048# Certificate signing request (CSR) for the device signing keyopenssl req -new -key device-signing-private-key.pem -out device-signing.csr# Issue the device signing certificate from your CAopenssl x509 -req -in device-signing.csr -CA root-ca-certificate.pem -CAkey root-ca-private-key.pem -CAcreateserial -out device-signing-certificate.pem -days 500 -outform PEM

(Optional) Validate Your Certificates

Validate your certificates.

Example command:

# Verify that device-signing-certificate.pem chains to root-ca-certificate.pemopenssl verify -CAfile root-ca-certificate.pem device-signing-certificate.pem# Verify that data signed with device-signing-private-key.pem matches device-signing-certificate.pemopenssl x509 -in device-signing-certificate.pem -pubkey -noout > device-signing-public-key.pemecho 'test' > message.txtopenssl dgst -sha256 -sign device-signing-private-key.pem -out message.sig message.txtopenssl dgst -sha256 -verify device-signing-public-key.pem -signature message.sig message.txt

Endpoints

Production:

POST /tms/v2/devicesPOST /tms/v2/tokenized-cards/{id}/bindingsPOST /tms/v2/tokens/{id}/payment-credentialsDELETE /tms/v2/tokenized-cards/{id}/bindings/{clientDeviceID}POST /pts/v2/payments

Test:

POST /tms/v2/devicesPOST /tms/v2/tokenized-cards/{id}/bindingsPOST /tms/v2/tokens/{id}/payment-credentialsDELETE /tms/v2/tokenized-cards/{id}/bindings/{clientDeviceID}POST /pts/v2/payments

Bind a Device

This section contains the information required to bind a device to a network token.

Device Binding Workflow

Bind a Device
  1. The customer sends a request to the merchant that they consent to bind the device.
  2. If the device is not enrolled, the merchant sends a request to to enroll the device.
    • Test: POST {{token:api-test-url-rest}}/tms/v2/devices
  3. If the device is enrolled, the merchant sends a request to to bind the device using the device ID.
    • Test: POST {{token:api-test-url-rest}}/tms/v2/tokenized-cards/{id}/bindings
  4. sends a binding request to the issuer with the binding ID.
  5. The issuer sends a response to with the binding status.
  6. If authentication is valid, binds the token to the device.
  7. The issuer notifies that binding was successful.
  8. sends a response to the merchant that the binding is completed.
  9. The merchant notifies the customer that their device binding is complete.

Create a Device

This section describes how to create a device.

Endpoint

POST /tms/v2/devices

POST /tms/v2/devices

POST /tms/v2/devices

Example

{  "clientRequestToken": "Your Unique Transaction Reference",  "requestInformation": {    "clientReferenceInformation": {      "code": "request_identifier"    }  },  "deviceInformation": {    "deviceIdentifier": "example-device-id",    "deviceSigningCertificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"  }}
{  "id": "F2F3ADA770102B51E053A2598D0A9078",  "status": "ACTIVE",  "clientRequestToken": "Your Unique Transaction Reference",  "deviceInformation": {    "deviceIdentifier": "example-device-id"  }}
FieldTypeDescription
clientRequestTokenstringUnique reference ID for the request.
deviceInformation.deviceIdentifierstringUnique identifier for the device being registered.
deviceInformation.deviceSigningCertificatestringPEM-formatted device signing certificate generated from your device signing key pair.
Optional Fields
FieldTypeDescription
requestInformation.clientReferenceInformation.codestringClient reference code for tracking.

Bind the Device

This section describes how to bind a device.

Endpoint

POST /tms/v2/tokenized-cards/{id}/bindings

POST /tms/v2/tokenized-cards/{id}/bindings

Example

{  "clientRequestToken": "Your Unique Transaction Reference",  "deviceInformation": {    "authenticatedIdentities": {      "authenticatedIdentity": [        {          "deviceSigningCertificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",          "authenticatorType": "KNOWLEDGE",          "authenticatorData": "base64-encoded-auth-data"        }      ]    }  }}
{  "id": "binding-id",  "status": "SUCCESS",  "bindingReference": "example-binding-ref"}
FieldTypeDescription
clientRequestTokenstringUnique reference ID for the request.
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificatestringPEM-formatted device signing certificate.
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorTypestringAuthentication factor type. Valid values: KNOWLEDGE, POSSESSION, INHERENCE.
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorDatastringBase64-encoded authentication data signed with the device signing key.

Bind a Device with Step-Up Authentication

This section contains the information required to bind a device to a network token with step-up authentication.

Device Binding Workflow with Step-Up Authentication

Bind a Device with Step-Up Authentication
  1. The customer sends a request to the merchant that they consent to bind the device.
  2. If the device is not enrolled, the merchant sends a request to to enroll the device.
    • Test: POST {{token:api-test-url-rest}}/tms/v2/devices
  3. If the device is enrolled, the merchant sends a request to to bind the device using the device ID.
    • Test: POST {{token:api-test-url-rest}}/tms/v2/tokenized-cards/{id}/bindings
  4. sends a binding request to the issuer with the binding ID.
  5. The issuer sends a response to with a step-up authentication binding status.
  6. sends a request to the issuer for authentication methods.
  7. The issuer sends a list of authentication methods that are passed on to the customer.
  8. The customer selects their authentication method and it is sent to the issuer.
  9. The issuer initiates authentication method.
  10. If authentication is valid, binds the token to the device.
  11. The issuer notifies that binding was successful.
  12. sends a response to the merchant that the binding is completed.
  13. The merchant notifies the customer that their device binding is complete.

Step-Up Authentication Flow

Step-Up Authentication Options

This workflow shows the possible options for step-up authentication after you send a request to /tokenized-cards/{id}/bindings.

This table lists every step-up method and the authenticatorType value that identifies it:

Step-Up MethodDescriptionauthenticatorType
Web Application or PhoneStep-up authentication options available for web applications and phone-based authentication.APP_TO_APP, CUSTOMER_SERVICE, OUTBOUND_CALL
External Web ApplicationStep-up authentication options available when redirecting to an external web application.WEB
One-Time Passwords (OTP)Step-up authentication using one-time passwords sent by email, SMS, or issuer account login.OTP

Select the step-up method that matches the authenticatorType value returned in your binding response to see its complete flow.

Create Payment Credentials with Device Signed JWS

This section describes how to create payment credentials with device-signed JSON Web Signature (JWS).

Endpoint

POST /tms/v2/tokens/{id}/payment-credentials

POST /tms/v2/tokens/{id}/payment-credentials

FieldTypeDescription
clientRequestTokenstringUnique reference ID for the request.
requestInformation.transactionIdstringThe transaction ID associated with the payment credential request.
deviceInformation.deviceSignedJWSstringThe device-signed JSON Web Signature (JWS) generated using the device signing key.
Optional Fields
FieldTypeDescription
requestInformation.clientReferenceInformation.codestringClient reference code for tracking.

Delete Binding

This section describes how to delete a device binding.

Endpoint

DELETE /tms/v2/tokenized-cards/{id}/bindings/{clientDeviceID}

DELETE /tms/v2/tokenized-cards/{id}/bindings/{clientDeviceID}

DELETE /tms/v2/tokenized-cards/{id}/bindings/{clientDeviceID}

The {id} is the identifier of the tokenized card and {clientDeviceID} is the identifier of the device.

FieldTypeDescription
{id}stringIdentifier of the tokenized card, included in the URL path.
{clientDeviceID}stringIdentifier of the device binding to delete, included in the URL path.

Create Payment Credentials with Payment Passkey

This section describes how to create tokenized card payment credentials with Payment Passkey.

Endpoint

POST /pts/v2/payments

POST /pts/v2/payments

POST /pts/v2/payments

FieldTypeDescription
clientRequestTokenstringUnique reference ID for the request.
paymentInformation.tokenizedCard.idstringIdentifier of the tokenized card.
orderInformation.amountDetails.totalAmountstringTotal transaction amount.
orderInformation.amountDetails.currencystringISO 4217 currency code. For example, USD.
Optional Fields
FieldTypeDescription
clientReferenceInformation.codestringClient reference code for tracking.

Last published: September 29, 2026