---
updatedAt: 2026-04-30T13:46:47.000Z
agentTools:
  siteIndex: https://developers.pismo.io/llms.txt
  projectIndex: https://developers.pismo.io/pismo-docs/llms.txt
---

# Enroll customer and card in Visa CTP

Enroll a customer and card in <a href="https://usa.visa.com/products/click-to-pay/consumers.html" target="_blank">Visa's Click to Pay</a> service. Click to Pay is a secure, streamlined online checkout solution using tokenization.

 For more information, refer to [Click to Pay](doc:click-to-pay).

 This endpoint generates a [Click to Pay event generated](https://developers.pismo.io/events/docs/cards-tokenization-click-to-pay-1) event.

**Notes**:

- The following fields are **mandatory** to enroll a customer/card into Visa's Click to Pay: `first_name`, `last_name`, `emails`, `phones` and `billing_address`. If not passed and not found internally, an error is returned.

- The process is asynchronous, success or failure is indicated in the generated event.

- This endpoint takes an account token - an access token encoded with a Pismo account ID.

- This is a PCI endpoint, use the https://gw-pci.pismolabs.io environment.


# OpenAPI definition

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Card issuing - Tokenization",
    "description": "API endpoints for card tokenization.",
    "version": "1.0.0",
    "contact": {
      "name": "API Support",
      "url": "https://developers.pismo.io/support"
    },
    "license": {
      "name": "Copyright Pismo"
    }
  },
  "servers": [
    {
      "url": "https://gw-pci.pismolabs.io/cards-tokenization",
      "description": "PCI API server for testing"
    },
    {
      "url": "https://pci.pismolabs.io/cards-tokenization",
      "description": "Sandbox API server for testing."
    }
  ],
  "tags": [
    {
      "name": "Visa Click to Pay",
      "description": "Visa Click to Pay service endpoints"
    }
  ],
  "components": {
    "parameters": {
      "CidHeader": {
        "name": "x-cid",
        "in": "header",
        "schema": {
          "type": "string"
        },
        "description": "Request correlation ID used for tracking on Pismo platform."
      },
      "CustomerIDheader": {
        "name": "x-customer-id",
        "in": "header",
        "required": true,
        "schema": {
          "type": "integer"
        },
        "description": "Customer ID"
      },
      "TenantHeader": {
        "name": "x-tenant",
        "in": "header",
        "schema": {
          "type": "string"
        },
        "description": "Pismo organization/tenant ID",
        "required": true
      }
    },
    "schemas": {
      "CardID": {
        "type": "number",
        "description": "Card ID",
        "example": 6743052
      },
      "ClickToPayAddress": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "City",
            "minLength": 1,
            "maxLength": 32,
            "example": "San Francisco"
          },
          "state": {
            "type": "string",
            "description": "State - ISO 3166-2 code format. For example - `RJ` (Rio de Janiero, Brazil)",
            "format": "ISO 3166-2",
            "minLength": 1,
            "maxLength": 3,
            "example": "RJ"
          },
          "postal_code": {
            "type": "string",
            "description": "Postal code",
            "minLength": 1,
            "maxLength": 9,
            "example": "94105"
          },
          "country_code": {
            "type": "string",
            "format": "ISO 3166-1-alpha3,",
            "description": "Country code - 3-character ISO 3166 (Alpha 3) format",
            "minLength": 1,
            "maxLength": 3,
            "example": "USA"
          },
          "address_line1": {
            "type": "string",
            "description": "Address line one",
            "minLength": 1,
            "maxLength": 64,
            "example": "1000 Market Street"
          },
          "address_line2": {
            "type": "string",
            "description": "Address line two",
            "minLength": 1,
            "maxLength": 64,
            "example": "Building 56"
          },
          "address_line3": {
            "type": "string",
            "description": "Address line three",
            "minLength": 1,
            "maxLength": 64,
            "example": "Suite 101"
          }
        }
      },
      "ClickToPayBadRequest": {
        "type": "object",
        "properties": {
          "code": {
            "type": "number",
            "description": "HTTP response code",
            "example": 400
          },
          "message": {
            "type": "string",
            "description": "Error description"
          },
          "details": {
            "type": "array",
            "description": "Error details",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "ClickToPayCardInfo": {
        "type": "object",
        "required": [
          "card_id"
        ],
        "properties": {
          "card_id": {
            "$ref": "#/components/schemas/CardID"
          },
          "billing_address": {
            "$ref": "#/components/schemas/ClickToPayAddress"
          }
        }
      },
      "ClickToPayConsent": {
        "type": "object",
        "description": "Consent details",
        "required": [
          "time_of_consent"
        ],
        "properties": {
          "time_of_consent": {
            "type": "string",
            "description": "Date/time when consent becomes valid, in ISO UTC format YYYY-MM-DDThh:mm:ss.000Z. Only accepts present and past dates.\n",
            "example": "2020-05-05T12:12:12.000Z",
            "pattern": "\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d\\.000Z"
          },
          "version": {
            "type": "string",
            "description": "Terms and conditions version that the customer accepted.",
            "minLength": 1,
            "maxLength": 9,
            "example": "1.0"
          },
          "presenter": {
            "type": "string",
            "description": "Text identifying consent presenter.",
            "minLength": 1,
            "maxLength": 30,
            "example": "Acme Bank"
          }
        }
      },
      "ClickToPayCustomerInfo": {
        "type": "object",
        "required": [
          "locale"
        ],
        "properties": {
          "locale": {
            "$ref": "#/components/schemas/Locale"
          },
          "first_name": {
            "type": "string",
            "description": "Customer first name",
            "minLength": 1,
            "maxLength": 35,
            "example": "Alex"
          },
          "middle_name": {
            "type": "string",
            "description": "Customer middle name",
            "minLength": 1,
            "maxLength": 35,
            "example": "Robert"
          },
          "last_name": {
            "type": "string",
            "description": "Customer last name",
            "minLength": 1,
            "maxLength": 35,
            "example": "Miller"
          },
          "country_code": {
            "type": "string",
            "format": "ISO 3166-1-alpha3",
            "description": "Country code&mdash;3-character ISO 3166 (Alpha 3) format",
            "minLength": 1,
            "maxLength": 3,
            "example": "USA"
          },
          "emails": {
            "type": "array",
            "description": "Customer emails",
            "minLength": 1,
            "maxLength": 5,
            "items": {
              "type": "string",
              "description": "Email address",
              "format": "email",
              "example": "anita_drink@provider.com"
            }
          },
          "phones": {
            "type": "array",
            "description": "Customer phones",
            "minLength": 1,
            "maxLength": 5,
            "items": {
              "type": "string",
              "description": "Customer phone",
              "example": "5545999999999"
            }
          },
          "national_identifiers": {
            "type": "array",
            "description": "Customer national identifiers",
            "minLength": 1,
            "maxLength": 5,
            "items": {
              "required": [
                "type",
                "value"
              ],
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Identification type",
                  "enum": [
                    "PASSPORT",
                    "DRIVING_LICENSE",
                    "NATIONAL_IDENTITY"
                  ],
                  "example": "NATIONAL_IDENTITY"
                },
                "value": {
                  "type": "string",
                  "description": "Identification type value",
                  "minLength": 1,
                  "maxLength": 24,
                  "example": "A123456"
                }
              }
            }
          },
          "consent": {
            "$ref": "#/components/schemas/ClickToPayConsent"
          }
        }
      },
      "ClickToPayEnrollData": {
        "type": "object",
        "required": [
          "owner_bid",
          "card_information",
          "customer_information"
        ],
        "properties": {
          "owner_bid": {
            "$ref": "#/components/schemas/OwnerBid"
          },
          "card_information": {
            "$ref": "#/components/schemas/ClickToPayCardInfo"
          },
          "customer_information": {
            "$ref": "#/components/schemas/ClickToPayCustomerInfo"
          }
        }
      },
      "ClickToPayInternalServerError": {
        "type": "object",
        "description": "Click to Pay internal server error",
        "properties": {
          "code": {
            "type": "number",
            "description": "HTTP response code",
            "example": 500
          },
          "message": {
            "type": "string",
            "description": "Error description",
            "example": "Internal server error"
          }
        }
      },
      "ClickToPayRateLimitError": {
        "type": "object",
        "description": "Click to Pay rate limit error - Visa API throttling",
        "properties": {
          "code": {
            "type": "number",
            "description": "HTTP response code",
            "example": 429
          },
          "message": {
            "type": "string",
            "description": "Error description",
            "example": "Rate limit exceeded"
          },
          "details": {
            "type": "array",
            "description": "Error details from Visa",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Locale": {
        "type": "string",
        "description": "Consumer preferred locale (language and country).\n\n**Format**: two-letter ISO-639-1 language in lowercase + underscore (\"_\") + two-letter ISO 3166-1 country code in uppercase.\n",
        "example": "en_US"
      },
      "OwnerBid": {
        "type": "string",
        "description": "Owner business ID. Identifies the issuing entity creating or managing enrollment in Click to Pay.\n",
        "example": "1000052"
      }
    },
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Account token - token encoded with a Pismo account ID. Tokens can expire quickly, which can result in a \"**401 Unauthorized**\" error.",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "paths": {
    "/v1/clicktopay/visa/enroll/customer": {
      "post": {
        "summary": "Enroll customer and card in Visa CTP",
        "description": "Enroll a customer and card in <a href=\"https://usa.visa.com/products/click-to-pay/consumers.html\" target=\"_blank\">Visa's Click to Pay</a> service. Click to Pay is a secure, streamlined online checkout solution using tokenization.\n\n For more information, refer to [Click to Pay](https://developers.pismo.io/pismo-docs/docs/click-to-pay).\n\n This endpoint generates a [Click to Pay event generated](https://developers.pismo.io/events/docs/cards-tokenization-click-to-pay-1) event.\n\n**Notes**:\n\n- The following fields are **mandatory** to enroll a customer/card into Visa's Click to Pay: `first_name`, `last_name`, `emails`, `phones` and `billing_address`. If not passed and not found internally, an error is returned.\n\n- The process is asynchronous, success or failure is indicated in the generated event.\n\n- This endpoint takes an account token - an access token encoded with a Pismo account ID.\n\n- This is a PCI endpoint, use the https://gw-pci.pismolabs.io environment.\n",
        "operationId": "post-v1-clicktopay-enroll_customer",
        "tags": [
          "Visa Click to Pay"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TenantHeader"
          },
          {
            "$ref": "#/components/parameters/CustomerIDheader"
          },
          {
            "$ref": "#/components/parameters/CidHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClickToPayEnrollData"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClickToPayBadRequest"
                },
                "examples": {
                  "bad_request": {
                    "value": {
                      "code": 400,
                      "message": "bad request"
                    }
                  },
                  "bad_request_detailed": {
                    "value": {
                      "code": 400,
                      "message": "bad request",
                      "details": [
                        "AccountID: cannot be blank",
                        "CustomerID: cannot be blank",
                        "OrgID: cannot be blank.",
                        "cardId: cannot be blank."
                      ]
                    }
                  },
                  "customer_already_on_click_to_pay": {
                    "value": {
                      "code": 400,
                      "message": "customer already on click to pay"
                    }
                  },
                  "click_to_pay_not_enabled_to_tenant": {
                    "value": {
                      "code": 400,
                      "message": "click to pay is not enabled to tenant"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests - Visa rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClickToPayRateLimitError"
                },
                "examples": {
                  "rate_limit_exceeded": {
                    "value": {
                      "code": 429,
                      "message": "Rate limit exceeded",
                      "details": [
                        "rate limit exceeded"
                      ]
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClickToPayInternalServerError"
                },
                "examples": {
                  "internal_server_error": {
                    "value": {
                      "code": 500,
                      "message": "internal server error"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
```