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.pemroot-ca-certificate.pemdevice-signing-private-key.pemdevice-signing.csrdevice-signing-certificate.pem
| File Name | Description and Usage |
|---|---|
root-ca-private-key.pem | Private CA key. Keep this key offline and do not share it. |
root-ca-certificate.pem | Self-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.pem | Device-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.csr | Certificate signing request (CSR) for the device-signing key. This can be discarded post-issuance. |
device-signing-certificate.pem | Issued 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.pemGenerate 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.txtEndpoints
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/paymentsBind a Device
This section contains the information required to bind a device to a network token.
Device Binding Workflow
- The customer sends a request to the merchant that they consent to bind the device.
- 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
- Test:
- 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
- Test:
- sends a binding request to the issuer with the binding ID.
- The issuer sends a response to with the binding status.
- If authentication is valid, binds the token to the device.
- The issuer notifies that binding was successful.
- sends a response to the merchant that the binding is completed.
- 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" }}| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.deviceIdentifier | string | Unique identifier for the device being registered. |
deviceInformation.deviceSigningCertificate | string | PEM-formatted device signing certificate generated from your device signing key pair. |
Optional Fields
| Field | Type | Description |
|---|---|---|
requestInformation.clientReferenceInformation.code | string | Client 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"}| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificate | string | PEM-formatted device signing certificate. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Authentication factor type. Valid values: KNOWLEDGE, POSSESSION, INHERENCE. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-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
- The customer sends a request to the merchant that they consent to bind the device.
- 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
- Test:
- 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
- Test:
- sends a binding request to the issuer with the binding ID.
- The issuer sends a response to with a step-up authentication binding status.
- sends a request to the issuer for authentication methods.
- The issuer sends a list of authentication methods that are passed on to the customer.
- The customer selects their authentication method and it is sent to the issuer.
- The issuer initiates authentication method.
- If authentication is valid, binds the token to the device.
- The issuer notifies that binding was successful.
- sends a response to the merchant that the binding is completed.
- The merchant notifies the customer that their device binding is complete.
Step-Up Authentication Flow
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 Method | Description | authenticatorType |
|---|---|---|
| Web Application or Phone | Step-up authentication options available for web applications and phone-based authentication. | APP_TO_APP, CUSTOMER_SERVICE, OUTBOUND_CALL |
| External Web Application | Step-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.
Follow these steps to bind a device and network token combination for these step-up methods:
APP_TO_APPCUSTOMER_SERVICEOUTBOUND_CALL
Create a Device and Initiate Binding
Create a device record and send the step-up authentication factor to initiate the binding request.
Endpoint
POST /tms/v2/tokenized-cards/{id}/bindings
POST /tms/v2/tokenized-cards/{id}/bindings
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificate | string | PEM-formatted device signing certificate. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Step-up method. Valid values: APP_TO_APP, CUSTOMER_SERVICE, OUTBOUND_CALL, WEB. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-encoded step-up authentication data. |
Complete Step-Up Authentication
Submit the step-up authentication result to complete the device binding.
Endpoint
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificate | string | PEM-formatted device signing certificate. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Authentication factor type used during step-up. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-encoded authentication result from the step-up flow. |
Follow these steps to bind a device and network token combination for external web application step-up authentication methods.
Create a Device
Create a device record before initiating step-up authentication.
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.deviceIdentifier | string | Unique identifier for the device. |
deviceInformation.deviceSigningCertificate | string | PEM-formatted device signing certificate. |
Optional Fields
| Field | Type | Description |
|---|---|---|
requestInformation.clientReferenceInformation.code | string | Client reference code for tracking. |
Initiate Step-Up Authentication
Send a binding request with the WEB step-up authentication factor to redirect the cardholder to the external web application.
Endpoint
POST /tms/v2/tokenized-cards/{id}/bindings
POST /tms/v2/tokenized-cards/{id}/bindings
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificate | string | PEM-formatted device signing certificate. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Step-up method. Valid values: APP_TO_APP, CUSTOMER_SERVICE, OUTBOUND_CALL, WEB. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-encoded step-up authentication data. |
Complete Step-Up Authentication
Submit the step-up authentication result to complete the device binding.
Endpoint
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].deviceSigningCertificate | string | PEM-formatted device signing certificate. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Authentication factor type used during step-up. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-encoded authentication result from the step-up flow. |
Follow these steps to bind a device and network token combination for one-time password (OTP) step-up authentication.
Create a Device
Create a device record before initiating step-up authentication.
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.deviceIdentifier | string | Unique identifier for the device. |
deviceInformation.deviceSigningCertificate | string | PEM-formatted device signing certificate. |
Optional Fields
| Field | Type | Description |
|---|---|---|
requestInformation.clientReferenceInformation.code | string | Client reference code for tracking. |
Send OTP Request
Request a one-time password. The issuer sends the OTP to the cardholder by email, SMS, or issuer account login.
Endpoint
POST /tms/v2/tokenized-cards/{id}/bindings
POST /tms/v2/tokenized-cards/{id}/bindings
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Set to OTP. |
deviceInformation.deviceIdentifier | string | Unique identifier for the device. |
Verify OTP
Verify the OTP that the cardholder received.
Complete OTP Verification
Submit the OTP that the cardholder entered to complete the device binding.
Endpoint
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
PATCH /tms/v2/tokenized-cards/{id}/bindings/{bindingId}
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorType | string | Set to OTP. |
deviceInformation.authenticatedIdentities.authenticatedIdentity[].authenticatorData | string | Base64-encoded OTP value submitted by the cardholder. |
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
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
requestInformation.transactionId | string | The transaction ID associated with the payment credential request. |
deviceInformation.deviceSignedJWS | string | The device-signed JSON Web Signature (JWS) generated using the device signing key. |
Optional Fields
| Field | Type | Description |
|---|---|---|
requestInformation.clientReferenceInformation.code | string | Client 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.
| Field | Type | Description |
|---|---|---|
{id} | string | Identifier of the tokenized card, included in the URL path. |
{clientDeviceID} | string | Identifier 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
| Field | Type | Description |
|---|---|---|
clientRequestToken | string | Unique reference ID for the request. |
paymentInformation.tokenizedCard.id | string | Identifier of the tokenized card. |
orderInformation.amountDetails.totalAmount | string | Total transaction amount. |
orderInformation.amountDetails.currency | string | ISO 4217 currency code. For example, USD. |
Optional Fields
| Field | Type | Description |
|---|---|---|
clientReferenceInformation.code | string | Client reference code for tracking. |
Thanks for your feedback!
Last published: September 29, 2026