# 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" } } } } } } } } } } } ```