# Enroll customer and card in Visa CTP
Enroll a customer and card in Visa's Click to Pay 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—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"
}
}
},
"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 Visa's Click to Pay 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"
}
}
}
}
}
},
"500": {
"description": "Internal Server Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ClickToPayInternalServerError"
},
"examples": {
"internal_server_error": {
"value": {
"code": 500,
"message": "internal server error"
}
}
}
}
}
}
}
}
}
}
}
```