Scenario 5
An agent shops on a merchant website with a Visa card
An agent browses a merchant site with TAP agent-browser-auth signatures, gets a passkey-approved Payment Instruction and an agent-specific token from Visa Intelligent Commerce, then checks out with an agent-payer-auth signature and the agenticConsumer and agenticPaymentContainer objects. A CDN verifies the signatures at the edge. Visa's public key directory held only an RSA sandbox key on 2026-10-11, and the specification's examples cannot verify.
The situation
A consumer asks an AI to buy one item from a merchant’s own website and pay with a Visa card already linked to the agent. The agent browses like a person would, but it signs every request so that the merchant’s CDN can tell it apart from an unknown bot. The consumer is present at one moment only: to approve the purchase with a .
Two Visa layers work together here. The (TAP) lets the agent prove its identity by signing its web requests, and it does not move money by itself.Source [1, 2, 3] Visa presents TAP as an enhancement to (VIC), which holds the consumer’s consent, the limits and the agent-specific token.Source [1, 3, 4]
Parts of this run live today. Visa says live European agent purchases used TAP and the , at merchant websites rather than test storefronts.Source [5] Cloudflare and Akamai support TAP at the infrastructure level.Source [5] No count of merchants that verify TAP signatures is published, and the specification page has no version number or date.Source [1, 5]
Actors
- Consumer, who approves the with a .
- AI , an Agent Provider: a certified AI platform onboarded to the .Source [1]
- , which enrolls the card, holds instructions and returns credentials.
- Visa key store, the public that verifiers use.Source [1]
- CDN, a in front of the merchant site.Source [1]
- Merchant, which may verify signatures itself or let the CDN do it.Source [1]
- Acquirer, network and issuer, on ordinary card rails.
Step by step
- Ask (no protocol). The consumer names the item and the merchant.
- Enroll the card (). The enrolls the card with
POST /vacp/v1/cards, as Visa’s VIC API client names the call.Source [6] VIC provisions an agent-specific token after step-up verification of the cardholder and setup of a .Source [3] - Browse with a signature (). The agent sends
Signature-InputandSignatureheaders.Source [1, 7] The signature covers at least@authorityand@pathand carriescreated,expires,keyid,alg,nonceandtag.Source [1] For browsing the isagent-browser-auth.Source [1] - Fetch the key (TAP). The CDN resolves
keyidagainst Visa’s key store. On 2026-10-11 that held one 2048-bit RSA key and no Ed25519 key.Source [8] The key carried a certificate forvic-oauth-jwe.visa.comfrom a Visa sandbox issuing CA.Source [8] Visa has not published how production agent keys are distributed.Source [1, 8] - Verify at the edge (TAP). The CDN checks, in order, the tag, the minimum fields, the time window, the , the key and the signature.Source [1] The window is at most 8 minutes.Source [1]
- Forward (TAP). The CDN passes the request on as a verified agent.Source [9]
- Product page (TAP). The merchant returns product details, availability and the final cost after taxes and shipping.Source [1] It may show a simpler agent-specific page.Source [1]
- Create a (VIC). The agent calls
POST /vacp/v1/instructions.Source [6] - Approve with a passkey (VIC). The consumer authenticates the instruction with a passkey before the agent can retrieve credentials.Source [3]
- Get credentials (VIC). The agent calls
POST /vacp/v1/instructions/{instructionId}/credentials.Source [6] - Check out with the payer tag (TAP). The agent signs with
agent-payer-auth.Source [1] VIC payments start as guest checkout with key entry, so the agent fills the merchant’s card form.Source [3] The body carriesagenticConsumer(nonce,idToken,contextualData,kid,alg,signature) andagenticPaymentContainer(nonce,kid,alg,signature).Source [1] For key-entered guest checkout the container carries a .Source [1] Both objects use the header’s key and nonce.Source [1] - Verify the payer signature (TAP). The CDN repeats the header checks for the payer tag.Source [1]
- Verify the body (TAP). The merchant verifies each object over all fields in the order received except the signature.Source [1] If its own hash of the key-entered card data does not match, it should decline.Source [1]
- Authorize (card rails). The merchant authorizes through its acquirer; TAP plays no part in this step.Source [1, 3]
- Confirm (no protocol). The merchant returns the order result; TAP defines no receipt.Source [1, 3]
- Report (VIC). The agent calls
POST /vacp/v1/instructions/{instructionId}/confirmations.Source [6]
Which protocol does what
| Steps | Protocol | Object or message | Spec version |
|---|---|---|---|
| 2, 8 to 10, 16 | (Visa) | /vacp/v1/cards, /vacp/v1/instructions and its sub-paths | visa/ai client, 2026-09-30 |
| 3 to 7 | Signature-Input with tag="agent-browser-auth", | unversioned page, read 2026-10-11 | |
| 11 to 13 | TAP | tag="agent-payer-auth", agenticConsumer, agenticPaymentContainer | unversioned page, read 2026-10-11 |
| 14 | Card rails | authorization | outside TAP |
Two warnings for implementers. The specification’s header examples reuse a draft test vector that signs a different base.Source [1, 10] Its browsing and checkout examples show the same signature under different tags, and its example window is 3,600 seconds, so the examples cannot verify.Source [1] TAP publishes no test vectors.Source [1, 11]
Where controls apply
- Before authorization. holds consent: the consumer approves each with a .Source [3] Spending limits and step-up also sit in VIC, invisible to the merchant in the request.Source [1, 3]
- At signing. TAP allows extra signature fields beyond the minimum.Source [1] The minimum leaves out
@method, the query string and a , so an platform that adds them narrows what a stolen signature could be reused for.Source [1] - At the edge. The CDN is the natural verifier.Source [1] checks work only if the verifier keeps an 8-minute record.Source [1] The sample CDN proxy checks only
/product/paths and skips the and window checks, so a controls layer should not copy it.Source [12] - At settlement. Issuer and network risk decisions apply to the token, and Visa says TAP feeds telemetry into its fraud and risk models.Source [13]
- After the fact. VIC confirmations and commerce signals support disputes.Source [1, 3] TAP has no revocation list or key status endpoint.Source [1]
What is observable from outside
The key store is public and cacheable for an hour, so anyone can watch keys appear or disappear.Source [8] Visa newsroom releases name adopting merchants and issuers with dates.Source [5] Everything else is private. is off-chain and defines no events or explorers.Source [1] Signature headers reach only the CDN, the merchant and the path between them.Source [1] On Cloudflare the zone owner can read cf.bot_management.signed_agent, which needs an Enterprise plan with Bot Management.Source [14] The consumer object sends the consumer’s IP address, device data, country and postal code to the merchant.Source [1]
What can go wrong
- Untagged request. Without a the request was not signed by a trusted ; the merchant treats it as any other bot.Source [1]
- Stale or replayed signature. A bad window, a reused , a missing key or a failed signature each lead to a block.Source [1] A approval that takes longer than the window forces a fresh signature.
- Unresolvable key. With only an RSA sandbox key at the public URL, a verifier that relies on it cannot check an Ed25519 signature like the specification’s examples.Source [1, 8]
- Tampered body. The header signature does not cover the body.Source [1, 15] A that fails its checks should not be used for payment.Source [1] A consumer object that fails may still be used, at the merchant’s risk.Source [1]
- Who bears the loss. Worldpay wrote that no liability shift for agentic transactions exists yet.Source [16] It says properly authenticated, tokenized agent transactions follow existing tokenized-transaction rules.Source [16]
Variants
- Encrypted payload instead of key entry. A merchant that onboards its public key to the can receive an encrypted payload holding the token, expiry, cardholder name and dynamic data.Source [1] No form fill is needed.
- Pay-per-access with a browsing IOU. When the merchant answers with , the container can carry a
browsingIOUinstead.Source [1] defines neither the 402 format nor how the IOU is settled.Source [1]
Flow player: An agent shops on a merchant website with a Visa card: TAP browsing and payer signatures, a VIC token, verification at the CDN
An agent enrolled in Visa Intelligent Commerce browses a merchant site with TAP agent-browser-auth signatures, gets a passkey-approved Payment Instruction and an agent-specific token from VIC, then checks out with an agent-payer-auth signature and the agenticConsumer and agenticPaymentContainer body objects. A CDN verifies the header signatures at the edge; the merchant verifies the body objects and authorizes the card payment through its acquirer. The VIC API calls are named as Visa's visa/ai client names them.
Spec version: TAP spec, unversioned (read 2026-10-11); VIC API client in visa/ai (2026-09-30) (2025-10-14).
Use the left and right arrow keys to step, space to play or pause, Home and End to jump.
Step 1 of 16Consumer to AI agent (Agent Provider)
Ask the agent to buy an item
The consumer asks the agent to find and buy one item on a merchant website. The consumer has already linked a Visa card to the agent.
Control point: Before authorization: the agent platform records which merchants and amounts the consumer named.
Step 1 of 16: Consumer to AI agent (Agent Provider). Ask the agent to buy an item.
Which protocol owns each step
- Visa Trusted Agent Protocol
| Step | From and to | Protocol | Control point | Observable from outside |
|---|---|---|---|---|
| 1. Ask the agent to buy an item | Consumer to AI agent (Agent Provider) | Not protocol-specific | Before authorization: the agent platform records which merchants and amounts the consumer named. | Private |
| 2. POST /vacp/v1/cards (card enrollment) (crosses a trust boundary) | AI agent (Agent Provider) to Visa Intelligent Commerce | Visa Trusted Agent Protocol | Before authorization: step-up verification of the cardholder and passkey setup in VIC. | Private: a bilateral call between the agent and Visa. |
| 3. GET product page, signed with tag agent-browser-auth (crosses a trust boundary) | AI agent (Agent Provider) to CDN (Site Protection Provider) | Visa Trusted Agent Protocol | At signing: the agent platform can cover @method and a Content-Digest beyond the minimum, and refuse to sign for merchants the consumer did not pick. | Private: Signature-Input and Signature are visible only to the CDN, the merchant and intermediaries on the path. |
| 4. Fetch the key for keyid (crosses a trust boundary) | CDN (Site Protection Provider) to Visa key store | Visa Trusted Agent Protocol | None | Public: anyone can poll the JWK Set (cache-control public, max-age=3600) and watch keys appear or disappear. |
| 5. Verify tag, fields, window, nonce and signature | CDN (Site Protection Provider) to CDN (Site Protection Provider) | Visa Trusted Agent Protocol | At the edge: keep a shared nonce record for at least 8 minutes, reject longer windows, check that the tag fits the page type. | Private to the zone owner: on Cloudflare, cf.bot_management.signed_agent (Enterprise Bot Management) exposes the result. |
| 6. Forward as a verified browsing agent (crosses a trust boundary) | CDN (Site Protection Provider) to Merchant website | Visa Trusted Agent Protocol | None | Private |
| 7. 200 product page with final cost (crosses a trust boundary) | Merchant website to AI agent (Agent Provider) | Visa Trusted Agent Protocol | None | Private |
| 8. POST /vacp/v1/instructions (Payment Instruction) (crosses a trust boundary) | AI agent (Agent Provider) to Visa Intelligent Commerce | Visa Trusted Agent Protocol | Before authorization: the instruction is where amount and merchant limits can be set. | Private: bilateral between the agent and Visa. |
| 9. Approve the instruction with a passkey (crosses a trust boundary) | Consumer to Visa Intelligent Commerce | Visa Trusted Agent Protocol | Before authorization: user consent and step-up, held by VIC. | Private |
| 10. POST /vacp/v1/instructions/{instructionId}/credentials (crosses a trust boundary) | AI agent (Agent Provider) to Visa Intelligent Commerce | Visa Trusted Agent Protocol | None | Private: credentials pass only between Visa and the agent. |
| 11. POST checkout, signed with tag agent-payer-auth, with agenticConsumer and agenticPaymentContainer (crosses a trust boundary) | AI agent (Agent Provider) to CDN (Site Protection Provider) | Visa Trusted Agent Protocol | At signing: send consumer data only to the merchant the consumer chose; cover @method and Content-Digest where the merchant accepts them. | Private: body objects carry personal and card data for the merchant only. |
| 12. Verify the payer signature at the edge, forward (crosses a trust boundary) | CDN (Site Protection Provider) to Merchant website | Visa Trusted Agent Protocol | At the edge: verify every path that matters, including checkout and API routes. | Private |
| 13. Verify the body objects and the credential hash | Merchant website to Merchant website | Visa Trusted Agent Protocol | At the edge (merchant side): do not use consumer or payment data that fails verification, although TAP leaves the consumer object to merchant discretion. | Private |
| 14. Authorize the card payment (crosses a trust boundary) | Merchant website to Acquirer, Visa network and issuer | Not protocol-specific | At settlement: issuer and network risk decisions on the agent-specific token; Visa says TAP telemetry feeds its fraud and risk models. | Private: card authorization messages. |
| 15. Order confirmation (crosses a trust boundary) | Merchant website to AI agent (Agent Provider) | Not protocol-specific | None | Private |
| 16. POST /vacp/v1/instructions/{instructionId}/confirmations (crosses a trust boundary) | AI agent (Agent Provider) to Visa Intelligent Commerce | Visa Trusted Agent Protocol | After the fact: VIC confirmations, the merchant's own logs of verification results, and ordinary card dispute rules. | Private: bilateral between the agent and Visa. |
Sequence diagram: An agent shops on a merchant website with a Visa card: TAP browsing and payer signatures, a VIC token, verification at the CDN
Scroll to see the whole diagram
Diagram loads when it scrolls into view.
Generated from the flow definition (spec version TAP spec, unversioned (read 2026-10-11); VIC API client in visa/ai (2026-09-30), 2025-10-14). The player above uses the same data.
Text alternative
Sequence diagram: An agent shops on a merchant website with a Visa card: TAP browsing and payer signatures, a VIC token, verification at the CDN. 7 participants: Consumer, AI agent (Agent Provider), Visa Intelligent Commerce, CDN (Site Protection Provider), Visa key store, Merchant website, and Acquirer, Visa network and issuer. 16 steps, 13 crossing a trust boundary, 11 failure branches. Based on several protocols TAP spec, unversioned (read 2026-10-11); VIC API client in visa/ai (2026-09-30) (2025-10-14). Step 1: Consumer to AI agent (Agent Provider): Ask the agent to buy an item. Step 2: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/cards (card enrollment). This step crosses a trust boundary. If Step-up verification fails: No agent-specific token is provisioned. Step 3: AI agent (Agent Provider) to CDN (Site Protection Provider): GET product page, signed with tag agent-browser-auth. This step crosses a trust boundary. If A checkout enabler or proxy strips the signature headers: The request arrives untagged and is treated as an unknown bot. Step 4: CDN (Site Protection Provider) to Visa key store: Fetch the key for keyid. This step crosses a trust boundary. If No key for keyid, or the key has expired: Block the request; TAP has no revocation list or key status endpoint. Step 5: CDN (Site Protection Provider) to CDN (Site Protection Provider): Verify tag, fields, window, nonce and signature. If Neither agent-browser-auth nor agent-payer-auth in Signature-Input: Not signed by a trusted agent; block or apply ordinary bot policy. If Missing field, window over 8 minutes, reused nonce or failed signature: Block the request. Step 6: CDN (Site Protection Provider) to Merchant website: Forward as a verified browsing agent. This step crosses a trust boundary. Step 7: Merchant website to AI agent (Agent Provider): 200 product page with final cost. This step crosses a trust boundary. Step 8: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions (Payment Instruction). This step crosses a trust boundary. Step 9: Consumer to Visa Intelligent Commerce: Approve the instruction with a passkey. This step crosses a trust boundary. If The consumer declines or the passkey check fails: No credentials can be retrieved; nothing is charged. Step 10: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions/{instructionId}/credentials. This step crosses a trust boundary. Step 11: AI agent (Agent Provider) to CDN (Site Protection Provider): POST checkout, signed with tag agent-payer-auth, with agenticConsumer and agenticPaymentContainer. This step crosses a trust boundary. If The body is altered in transit: The header signature still verifies; only the body object signatures can catch it. Step 12: CDN (Site Protection Provider) to Merchant website: Verify the payer signature at the edge, forward. This step crosses a trust boundary. If The signature window has passed while the agent was waiting for the passkey: Block; the agent signs a fresh request. Step 13: Merchant website to Merchant website: Verify the body objects and the credential hash. If Payment container fields missing, nonce mismatch or bad signature: Should not be used for payment. If The merchant's hash of the key-entered card data differs from the payment credential hash: The specification says the merchant should decline. Step 14: Merchant website to Acquirer, Visa network and issuer: Authorize the card payment. This step crosses a trust boundary. If The issuer declines: An ordinary card decline; TAP has no role. Step 15: Merchant website to AI agent (Agent Provider): Order confirmation. This step crosses a trust boundary. Step 16: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions/{instructionId}/confirmations. This step crosses a trust boundary.
- Step 1: Consumer to AI agent (Agent Provider): Ask the agent to buy an item.
- Step 2: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/cards (card enrollment). This step crosses a trust boundary. If Step-up verification fails: No agent-specific token is provisioned.
- Step 3: AI agent (Agent Provider) to CDN (Site Protection Provider): GET product page, signed with tag agent-browser-auth. This step crosses a trust boundary. If A checkout enabler or proxy strips the signature headers: The request arrives untagged and is treated as an unknown bot.
- Step 4: CDN (Site Protection Provider) to Visa key store: Fetch the key for keyid. This step crosses a trust boundary. If No key for keyid, or the key has expired: Block the request; TAP has no revocation list or key status endpoint.
- Step 5: CDN (Site Protection Provider) to CDN (Site Protection Provider): Verify tag, fields, window, nonce and signature. If Neither agent-browser-auth nor agent-payer-auth in Signature-Input: Not signed by a trusted agent; block or apply ordinary bot policy. If Missing field, window over 8 minutes, reused nonce or failed signature: Block the request.
- Step 6: CDN (Site Protection Provider) to Merchant website: Forward as a verified browsing agent. This step crosses a trust boundary.
- Step 7: Merchant website to AI agent (Agent Provider): 200 product page with final cost. This step crosses a trust boundary.
- Step 8: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions (Payment Instruction). This step crosses a trust boundary.
- Step 9: Consumer to Visa Intelligent Commerce: Approve the instruction with a passkey. This step crosses a trust boundary. If The consumer declines or the passkey check fails: No credentials can be retrieved; nothing is charged.
- Step 10: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions/{instructionId}/credentials. This step crosses a trust boundary.
- Step 11: AI agent (Agent Provider) to CDN (Site Protection Provider): POST checkout, signed with tag agent-payer-auth, with agenticConsumer and agenticPaymentContainer. This step crosses a trust boundary. If The body is altered in transit: The header signature still verifies; only the body object signatures can catch it.
- Step 12: CDN (Site Protection Provider) to Merchant website: Verify the payer signature at the edge, forward. This step crosses a trust boundary. If The signature window has passed while the agent was waiting for the passkey: Block; the agent signs a fresh request.
- Step 13: Merchant website to Merchant website: Verify the body objects and the credential hash. If Payment container fields missing, nonce mismatch or bad signature: Should not be used for payment. If The merchant's hash of the key-entered card data differs from the payment credential hash: The specification says the merchant should decline.
- Step 14: Merchant website to Acquirer, Visa network and issuer: Authorize the card payment. This step crosses a trust boundary. If The issuer declines: An ordinary card decline; TAP has no role.
- Step 15: Merchant website to AI agent (Agent Provider): Order confirmation. This step crosses a trust boundary.
- Step 16: AI agent (Agent Provider) to Visa Intelligent Commerce: POST /vacp/v1/instructions/{instructionId}/confirmations. This step crosses a trust boundary.
Source of truth: VIC API client: enrollCard (external link) Generated from src/content/flows/multi-agent-shops-with-visa-card.json.
Actors and protocol boundaries
An agent shops with a Visa card: actors and protocol boundaries
Scroll to see the whole diagram
Diagram loads when it scrolls into view.
Visa Intelligent Commerce holds the consumer's consent, the agent-specific token and the transaction confirmations. TAP carries the agent's signatures to the merchant: agent-browser-auth while browsing, agent-payer-auth at checkout with two signed body objects. The CDN verifies header signatures against Visa's key store; the merchant verifies the body objects; card authorization runs on ordinary card rails outside TAP. On 2026-10-11 the key store held one RSA sandbox key, so the specification's example keys cannot be resolved there.
Text alternative
Flowchart. The consumer chats with the AI agent and approves a Payment Instruction with a passkey in Visa Intelligent Commerce. The agent enrolls the card, creates the instruction, retrieves credentials and later sends a confirmation to Visa Intelligent Commerce. The agent sends browsing requests tagged agent-browser-auth and a checkout request tagged agent-payer-auth with the agenticConsumer and agenticPaymentContainer objects to the merchant's CDN. The CDN fetches the key by keyid from Visa's key store at mcp.visa.com/.well-known/jwks, a dashed line, and forwards verified requests to the merchant website. The merchant verifies the body objects and the credential hash, then sends a card authorization to the acquirer, Visa network and issuer, which sits outside TAP.
Source of truth: Visa Trusted Agent Protocol specification (unversioned, read 2026-10-11) (external link) Generated from src/content/diagrams/multi-agent-shops-with-visa-card-context.mmd.
Sources
- Trusted Agent Protocol merchant specifications (external link)
- Trusted Agent Protocol reference repository README (external link)
- Visa Intelligent Commerce overview (Visa Developer Center) (external link)
- Trusted Agent Protocol overview (Visa Developer Center) (external link)
- Visa and Banks Across Europe Reach the Next Phase of Agentic Commerce, Unlocking Secure Access to Merchants (external link)
- visa/ai VIC API client (vic-client.ts) (external link)
- RFC 9421: HTTP Message Signatures (external link)
- Visa well-known JWKS (live fetch) (external link)
- Securing agentic commerce: helping AI Agents transact with Visa and Mastercard (external link)
- draft-ietf-webbotauth-httpsig-protocol-00: HTTP Message Signatures for automated traffic (external link)
- visa/trusted-agent-protocol repository metadata, commits, pull requests and issues (GitHub API) (external link)
- TAP sample CDN proxy (server.js) (external link)
- Agentic Commerce: The Threat Landscape (external link)
- cf.bot_management.signed_agent field reference (external link)
- RFC 9530: Digest Fields (external link)
- Agentic commerce liability is still being written (external link)