Core concepts
Core Concepts
Visa ID & Credential API (VICA) lets you manage consumer identities and payment credentials, and enroll them into multiple Visa products, through one fixed set of endpoints. You select which product an operation applies to using a request attribute — you never call a different endpoint per product.
This page explains the building blocks that are shared across every product. For how the unified APIs sit in front of Visa services, see Overview. For the complete request/response schemas and field constraints, see API Reference.
VICA operations
VICA exposes a single, product-agnostic set of operations. The same operation works across products; the product is chosen in the request body (see Request Patterns).
Supported operations may differ by product; refer to the product-specific documentation for availability.
| Operation | Purpose | Processing |
|---|---|---|
| Enroll Issuer Data | Create a consumer | Asynchronous (202) |
| Enroll Existing Issuer Data with Payment Instrument | Enroll a consumer already registered in another Visa product (e.g. Click to Pay) into an additional product, providing a full payment instrument object | Asynchronous (202) |
| Enroll Existing Issuer Data with Payment Instrument Reference | Enroll a consumer already registered in another Visa product into an additional product, referencing an existing payment instrument by ID — no payment instrument data required | Asynchronous (202) |
| Enroll Payment Instruments | Add payment instrument(s) to an existing consumer | Asynchronous (202) |
| Manage Consumer Information Data | Update consumer profile fields | Asynchronous (202) |
| Manage Payment Instruments Data | Update payment instrument details | Asynchronous (202) |
| Delete Consumer Information Data | Remove a consumer and all associated payment instruments | Asynchronous (202) |
| Delete Payment Instruments Data | Remove a single payment instrument | Asynchronous (202) |
| Get Issuer Data | Retrieve a consumer's enrolled data and payment instruments | Synchronous (200) |
| Request Status by Request Trace ID | Retrieve the outcome of an asynchronous request | Synchronous (200) |
Two variations of enrollment let you add an already-known consumer (or consumer + payment instrument) to an additional product without resubmitting full details — see Implementation Guides.
VICA also sends two outbound notifications to a registered issuer endpoint: a Request Status Notification when an async request completes, and a Click to Pay Enrollment Attempt Notification - see Core Concepts > Asynchronous Processing Model.
For each operation's HTTP method, path, and request/response samples, see Implementation Guides; for the authoritative schema, see API Reference.
Common objects
Every VICA request combines target product(s) with consumer and/or payment-instrument data. Individual products extend or constrain these objects, but the shape is shared.
| Object | What it represents | Key elements |
|---|---|---|
| products | Which Visa product(s) the operation targets | An array of { "productCode": … } entries — CLICK_TO_PAY, ADDRESS_VERIFICATION_SERVICE, ACCOUNT_NAME_INQUIRY, ALIAS_DIRECTORY_SERVICE. See Request Patterns. |
| intent | (legacy) Which Visa product the operation targets | Object containing { "type": "PRODUCT_CODE", "value": "CLICK_TO_PAY" } |
| consumerInformation | The person whose data is being enrolled or managed | identity (externalConsumerID, externalConsumerIDOwnerBID), profile (firstName, lastName, countryCode, locale), contact (email, phone), status, consent |
| paymentInstruments | One or more payment credentials linked to the consumer | type (CARD or BANK_ACCOUNT), the type-specific fields, and an optional preferredFor |
- products selects routing and also determines how results are keyed in responses (productCode vs intent) — see Core Concepts > Request Patterns.
- CARD is supported by all products. BANK_ACCOUNT is supported only by Alias Directory Service (ADS).
- preferredFor (send / receive / pay) applies only to ADS; other products ignore it.
How VICA identifies a consumer
A consumer in VICA is uniquely identified by the combination of two fields:
- externalConsumerID - a unique consumer identifier from the issuer's perspective, generated and provided by you. It is distinct from any payment instrument identifier; one consumer may have many payment instruments.
- externalConsumerIDOwnerBID — the Visa Business Identifier (BID) of the entity that owns that consumer record.
Together they uniquely identify a consumer across the VICA and Click to Pay systems and link enrollment to all later data-management operations, so updates apply to the correct record. Data is siloed per product - enrolling a consumer in one product (e.g., Click to Pay) does not enroll them in another (e.g., AVS).
"consumerInformation": {
"externalConsumerID": "829662xw-54pl-50tr-c127-5368r18701",
"externalConsumerIDOwnerBID": "10098765",
"firstName": "John",
"lastName": "Doe",
"countryCode": "USA"
}
External Consumer ID Owner (BID)
externalConsumerIDOwnerBID identifies the BID of the entity to which an externalConsumerID belongs. When multiple issuers or processors share a VICA integration, this field tells Visa which entity owns a given consumer record.
Phased Requirement
| Integration date | Requirement |
|---|---|
| Integrated before 3 April 2025 | Optional; existing integrations that omit it continue to work without error |
| All other integrations | Required for Enroll Data and Enroll Payment Instruments requests, recommended to always provide it |
Format
| Constraint | Value |
|---|---|
| Type | String |
| Pattern | Numeric digits only (^\d*$) |
| Min length | 1 |
| Max length | 8 |
| Example | 10098765 |
Table 1: externalConsumerIDOwnerBID field constraints
Choosing the right BID. An issuer may have several BIDs associated with a PAN (e.g., the PAN's Issuer BID or its Holding Company BID). Send the BID of the entity that manages the customer profile:
- If you use the same externalConsumerID for cards under different Issuer BIDs, send the PAN's Holding Company BID.
- If you use different externalConsumerIDs for cards under different Issuer BIDs, send the PAN's Issuer BID.
Include this field wherever consumerInformation is accepted — it applies to all products (CTP, AVS, ANI, ADS). For the correct value for your integration, contact your Visa Representative.
Asynchronous processing model
Does VICA process requests synchronously or asynchronously? Both - and which one applies depends on the operation. VICA splits operations into two processing modes. Understanding this model is essential - most write operations do not report their final outcome in the HTTP response.
Writes are asynchronous. Enroll, Manage, and Delete return HTTP 202 Accepted to acknowledge receipt, along with a requestTraceId.
The final outcome arrives one of two ways:
- Pull - call Request Status with the requestTraceId. The requestTraceId is a client-provided UUID and is valid for 7 days from receipt.
- Push - receive a Request Status Notification at the endpoint you register in Visa Developer Platform (VDP). Notifications are sent only after processing is fully complete, so every item is in a terminal state (SUCCESS / FAILED). You must build and secure this receiver endpoint - plan for it early. See How to Receive Status Notifications and Authentication & Security › Securing Outbound Notification Endpoints.
Get Data is synchronous. It returns HTTP 200 with the consumer's current data in the response body.
Outcomes are per-product, not per-request. When a request targets more than one product, each product is processed independently. A failure in one product does not fail the others or reject the request at the HTTP level:
- Async writes: inspect the per-product details[] in the Request Status response/notification.
- Get Data: always returns HTTP 200; inspect each item in the data[] array — a product item is either successful data or an errorDetails object.
Note: The same VIDC- reason code can mean different things depending on context (synchronous validation vs. Get Data item-level results). See Errors and Troubleshooting for the authoritative, context-scoped code tables.
VICA also pushes a Click to Pay Enrollment Attempt Notification when a consumer self-enrolls and the issuer is enabled for Issuer Offered Click to Pay (IoC). See Click to Pay with VICA.
Request patterns
How do I target one or more products in a request? You tell VICA which product(s) an operation targets using one of three patterns. The choice affects which fields are required and how results are keyed in responses.
| Pattern | When to use |
|---|---|
| products only | Preferred for all new integrations. Targets one or more products in a single request. Codes: CLICK_TO_PAY, ADDRESS_VERIFICATION_SERVICE, ACCOUNT_NAME_INQUIRY, ALIAS_DIRECTORY_SERVICE. |
| intent only | Legacy. Targets Click to Pay only; retained for backward compatibility with integrations that predate products. |
| Intent + products | For integrations originally built on intent for CTP that are being extended - CTP stays addressed by intent, additional products go in products. |
// products only (preferred)
"products": [
{ "productCode": "CLICK_TO_PAY" },
{ "productCode": "ALIAS_DIRECTORY_SERVICE" }
]
Up to four products can be included in one request; each is processed independently.
How the pattern affects responses. In Get Data, Request Status, and Request Status Notification, items are keyed differently depending on the pattern used:
| Request pattern | CTP item keyed by | Other product items keyed by |
|---|---|---|
| intent only | intent | n/a |
| product only | productCode | productCode |
| intent + product | intent | productCode |
Parse the data / details array accordingly: an item is a CTP result if it carries the intent key, and a non-CTP result if it carries the productCode key. (intent-keyed CTP failures use a top-level error string; product-keyed failures use the structured errorDetails object — see Errors & Troubleshooting.)
Supported operations per product
Not every operation is available for every product. This matrix is the quick orientation; each product hub documents its own specifics.
| Operation | CTP | AVS | ANI | ADS |
|---|---|---|---|---|
| Enroll Consumer | YES | YES | YES | YES |
| Enroll Payment Instrument (type=CARD) | YES | YES | NO ¹ | YES |
| Enroll Payment Instrument (type=BANK_ACCOUNT) | NO | NO | NO | YES |
| Manage Consumer Information Data | YES | NO² | NO | YES |
| Manage Payment Instruments Data | YES | YES | NO | YES |
| Delete Consumer Information Data | YES | NO² | NO | YES |
| Delete Payment Instruments Data | YES | YES | YES | YES |
| Get Data | YES | NO³ | NO ³ | YES |
¹ ANI requires consumerInformation; it does not support standalone card enrollment.
² Consumer-level operations on AVS return HTTP 422.
³ Get Data on AVS/ANI returns item-level error VIDC-1003; other products in the same request are unaffected.
Next steps
- Implementation Guides - step-by-step recipes for each operation (enroll, manage, delete, retrieve), with per-product samples.
- API Reference - the complete OpenAPI schema: every endpoint, field, and constraint (optional deeper dive).
- Product guides - deeper, product-specific behavior and constraints: Click to Pay, Address Verification Service, Alias Directory Service, Account Name Inquiry.
- Errors and Troubleshooting - reason codes and how failures surface per operation type.