<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Benji Fisher</title>
    <description>The latest articles on DEV Community by Benji Fisher (@benjifisher).</description>
    <link>https://dev.to/benjifisher</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3787687%2F0c8176d8-b238-43f2-b0af-71689e955123.jpg</url>
      <title>DEV Community: Benji Fisher</title>
      <link>https://dev.to/benjifisher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benjifisher"/>
    <language>en</language>
    <item>
      <title>How the Personal Agent Protocol Works: A Real Agent, Step by Step</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:27:05 +0000</pubDate>
      <link>https://dev.to/benjifisher/how-the-personal-agent-protocol-works-a-real-agent-step-by-step-309i</link>
      <guid>https://dev.to/benjifisher/how-the-personal-agent-protocol-works-a-real-agent-step-by-step-309i</guid>
      <description>&lt;p&gt;We gave a personal agent one sentence: &lt;em&gt;"Move my delivery to Saturday and add a side of gyoza."&lt;/em&gt; Three model turns later the order at a noodle bar had changed. The agent never saw a password, and nothing changed until we approved the exact terms on screen. Then we asked it to check something with the restaurant's own AI agent, and the two agents sorted it out between them. The model's share of the bill was under a cent.&lt;/p&gt;

&lt;p&gt;This post walks through that run screen by screen, to show how the &lt;strong&gt;Personal Agent Protocol&lt;/strong&gt; (PAP, nicknamed "Poppy") works in practice. It's written for the people deciding whether their company should support it, such as product, digital and customer-experience leads, and for the developers who would build it. No code is needed to follow along.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the Personal Agent Protocol work?
&lt;/h2&gt;

&lt;p&gt;The Personal Agent Protocol is a draft open standard for how a person's AI agent works with a company on their behalf. It works in five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find.&lt;/strong&gt; The agent reads the company's &lt;code&gt;poppy.json&lt;/code&gt; file to learn how it works with agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start a session.&lt;/strong&gt; The agent opens a session as a guest, so it can browse and search but can't see an account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign in.&lt;/strong&gt; When the task needs the person's account, the person signs in on the company's own page and chooses what the agent may do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propose and approve.&lt;/strong&gt; The company turns the change into exact terms (price, items, a deadline), and the person approves them in their agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm and record.&lt;/strong&gt; The company makes the change, and both sides keep a record the person can see and revoke.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Along the way, the agent can use the company's API, its website or its own AI agent, all in the same session. The draft was published by Sierra and Meta on 9 October 2026 at version 0.1, and it may change before a stable version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: a test agent and a test restaurant
&lt;/h2&gt;

&lt;p&gt;To show this end to end you need two sides: an agent, and a company that speaks the protocol. We used two free tools I built for exactly this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://papplayground.com" rel="noopener noreferrer"&gt;PAP Playground&lt;/a&gt;&lt;/strong&gt; is a personal agent you can give a task. It records every request and response, so you can see what the protocol actually does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://papsandbox.com" rel="noopener noreferrer"&gt;PAP Sandbox&lt;/a&gt;&lt;/strong&gt; runs three test companies: a noodle bar, a flower shop and a holiday let. Each has a test customer with one open order and its own AI agent. Nothing is charged, nothing is cooked and nothing ships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The company in this walkthrough is &lt;strong&gt;Kettle Street Noodles&lt;/strong&gt;. The test customer has two tonkotsu ramen and a miso soup booked for delivery on Friday between 6:30 and 7:00pm: $39.49 with delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: the agent finds out how the company works with agents
&lt;/h2&gt;

&lt;p&gt;Every company that supports the protocol publishes a small file at &lt;code&gt;/.well-known/poppy.json&lt;/code&gt;. It's the company's front door for agents. Here's Kettle Street Noodles' file, shortened:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocol_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kettle Street Noodles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"food.papsandbox.com"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"direct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"poppy:read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy:write"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"poppy:read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy:write"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mediated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/sign-in"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/openapi.json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"protocols"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/conversations"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"web"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"browser_session_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/browser-session"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://food.papsandbox.com/poppy/operations"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who the company is and where its sign-in server lives&lt;/li&gt;
&lt;li&gt;the three ways a customer can sign in&lt;/li&gt;
&lt;li&gt;what the agent may ask for: &lt;code&gt;poppy:read&lt;/code&gt; to see the account, &lt;code&gt;poppy:write&lt;/code&gt; to change things&lt;/li&gt;
&lt;li&gt;the routes the agent can use: the company's APIs, its own AI agent, and its website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before it trusts any of that, the agent checks the file. PAP Playground ran 11 checks, each tied to a section of the draft. For example, it checks that the domain in the file matches the site it came from, and that the sign-in server really belongs to the company.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pbimw9aisra4d0mpjir.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pbimw9aisra4d0mpjir.webp" alt="PAP Playground's discovery card for Kettle Street Noodles: 11 checks passed, each with the section of the draft it comes from, and what the company offers: direct, device and mediated sign-in, and an OpenAPI API" width="686" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If any of these checks failed, the agent would stop here. You can run the same checks on any domain with &lt;a href="https://papchecker.com" rel="noopener noreferrer"&gt;PAP Checker&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: the agent starts as a guest, then needs the person
&lt;/h2&gt;

&lt;p&gt;Next the agent opens a &lt;strong&gt;session&lt;/strong&gt;. In the protocol, a session is one person's visit to one company through one agent, whether the agent uses the API, the website or the company's own agent. Every session starts signed out. The company knows which agent is calling, but not who the customer is.&lt;/p&gt;

&lt;p&gt;That's enough to browse, and the agent did: it searched the menu for gyoza and looked up the delivery slots. Then it tried to read the customer's orders, and the company said no: &lt;code&gt;403 sign_in_required&lt;/code&gt;. That isn't a failure. It's the protocol doing its job, because orders belong to an account and the person hasn't signed in yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzjqrlfgjl3jrrk6cy8fw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzjqrlfgjl3jrrk6cy8fw.webp" alt="A PAP Playground run at Kettle Street Noodles: the task, the agent's first calls, a sign-in required response in red in the trace, and a card asking the person to sign in, with three ways to do it" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent pauses and asks the person to sign in. The right-hand side is the trace: every call the agent made, in order, with the section of the draft it belongs to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: the person signs in on the company's own page
&lt;/h2&gt;

&lt;p&gt;This is the step that matters most for trust. The person signs in &lt;strong&gt;on the company's page, not the agent's&lt;/strong&gt;, and the agent never sees a password. The protocol offers three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On the company's page&lt;/strong&gt; (direct). The agent opens the company's sign-in page. You sign in there, the company sends the agent a one-time code, and the agent swaps it for its own access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With a code on another device&lt;/strong&gt; (device). The agent shows a short code, and you enter it on the company's site on your phone or laptop. This suits agents you talk to by voice or text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inside the agent&lt;/strong&gt; (mediated). You sign in through a form the company defines, shown by the agent. The company decides whether to offer this at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's Kettle Street Noodles' page. It says which agent is asking, and lets the person choose what it may do:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F399pmktaq7hcd73xu8ny.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F399pmktaq7hcd73xu8ny.webp" alt="Kettle Street Noodles' own sign-in page: PAP Playground wants to use your Kettle Street Noodles account, with two permissions to choose from, See your account and Make changes, and Approve and Decline buttons" width="560" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"See your account" is &lt;code&gt;poppy:read&lt;/code&gt;, and "Make changes" is &lt;code&gt;poppy:write&lt;/code&gt;. The person can untick either one. Even with "Make changes" ticked, the page says it plainly: &lt;em&gt;you still approve each change&lt;/em&gt;. This test restaurant has no passwords, so it signs in as the test customer. A real company would show its normal login here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if you sign in as someone else?&lt;/strong&gt; A session belongs to one account, for good. While making this walkthrough we signed an agent out, then tried to sign the same session in as a different test customer. The company refused: &lt;em&gt;"This Session was signed in to a different account, and a Session never switches accounts."&lt;/em&gt; The draft requires it (section 4.4), and it's a useful safeguard: an agent can't quietly carry one person's session over to another person's account. The right recovery is for the agent to start a fresh session and ask again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: the company proposes exact terms, and the person approves them
&lt;/h2&gt;

&lt;p&gt;Signed in, the agent read the order, picked the gyoza and asked the company to change the order. The company didn't change it. It sent back a &lt;strong&gt;proposal&lt;/strong&gt;: the exact terms of the change, with a deadline to confirm.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fel95u4o0jmakhy7dgz1v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fel95u4o0jmakhy7dgz1v.webp" alt="An approval card in PAP Playground: change order KS-IA25W3FH, move the delivery from Fri 16 Oct, 6:30 to 7:00pm to Sat 17 Oct, 6:30 to 7:00pm, add Pork Gyoza (6) at $8.00, new total $47.49, $8.00 more, with a confirm-by time and Approve these terms and Decline buttons" width="686" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This comes from the protocol's &lt;strong&gt;operations&lt;/strong&gt; extension, and it's the core of the safety model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The company writes the terms, not the agent.&lt;/strong&gt; Price, items, date and total come from the company's own system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The person approves those exact terms in their agent.&lt;/strong&gt; The draft says the agent must show the company's name and summary, and must take the person's answer through its own screen. A message from the company can never count as the person's "yes".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval covers one version only.&lt;/strong&gt; If the terms change (say, a different time slot), the company issues a new revision, and it needs a new approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proposals expire.&lt;/strong&gt; If nobody confirms by the deadline, nothing happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The draft also allows a &lt;strong&gt;standing permission&lt;/strong&gt; for small things the person agreed to in advance, such as "move my delivery if it costs nothing extra". A company can turn that off for any change it wants approved every time.&lt;/p&gt;

&lt;p&gt;The task never said which time on Saturday. The agent chose to keep the same evening slot. Because the terms spelled out "Sat 17 Oct, 6:30 to 7:00pm" before anything changed, the person could decline and ask for lunchtime instead. That's what approving the exact terms is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: the change is made, and both sides keep a record
&lt;/h2&gt;

&lt;p&gt;We approved. The agent confirmed, the company made the change and reported the result: Saturday 17 October, 6:30 to 7:00pm, gyoza added, $47.49.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi72u3jmuwjzr5iyq9yy3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi72u3jmuwjzr5iyq9yy3.webp" alt="The finished run: the agent's summary of the change, an outcome card from the company saying the order changed, new total $47.49, and the trace showing the propose, approve, confirm and outcome steps" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole task took &lt;strong&gt;3 model turns, 7,916 tokens and $0.007&lt;/strong&gt; with Gemini 3.6 Flash. The protocol calls themselves are fast: most took between 200 and 300 milliseconds.&lt;/p&gt;

&lt;p&gt;The company keeps its own record too. Here's the customer's account page at Kettle Street Noodles after the run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xz0piza1vs10m8a4zpw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xz0piza1vs10m8a4zpw.webp" alt="Kettle Street Noodles' account page: the changed order with two tonkotsu ramen, a miso soup, the added pork gyoza and delivery, a $47.49 total and Saturday 17 October delivery, and a Connected agents panel listing PAP Playground with poppy:read and poppy:write and a Disconnect link" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Connected agents&lt;/strong&gt; panel matters for any company thinking about this. The customer can see every agent with access to their account, what it may do, and disconnect it at any time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: your agent talks to the restaurant's agent
&lt;/h2&gt;

&lt;p&gt;Many companies already run an AI customer-service agent. Under the protocol, your agent can talk to theirs directly, in the same session, instead of opening a chat window built for people. We gave our agent a follow-up: &lt;em&gt;"Ask the restaurant's own agent whether the driver can leave the order with my building's concierge, and tell me what it says."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Our agent opened a conversation with Kettle Street Noodles' agent and asked. The restaurant's agent answered from the order itself: yes, the driver can leave it with the concierge, &lt;em&gt;"because the order does not contain alcohol."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl30p654b1tijamov8mjn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl30p654b1tijamov8mjn.webp" alt="PAP Playground: the follow-up question, the agent calling talk_to_company_agent, its summary of the answer, and in the trace the conversation response from the restaurant, a message with role company and sender agent saying the driver can leave the order with the concierge because it contains no alcohol" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The restaurant's record of the same moment shows what happened on its side:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyniickmfybqxl9acy58f.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyniickmfybqxl9acy58f.webp" alt="Kettle Street Noodles' activity log: Conversation started, Company Agent: my_orders, Company Agent replied, each tied to a section of the draft and marked pass, above the earlier outcome of the order change" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second line is the important one. To answer, the restaurant's agent looked up the customer's order itself, inside the same signed-in session and within the access the customer had given. Three rules keep this safe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every message is labelled.&lt;/strong&gt; It says whether the company's agent or a person wrote it, and whether it came from your agent or from you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A company message is never your approval.&lt;/strong&gt; If the restaurant's agent proposes a change in the conversation, it still arrives as terms your own agent must show you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A person is always an option.&lt;/strong&gt; Your agent can ask for a person at the company, and the conversation moves to their staff.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who the agent is
&lt;/h2&gt;

&lt;p&gt;Companies don't have to take an agent's word for who it is. Under the protocol, every agent has a public identity: a &lt;code&gt;client_id&lt;/code&gt; that is a web address for a short document about the agent, and a public key. The company fetches both and checks every request the agent signs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0wpuoe9gwbeo3j3d8kxk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0wpuoe9gwbeo3j3d8kxk.webp" alt="PAP Playground's agent identity page: its client_id URL, its signing key, how its keys are used, and its user IDs, which are random and different at each company" width="760" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two privacy details are built in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A different user ID at every company.&lt;/strong&gt; The ID an agent gives you is different at each one, so two companies can't use it to link you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokens that are useless if stolen.&lt;/strong&gt; Session tokens are short-lived and tied to a key the agent holds, so a copied token alone doesn't work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three routes in, one session
&lt;/h2&gt;

&lt;p&gt;This walkthrough used two of the three routes the protocol defines. All three count as the same session:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The API.&lt;/strong&gt; Kettle Street Noodles offers both a standard REST API (OpenAPI) and an MCP server, the format many AI agents already use. It's the fastest and most predictable route, and the agent used it for the order change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The company's own agent.&lt;/strong&gt; The agent used this route for the concierge question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The website.&lt;/strong&gt; The agent's own browser joins the signed-in session, so it can use pages built for people without ever typing your password.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A company doesn't need all three. One is enough to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for your company
&lt;/h2&gt;

&lt;p&gt;If you already run customer accounts with OAuth sign-in and have an API, most of the pieces exist. Supporting the protocol mainly means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Publish a &lt;code&gt;poppy.json&lt;/code&gt;.&lt;/strong&gt; It says how agents can work with you. The &lt;a href="https://papchecker.com/what-is-poppy-json" rel="noopener noreferrer"&gt;guide&lt;/a&gt; explains every field, and the &lt;a href="https://papchecker.com/poppy-json-validator" rel="noopener noreferrer"&gt;validator&lt;/a&gt; checks a draft before you publish it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show a clear consent page.&lt;/strong&gt; Name the agent, and let customers choose read-only or change access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propose changes and don't just make them.&lt;/strong&gt; Return terms with a deadline and let the customer approve them. This is where the operations extension earns its place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let your AI agent take calls from personal agents.&lt;/strong&gt; If you already run one for customer service, it can answer them in the same session, with the same access rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show customers their connected agents.&lt;/strong&gt; Let them see and disconnect any agent, and decide what stays read-only: you set the ceiling, and the customer chooses within it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;See it run.&lt;/strong&gt; Give the agent a task at any of the three test companies in &lt;a href="https://papplayground.com" rel="noopener noreferrer"&gt;PAP Playground&lt;/a&gt;. The &lt;a href="https://papplayground.com/inspect" rel="noopener noreferrer"&gt;Inspector&lt;/a&gt; lets you send each call yourself, one step at a time, including messages to a company's agent, with no AI model on your side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build against a test company.&lt;/strong&gt; &lt;a href="https://papsandbox.com" rel="noopener noreferrer"&gt;PAP Sandbox&lt;/a&gt; is open to any agent that speaks the protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check a real company.&lt;/strong&gt; &lt;a href="https://papchecker.com" rel="noopener noreferrer"&gt;PAP Checker&lt;/a&gt; reads any domain's &lt;code&gt;poppy.json&lt;/code&gt; against draft 0.1, and the &lt;a href="https://papchecker.com/sites" rel="noopener noreferrer"&gt;sites list&lt;/a&gt; shows who already publishes one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's still open
&lt;/h2&gt;

&lt;p&gt;Version 0.1 is a draft, and the authors say any part can change before a stable release. The &lt;a href="https://personalagentprotocol.org/docs/path-to-1" rel="noopener noreferrer"&gt;Path to 1.0&lt;/a&gt; lists payments, push notifications and attachments as open topics. In this walkthrough nothing was charged: the change went to the card already on the order, and the test restaurant charges nothing. How an agent pays for something new is one of the things still being worked out.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the Personal Agent Protocol in simple terms?
&lt;/h3&gt;

&lt;p&gt;It's a draft open standard for how your AI agent works with a company for you. The company publishes a &lt;code&gt;poppy.json&lt;/code&gt; file saying how agents can work with it. You sign in on the company's own page and choose what the agent may do, and the agent works through the company's API, website or AI agent within that access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does my AI agent see my password?
&lt;/h3&gt;

&lt;p&gt;No. With direct and device sign-in you sign in on the company's own page, and the agent only receives its own access. With mediated sign-in you type your details into a form the agent shows, and the draft says the agent may send them only to the company's own sign-in address. After that it doesn't need them again. The company decides which ways it offers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a personal agent change an order without asking me?
&lt;/h3&gt;

&lt;p&gt;Not under the operations extension. The company sends exact terms, and the agent must get your approval for that version before confirming. The exception is a standing permission you gave in advance, which a company can refuse for any change it wants approved every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can my AI agent talk to a company's AI agent?
&lt;/h3&gt;

&lt;p&gt;Yes. If the company lists its own agent in &lt;code&gt;poppy.json&lt;/code&gt;, your agent can open a conversation with it in the same session. The company's agent can look things up within the access you gave, and propose changes, which still come back to you as terms to approve. Your agent can also ask for a person.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is poppy.json?
&lt;/h3&gt;

&lt;p&gt;A small JSON file a company publishes at &lt;code&gt;/.well-known/poppy.json&lt;/code&gt;. It tells personal agents who the company is, how customers sign in, what access an agent can ask for, and which routes it offers. See &lt;a href="https://papchecker.com/what-is-poppy-json" rel="noopener noreferrer"&gt;What is poppy.json?&lt;/a&gt; for every field.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Personal Agent Protocol the same as UCP?
&lt;/h3&gt;

&lt;p&gt;No. The &lt;a href="https://ucp.dev" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt; covers shopping: catalogues, carts and checkout. The Personal Agent Protocol covers the relationship between an agent and a company: who the agent acts for, signing in to the person's account, what it may see and change, and keeping one session across the API, the website and the company's own agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who created the Personal Agent Protocol?
&lt;/h3&gt;

&lt;p&gt;Sierra and Meta launched it on 6 October 2026 and published draft 0.1 on 9 October 2026. The &lt;a href="https://personalagentprotocol.org/docs/path-to-1#partners" rel="noopener noreferrer"&gt;Path to 1.0&lt;/a&gt; lists 35 design partners.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I test the Personal Agent Protocol without building anything?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;a href="https://papplayground.com" rel="noopener noreferrer"&gt;PAP Playground&lt;/a&gt; gives a ready-made agent a task at &lt;a href="https://papsandbox.com" rel="noopener noreferrer"&gt;PAP Sandbox&lt;/a&gt;'s test companies, and records every step. Both are free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Personal Agent Protocol, &lt;a href="https://personalagentprotocol.org/docs/spec" rel="noopener noreferrer"&gt;draft 0.1 specification&lt;/a&gt;, sections 3 (discovery), 4 (sessions and sign-in), 5 (websites), 6 (APIs) and 7 (conversations), 9 October 2026&lt;/li&gt;
&lt;li&gt;Personal Agent Protocol, &lt;a href="https://personalagentprotocol.org/docs/extensions/operations" rel="noopener noreferrer"&gt;Operations extension&lt;/a&gt;, sections 3 to 5&lt;/li&gt;
&lt;li&gt;Personal Agent Protocol, &lt;a href="https://personalagentprotocol.org/docs/path-to-1" rel="noopener noreferrer"&gt;Path to 1.0&lt;/a&gt;, 12 October 2026&lt;/li&gt;
&lt;li&gt;Sierra, &lt;a href="https://sierra.ai/blog/introducing-personal-agent-protocol" rel="noopener noreferrer"&gt;Introducing the Personal Agent Protocol&lt;/a&gt;, October 2026&lt;/li&gt;
&lt;li&gt;Walkthrough run on &lt;a href="https://papplayground.com" rel="noopener noreferrer"&gt;PAP Playground&lt;/a&gt; at Kettle Street Noodles on &lt;a href="https://papsandbox.com" rel="noopener noreferrer"&gt;PAP Sandbox&lt;/a&gt;, 15 October 2026&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Personal Agent Protocol is a draft at version 0.1 and may change. I maintain PAP Checker, PAP Playground and PAP Sandbox. They're independent and not affiliated with the protocol's authors. "Personal Agent Protocol" and "Poppy" are their names.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://papchecker.com/what-is-poppy-json" rel="noopener noreferrer"&gt;What is poppy.json?&lt;/a&gt; · &lt;a href="https://papchecker.com/blog/what-are-personal-ai-agents" rel="noopener noreferrer"&gt;What are personal AI agents?&lt;/a&gt; · &lt;a href="https://papchecker.com/blog/poppy-json-validator-before-you-publish" rel="noopener noreferrer"&gt;Check your poppy.json before you publish it&lt;/a&gt; · &lt;a href="https://papchecker.com/sites" rel="noopener noreferrer"&gt;Sites publishing poppy.json&lt;/a&gt;&lt;/p&gt;

</description>
      <category>personalagentprotocol</category>
      <category>ai</category>
      <category>agents</category>
      <category>oauth</category>
    </item>
    <item>
      <title>Building on the Personal Agent Protocol Before 1.0: What Changed on 12 October, and How to Send Feedback</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Tue, 13 Oct 2026 14:43:50 +0000</pubDate>
      <link>https://dev.to/benjifisher/building-on-the-personal-agent-protocol-before-10-what-changed-on-12-october-and-how-to-send-6ad</link>
      <guid>https://dev.to/benjifisher/building-on-the-personal-agent-protocol-before-10-what-changed-on-12-october-and-how-to-send-6ad</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Personal Agent Protocol&lt;/strong&gt; (PAP, nicknamed Poppy) site at &lt;a href="https://personalagentprotocol.org/docs/introduction" rel="noopener noreferrer"&gt;personalagentprotocol.org&lt;/a&gt; now says "Updated Oct 12, 2026". If you've built against draft 0.1, the short answer is that &lt;strong&gt;nothing you built needs to change&lt;/strong&gt;. The specification, the operations extension and the guides read the same as before, and the draft is still 0.1.&lt;/p&gt;

&lt;p&gt;What changed is everything around the spec: how the protocol gets to 1.0, how to send feedback, and who is involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A &lt;a href="https://personalagentprotocol.org/docs/path-to-1" rel="noopener noreferrer"&gt;Path to 1.0&lt;/a&gt; page.&lt;/strong&gt; Anyone can build against the draft. The authors are working through implementations with several design partners, and the spec will change based on what they learn. Until 1.0, a revision can break compatibility with earlier drafts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renamed pages.&lt;/strong&gt; "Overview" is now &lt;a href="https://personalagentprotocol.org/docs/introduction" rel="noopener noreferrer"&gt;Introduction&lt;/a&gt;, and "Open topics" is now a section of Path to 1.0. The old URLs redirect, but update your links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A public partner list.&lt;/strong&gt; Launch partners and design partners now sit in one list, grouped as personal agents (Instinct, Meta, OpenAI), companies and technology providers. No new names were added compared with the 9 October announcement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://personalagentprotocol.org/license/contributions" rel="noopener noreferrer"&gt;Contribution terms&lt;/a&gt;.&lt;/strong&gt; Code and spec contributions are under Apache 2.0. Read the feedback clause before you send anything (more on that below).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to give feedback
&lt;/h2&gt;

&lt;p&gt;There are two routes. Both end with an email to &lt;code&gt;feedback-personal-agent-protocol@sierra.ai&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inline comments.&lt;/strong&gt; Turn on site commenting, select any text in the docs to comment on it, then export your comments from the "…" menu next to Comments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent review.&lt;/strong&gt; Download the "agent kit" from the Path to 1.0 page. It contains all the docs and an &lt;code&gt;AGENTS.md&lt;/code&gt; that tells an agent how to write feedback in the form the authors want. Point your coding agent at it, review what it writes, and send it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The authors say they most want feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;privacy and security&lt;/strong&gt;: weaknesses in sign-in, sessions, tokens, permissions or how user data is handled;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gaps&lt;/strong&gt;: something you needed that the draft doesn't cover, or that doesn't work as written;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;simplification&lt;/strong&gt;: parts that could be simpler without losing what they make possible;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;extensions many implementations need&lt;/strong&gt;, "such as payments".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read this before you send anything.&lt;/strong&gt; Under the contribution terms, feedback you volunteer is licensed to "all other members and users of the protocol" on a "perpetual, irrevocable, nonexclusive, worldwide, royalty-free, sublicensable" basis, "without compensation". That's normal for a spec process. It means you shouldn't put anything in feedback that you want to keep for your own product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the draft still leaves out
&lt;/h2&gt;

&lt;p&gt;The three open topics haven't changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: how a personal agent pays "in a way that fits the protocol, including how that works with existing payment protocols";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications&lt;/strong&gt;: how a company reaches the agent when no request is open;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attachments&lt;/strong&gt;: receipts, return labels, images and forms in company messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agent needs to buy something today, the checkout still happens outside PAP. Some early adopters are already declaring payment details through their own extensions, and the authors list payments as an extension they'd welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is building against the draft
&lt;/h2&gt;

&lt;p&gt;Four days after draft 0.1, a handful of sites already serve a &lt;code&gt;/.well-known/poppy.json&lt;/code&gt;. On &lt;a href="https://papchecker.com/sites" rel="noopener noreferrer"&gt;PAP Checker's directory&lt;/a&gt; on 13 October, 10 sites publish one. Most are builders' demos and test benches, which is what you'd expect this early. Three are real businesses: &lt;strong&gt;Tilopay&lt;/strong&gt; (payments, Costa Rica), &lt;strong&gt;Emora Health&lt;/strong&gt; and &lt;strong&gt;Rent Our Bins&lt;/strong&gt;. Each is a first mover on a protocol that's four days old.&lt;/p&gt;

&lt;p&gt;None of the launch or design partners publish a &lt;code&gt;poppy.json&lt;/code&gt; yet. The authors say they're working through implementations with partners first, so expect the first big names to appear alongside the reference implementation Sierra says is coming "over the next month".&lt;/p&gt;

&lt;h2&gt;
  
  
  What to watch next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;a public repository and named maintainers;&lt;/li&gt;
&lt;li&gt;the reference implementation;&lt;/li&gt;
&lt;li&gt;a JSON Schema or conformance suite;&lt;/li&gt;
&lt;li&gt;the first launch or design partner to publish &lt;code&gt;poppy.json&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a payments extension, and how it relates to existing payment protocols.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I maintain &lt;a href="https://papchecker.com" rel="noopener noreferrer"&gt;PAP Checker&lt;/a&gt; and UCP Checker. PAP Checker is an independent community checker, not affiliated with the protocol's authors. The draft is 0.1 and can change before 1.0.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>oauth</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What Is poppy.json? A Personal Agent Protocol Example, and How to Validate Yours</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Sun, 11 Oct 2026 21:46:50 +0000</pubDate>
      <link>https://dev.to/benjifisher/what-is-poppyjson-a-personal-agent-protocol-example-and-how-to-validate-yours-3d5m</link>
      <guid>https://dev.to/benjifisher/what-is-poppyjson-a-personal-agent-protocol-example-and-how-to-validate-yours-3d5m</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Personal Agent Protocol&lt;/strong&gt; (PAP, nicknamed &lt;strong&gt;Poppy&lt;/strong&gt;) is a new open protocol, led by Sierra and Meta, for how a person's AI agent works with a company on their behalf: signing in as the user, using the company's APIs, joining a website session, or talking to the company's own agent. Draft 0.1 was published on 9 October 2026, with 35 design partners including OpenAI, Visa, Mastercard and PayPal.&lt;/p&gt;

&lt;p&gt;Everything a personal agent does with a company starts by reading one file: &lt;strong&gt;&lt;code&gt;/.well-known/poppy.json&lt;/code&gt;&lt;/strong&gt;. This post explains what that file is, shows a complete example, and covers the checks an agent makes before trusting it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not to be confused with the &lt;code&gt;poppy.json&lt;/code&gt; used by the Poppy robotics project (pypot). This one is the Personal Agent Protocol's discovery document.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where poppy.json lives
&lt;/h2&gt;

&lt;p&gt;At &lt;code&gt;https://{your-domain}/.well-known/poppy.json&lt;/code&gt;, served over HTTPS as JSON. It may redirect (for example to a provider that hosts it), but every redirect must stay on HTTPS, and the document still speaks for the domain the agent asked for.&lt;/p&gt;

&lt;h2&gt;
  
  
  A poppy.json example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocol_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://auth.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"direct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"poppy:read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy:write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"addresses"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"poppy:read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy:write"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"custom_scopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"addresses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Manage saved shipping addresses"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocols"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poppy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.example.com/poppy/conversations"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"web"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"browser_session_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/poppy/browser-session"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.example.com/openapi.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Orders, returns, and exchanges"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.example.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Product search and sizing"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is shortened from the example in the specification. A field-by-field version is on the &lt;a href="https://papchecker.com/what-is-poppy-json" rel="noopener noreferrer"&gt;What is poppy.json? guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each field means
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;What it says&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protocol_version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;The version the document follows, as &lt;code&gt;major.minor&lt;/code&gt;. Draft 0.1 is &lt;code&gt;"0.1"&lt;/code&gt;. Agents must not use a document whose major version they don't support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;organization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Display name and domain. The domain must match the host the agent requested (ignoring a leading &lt;code&gt;www.&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;apis&lt;/code&gt; or a browser session is listed&lt;/td&gt;
&lt;td&gt;The OAuth issuer and the sign-in types the company supports (&lt;code&gt;direct&lt;/code&gt;, &lt;code&gt;device&lt;/code&gt;, &lt;code&gt;mediated&lt;/code&gt;), each with the scopes it can grant. &lt;code&gt;custom_scopes&lt;/code&gt; describes anything beyond &lt;code&gt;poppy:read&lt;/code&gt; and &lt;code&gt;poppy:write&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One of &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;apis&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The company's own agent: its conversation protocols, each with a type and an HTTPS endpoint.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One of &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;apis&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;APIs the agent can call, each with a &lt;code&gt;type&lt;/code&gt; (&lt;code&gt;openapi&lt;/code&gt; or &lt;code&gt;mcp&lt;/code&gt;), a &lt;code&gt;url&lt;/code&gt; and a short &lt;code&gt;description&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One of &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;apis&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The website. The optional &lt;code&gt;browser_session_endpoint&lt;/code&gt; lets the agent's browser join its session, so pages apply the user's sign-in.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Extensions the company supports, keyed by name, each with a version. &lt;code&gt;operations&lt;/code&gt; is defined with the protocol; anyone else's start with a domain, such as &lt;code&gt;example.com/gift-wrap&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The check agents make on your sign-in server
&lt;/h2&gt;

&lt;p&gt;A valid-looking poppy.json isn't enough. Before using it, a personal agent fetches the OAuth server metadata of &lt;code&gt;auth.issuer&lt;/code&gt; (RFC 8414, at &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt;) and checks two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Its &lt;code&gt;issuer&lt;/code&gt; matches &lt;code&gt;auth.issuer&lt;/code&gt; exactly.&lt;/li&gt;
&lt;li&gt;Its &lt;strong&gt;&lt;code&gt;poppy_domains&lt;/code&gt;&lt;/strong&gt; lists your domain. This field isn't part of the OAuth standard; PAP adds it to the metadata so the sign-in server can say which domains it works for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without that second check, a fake site could publish a poppy.json naming your real sign-in server, and agents would send users there. The metadata must also publish a &lt;code&gt;token_endpoint&lt;/code&gt; and &lt;code&gt;revocation_endpoint&lt;/code&gt;, plus &lt;code&gt;authorization_endpoint&lt;/code&gt; for direct sign-in and &lt;code&gt;device_authorization_endpoint&lt;/code&gt; for device sign-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common poppy.json mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;organization.domain&lt;/code&gt; set to a parent brand or a different country domain.&lt;/strong&gt; Several domains can share one issuer, but each names itself and each must appear in &lt;code&gt;poppy_domains&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom scopes that start with &lt;code&gt;poppy:&lt;/code&gt;.&lt;/strong&gt; That prefix is reserved; only &lt;code&gt;poppy:read&lt;/code&gt; and &lt;code&gt;poppy:write&lt;/code&gt; are allowed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MCP server whose resource metadata doesn't list your issuer&lt;/strong&gt; in &lt;code&gt;authorization_servers&lt;/code&gt;, so MCP clients can't sign in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A storefront that answers every path with its HTML page.&lt;/strong&gt; Agents need JSON at the well-known URL, not a soft 404.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who publishes poppy.json today?
&lt;/h2&gt;

&lt;p&gt;Almost nobody, yet. On 11 October we checked the launch partners and design partners, including Shopify, Stripe, Walmart, Meta, Visa, Mastercard, PayPal, OpenAI and Cloudflare. None serve &lt;code&gt;/.well-known/poppy.json&lt;/code&gt; so far. The only live files are developer demos. That's expected three days after a draft. It also means the first company to publish a correct file will be easy to spot.&lt;/p&gt;

&lt;p&gt;The running list, with the day each domain was first seen, is at &lt;a href="https://papchecker.com/sites" rel="noopener noreferrer"&gt;papchecker.com/sites&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to validate your poppy.json
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://papchecker.com" rel="noopener noreferrer"&gt;PAP Checker&lt;/a&gt;&lt;/strong&gt; to check a domain against draft 0.1 from the outside, the same way a personal agent would. Enter a domain and it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetches &lt;code&gt;/.well-known/poppy.json&lt;/code&gt; and follows redirects, as an agent would;&lt;/li&gt;
&lt;li&gt;checks &lt;strong&gt;discovery&lt;/strong&gt; (&lt;code&gt;protocol_version&lt;/code&gt;, &lt;code&gt;organization&lt;/code&gt;, the domain match);&lt;/li&gt;
&lt;li&gt;fetches the issuer's OAuth metadata and checks &lt;strong&gt;sign-in&lt;/strong&gt; (&lt;code&gt;issuer&lt;/code&gt; match, &lt;code&gt;poppy_domains&lt;/code&gt;, the required endpoints for each sign-in type);&lt;/li&gt;
&lt;li&gt;checks &lt;strong&gt;scopes&lt;/strong&gt;, &lt;strong&gt;routes&lt;/strong&gt; (agent, APIs, website, all on HTTPS) and &lt;strong&gt;extensions&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;ties every result to the section of the specification it comes from.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It only reads public documents. It never signs in, starts a session, or calls your APIs. It's free and needs no sign-up.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://papchecker.com" rel="noopener noreferrer"&gt;Check your poppy.json at papchecker.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;Draft 0.1 can still change in ways that break existing files, and Sierra has said a reference implementation is coming. The checker follows the published draft and will move with it. If you find a rule it gets wrong, tell me in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I maintain PAP Checker and &lt;a href="https://ucpchecker.com" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;, which does the same job for the Universal Commerce Protocol. PAP Checker isn't affiliated with the protocol's authors.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>oauth</category>
      <category>agents</category>
    </item>
    <item>
      <title>Is My Store WebMCP and UCP Ready? What Agent Checkout Actually Needs</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:41:34 +0000</pubDate>
      <link>https://dev.to/benjifisher/is-my-store-webmcp-and-ucp-ready-what-agent-checkout-actually-needs-48pk</link>
      <guid>https://dev.to/benjifisher/is-my-store-webmcp-and-ucp-ready-what-agent-checkout-actually-needs-48pk</guid>
      <description>&lt;p&gt;The short answer: WebMCP is the part of agent commerce your customers' browser will handle — and &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;UCP is the part that actually completes the sale&lt;/a&gt;. If you want to know whether your store is ready for the agents arriving through both, &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;enter your domain here&lt;/a&gt;. It checks the commerce layer — the half that decides whether an agent can finish a checkout, not just start one.&lt;/p&gt;

&lt;p&gt;The longer answer — what "WebMCP and UCP ready" actually means for a store, how the two fit together, and what to do about it — is what this post covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "WebMCP-ready" actually means
&lt;/h2&gt;

&lt;p&gt;WebMCP (the Web Model Context Protocol) is a &lt;a href="https://webmachinelearning.github.io/webmcp/" rel="noopener noreferrer"&gt;W3C Community Group draft&lt;/a&gt; from Google and Microsoft engineers that landed in February 2026 and shipped as an early preview in Chrome 146. It adds a browser-native API — &lt;code&gt;navigator.modelContext&lt;/code&gt; — that lets a web page hand an in-browser AI agent a set of structured, callable tools instead of forcing it to scrape the DOM.&lt;/p&gt;

&lt;p&gt;In plain commerce terms: your search box, your filter panel, your add-to-cart button, and your checkout form stop being pixels an agent has to guess at, and become named tools the agent can call directly. There are two ways to expose them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Declarative&lt;/strong&gt; — add &lt;code&gt;toolname&lt;/code&gt; and &lt;code&gt;tooldescription&lt;/code&gt; attributes to the HTML forms you already have. A search form becomes a &lt;code&gt;search_products&lt;/code&gt; tool with almost no code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imperative&lt;/strong&gt; — register tools in JavaScript for the dynamic flows that aren't simple forms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crucially, WebMCP tools run inside the user's own authenticated browser session, with human-in-the-loop approval. The agent acts as the shopper, on the shopper's machine, with the shopper's login.&lt;/p&gt;

&lt;p&gt;So "is my store WebMCP-ready?" is really two questions, and most merchants only think about the first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can an agent operate my page?&lt;/strong&gt; (WebMCP — client side, in the browser)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can an agent actually transact with my store?&lt;/strong&gt; (UCP — server side, the commerce backend)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  WebMCP exposes the tools. UCP closes the sale.
&lt;/h2&gt;

&lt;p&gt;This is the part that gets lost in the WebMCP hype. WebMCP is a &lt;em&gt;transport for intent&lt;/em&gt; — it lets the agent say "add this variant, apply this code, check out." It does not define what a product, a cart, a payment handler, or an order confirmation &lt;em&gt;is&lt;/em&gt;. That's UCP's job.&lt;/p&gt;

&lt;p&gt;The clearest way to see it: WebMCP can hand an agent a &lt;code&gt;checkout&lt;/code&gt; tool, but if the agent calls it and your store can't return a structured cart, can't accept a delegated payment token, and can't confirm the order in a machine-readable way, the tool call fails. The agent had the button. The store couldn't honour the press.&lt;/p&gt;

&lt;p&gt;The emerging consensus — including from people building this at the platform level — is that agent-ready commerce is a stack, not a single switch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured data&lt;/strong&gt; so the agent understands your catalog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebMCP&lt;/strong&gt; so the agent can act on the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;UCP&lt;/a&gt;&lt;/strong&gt; so the action becomes a real, completed purchase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebMCP makes your store &lt;em&gt;operable&lt;/em&gt;. UCP makes it &lt;em&gt;transactable&lt;/em&gt;. A store that's WebMCP-ready but not UCP-ready is a storefront with working buttons and no cash register.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for Shopify (and everyone downstream of it)
&lt;/h2&gt;

&lt;p&gt;If you're on Shopify, most of the UCP layer is being handled for you — Shopify has been &lt;a href="https://ucpchecker.com/blog/shopify-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;building UCP into the platform&lt;/a&gt; and &lt;a href="https://ucpchecker.com/blog/shopify-ucp-cli-explained" rel="noopener noreferrer"&gt;shipped its own UCP CLI&lt;/a&gt;. That's the half WebMCP doesn't cover, already moving. The open question for a Shopify merchant isn't "will I get a manifest" — it's "is my specific store's manifest valid, complete, and not silently broken by a theme or app change."&lt;/p&gt;

&lt;p&gt;For WooCommerce, BigCommerce, and Magento merchants, more of that backend is on you. WebMCP support will arrive through the browser regardless of your platform — but the UCP layer that turns an agent's checkout tool-call into an order is the part you have to get right yourself. Our &lt;a href="https://ucpchecker.com/blog/agentic-commerce-optimization-ucp-readiness-data" rel="noopener noreferrer"&gt;platform monitoring data&lt;/a&gt; shows that's exactly where most stores fall down.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check the half that counts today
&lt;/h2&gt;

&lt;p&gt;WebMCP is still a Chrome-preview standard, and the page-side tooling is shifting week to week. The commerce layer underneath it, though, is live right now — and that's checkable in about a second.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Run the checker
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;UCPChecker.com/check&lt;/a&gt; and enter your domain. It will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch &lt;code&gt;/.well-known/ucp&lt;/code&gt; from your store&lt;/li&gt;
&lt;li&gt;Validate the manifest against the &lt;a href="https://ucpchecker.com/blog/ucp-v2026-04-08-spec-update" rel="noopener noreferrer"&gt;current spec&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Inventory your declared &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;capabilities&lt;/a&gt;, &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;transports&lt;/a&gt;, and &lt;a href="https://ucpchecker.com/payment-handlers" rel="noopener noreferrer"&gt;payment handlers&lt;/a&gt; — the exact primitives a WebMCP &lt;code&gt;checkout&lt;/code&gt; tool needs on the backend&lt;/li&gt;
&lt;li&gt;Report every error and warning with specific codes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your store can't complete an agent checkout, the failure almost always lives in one of those primitives — not in the page-side tooling everyone's talking about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Read the result
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt; — your commerce backend is valid and an agent that reaches your checkout tool can actually transact. Check the warnings for depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invalid&lt;/strong&gt; — the manifest exists but fails validation. Most invalid stores are one fix away — usually a &lt;a href="https://ucpchecker.com/blog/common-ucp-errors" rel="noopener noreferrer"&gt;missing required field&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not Detected&lt;/strong&gt; — no manifest. Your store is WebMCP-operable at best and un-transactable at worst. See the &lt;a href="https://ucpchecker.com/blog/ucp-requirements" rel="noopener noreferrer"&gt;requirements&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blocked&lt;/strong&gt; — a robots.txt or firewall rule is hiding the manifest from agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Test with real agents
&lt;/h3&gt;

&lt;p&gt;Validation proves your manifest is correct. It can't prove an agent can complete a purchase end to end — for that you need &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=webmcp" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;, which runs real agent sessions against your store and shows you exactly where the flow breaks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Monitor
&lt;/h3&gt;

&lt;p&gt;Your manifest is a live API. Theme updates, app installs, and CDN changes break it silently. &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; emails you the moment your status changes — before an agent's checkout tool call fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  A WebMCP-readiness checklist for the page side
&lt;/h2&gt;

&lt;p&gt;Client-side scanners now exist — Chrome extensions that score your &lt;em&gt;page&lt;/em&gt; on tool detection, coverage, schema quality, and declarative-form setup. They're useful, and they answer the first of our two questions. What none of them check is whether a completed tool call can actually clear a purchase. So pair the page-side scan with this backend list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;toolname&lt;/code&gt; / &lt;code&gt;tooldescription&lt;/code&gt; to your search, filter, and add-to-cart forms.&lt;/li&gt;
&lt;li&gt;Name tools for &lt;em&gt;intent&lt;/em&gt;, not for your UI ("find_products", not "header_search").&lt;/li&gt;
&lt;li&gt;Keep a real human-approval step on anything that spends money.&lt;/li&gt;
&lt;li&gt;Test in Chrome 146+ with the Model Context Tool Inspector.&lt;/li&gt;
&lt;li&gt;Make sure every tool that ends in a purchase has a working &lt;strong&gt;UCP&lt;/strong&gt; path behind it — or the tool is a dead end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the whole argument: the page-side checklist is short and shipping. The backend it depends on is where readiness is actually won or lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next: WebMCP as a UCP transport
&lt;/h2&gt;

&lt;p&gt;The line between "operate" and "transact" may not stay fixed. In its &lt;a href="https://github.com/Universal-Commerce-Protocol/meeting-minutes/blob/main/tc/2026/2026-05-08.md" rel="noopener noreferrer"&gt;2026-05-08 session&lt;/a&gt;, the UCP Technical Council reviewed a proposal to use WebMCP as a UCP &lt;em&gt;transport&lt;/em&gt; — letting an agent drive visible page state through WebMCP tools instead of firing disparate backend API calls. The appeal is real: the shopper watches the cart fill and the checkout advance in their own browser, in real time.&lt;/p&gt;

&lt;p&gt;The council didn't approve it on the spot, and the reason is the most interesting part for merchants: &lt;strong&gt;UI synchronization&lt;/strong&gt;. If an agent's backend call updates the order, the storefront has to emit the matching events so the visible interface reflects the new state at the same moment — otherwise the agent and the page drift apart. A dedicated deep dive was scheduled to work through that architecture.&lt;/p&gt;

&lt;p&gt;It's worth watching, because if WebMCP becomes a sanctioned UCP transport, the two halves of "ready" start to converge. But the dependency direction doesn't change: WebMCP would be &lt;em&gt;how&lt;/em&gt; the agent talks to your store; UCP is still &lt;em&gt;what&lt;/em&gt; it's saying. The backend has to be right either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters now
&lt;/h2&gt;

&lt;p&gt;WebMCP went from proposal to Chrome preview in a single quarter. Browser support across Chrome and Edge is expected by late 2026, and once an agent can operate any page in the user's own session, the bottleneck stops being &lt;em&gt;can the agent click&lt;/em&gt; and becomes &lt;em&gt;can the store transact&lt;/em&gt;. That second half is UCP, it's live today, and across the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;stores in our growing directory&lt;/a&gt; it's still where most checkouts would fail.&lt;/p&gt;

&lt;p&gt;Is my store WebMCP and UCP ready? The honest answer for most merchants is: the browser will make you operable for free — but only the commerce layer you control decides whether the sale actually closes. Check that half first.&lt;/p&gt;

&lt;h2&gt;
  
  
  About UCP Checker
&lt;/h2&gt;

&lt;p&gt;UCP Checker is the independent validation and monitoring layer for the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;. We crawl, validate and grade every public UCP manifest we can find — across &lt;a href="https://ucpchecker.com/platforms/shopify" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/woocommerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/bigcommerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/magento" rel="noopener noreferrer"&gt;Magento&lt;/a&gt; and beyond — and run the cross-platform &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;merchant directory&lt;/a&gt;, the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; and live &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;adoption stats&lt;/a&gt;. As WebMCP moves from preview to production, we track the commerce layer underneath it as it ships.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grade it (UCP Score):&lt;/strong&gt; &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See cart, checkout &amp;amp; payment coverage:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;ucpchecker.com/capabilities&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get notified when your status changes:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;ucpchecker.com/alerts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebMCP will give every store a front door for agents. We measure whether the checkout behind it actually works.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Merchant and capability figures are live from the UCP Checker index and update every 24 hours; see the &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;Check your store now →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Understand the protocol stack: &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;MCP vs UCP vs AP2&lt;/a&gt;. Platform-specific setup: &lt;a href="https://ucpchecker.com/blog/shopify-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt; · &lt;a href="https://ucpchecker.com/blog/woocommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt; · &lt;a href="https://ucpchecker.com/blog/bigcommerce-ucp-guide-ai-agent-commerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;. Monthly ecosystem data: &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-may-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>KYC, KYB, KYA: The Identity Stack for Agentic Commerce</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Sat, 11 Jul 2026 09:28:23 +0000</pubDate>
      <link>https://dev.to/benjifisher/kyc-kyb-kya-the-identity-stack-for-agentic-commerce-574g</link>
      <guid>https://dev.to/benjifisher/kyc-kyb-kya-the-identity-stack-for-agentic-commerce-574g</guid>
      <description>&lt;p&gt;If you're shipping anything agentic in 2026 — an AI shopping agent, an autonomous procurement bot, a customer-service agent that can issue refunds — you're going to keep hearing the same three letters in compliance reviews: &lt;strong&gt;KYA&lt;/strong&gt;. Know Your Agent.&lt;/p&gt;

&lt;p&gt;It's framed as a new acronym, but the pattern is forty years old. Banking invented Know Your Customer to comply with anti-money-laundering law. Then the same pattern was bolted onto businesses (KYB), and now — because software agents can move money, place orders, and bind their operators to contracts — onto agents themselves.&lt;/p&gt;

&lt;p&gt;Here's the framing we keep coming back to when developers ask us how all this stuff fits together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KYC, KYB, and KYA aren't a comparison. They're a lineage. Each one applies the same risk-management primitive — verify identity, assess risk, apply controls, keep evidence — to a new class of actor as that actor becomes powerful enough to matter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents are the new class. This post walks the lineage, explains what KYA actually proposes, and shows where it sits relative to &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;UCP&lt;/a&gt; — because the two get conflated constantly and they're doing genuinely different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lineage, in one diagram
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────┐
│                                              │
│   KYA   ← Know Your Agent                    │
│         (a software actor with its own       │
│          identity, reputation, audit trail)  │
│                                              │
├──────────────────────────────────────────────┤
│                                              │
│   KYB   ← Know Your Business                 │
│         (a corporate entity —                │
│          UBOs, sanctions, controllers,       │
│          source of funds)                    │
│                                              │
├──────────────────────────────────────────────┤
│                                              │
│   KYC   ← Know Your Customer                 │
│         (a verified human —                  │
│          government ID, address,             │
│          source of funds, sanctions)         │
│                                              │
└──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it bottom-up. KYC verifies humans, KYB verifies the companies they hide behind, and KYA verifies the software agents now transacting on behalf of both. (There's also KYE — Know Your Employee — the internal-HR variant for humans inside regulated companies; it's the same primitive applied to another actor class, but it's a stitched-together HR/IAM/GRC discipline rather than a discrete vendor category, so we'll mostly leave it aside here.)&lt;/p&gt;

&lt;p&gt;That's the whole shape. Now the detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  KYC — Know Your Customer
&lt;/h2&gt;

&lt;p&gt;The original. Born out of US anti-money-laundering legislation (the &lt;a href="https://www.fincen.gov/resources/statutes-regulations/bank-secrecy-act" rel="noopener noreferrer"&gt;Bank Secrecy Act&lt;/a&gt;, expanded by the &lt;a href="https://www.fincen.gov/resources/statutes-regulations/usa-patriot-act" rel="noopener noreferrer"&gt;USA PATRIOT Act&lt;/a&gt;) and replicated globally through &lt;a href="https://www.fatf-gafi.org/en/topics/fatf-recommendations.html" rel="noopener noreferrer"&gt;FATF guidance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;KYC answers: &lt;em&gt;is this person who they claim to be, and are they allowed to transact?&lt;/em&gt; Verification means government-issued ID, proof of address, source of funds for larger transactions, and ongoing screening against sanctions and politically-exposed-persons lists.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;mandatory&lt;/strong&gt; for regulated financial services and most account-opening flows. Failure to do it properly costs banks billions in fines every year. The KYC vendor market — Onfido, Persona, Jumio, Trulioo, Veriff and others — exists because KYC is law, not best practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  KYB — Know Your Business
&lt;/h2&gt;

&lt;p&gt;The corporate extension. When a bank onboards a business account, or one regulated entity onboards another (a payment processor onboarding a merchant, a fintech onboarding a SaaS company), KYC isn't enough. You need to verify the entity itself.&lt;/p&gt;

&lt;p&gt;KYB answers: &lt;em&gt;does this company actually exist, who controls it, what does it do, is it sanctioned?&lt;/em&gt; Verification means company registry lookup, beneficial owner identification (UBOs — the humans behind the legal entity), industry classification, sanctions screening of both the entity and its controllers.&lt;/p&gt;

&lt;p&gt;KYB is where things get expensive and fragmented — beneficial-owner data quality varies wildly by jurisdiction, and ultimate ownership often runs through three or four shell layers before you hit a human. Most KYB vendors layer KYC on top: verify the entity, then verify the humans who control it.&lt;/p&gt;

&lt;h2&gt;
  
  
  KYA — Know Your Agent
&lt;/h2&gt;

&lt;p&gt;The new entry. The term consolidated around 2024–2025 as AI agents started showing up in transactional flows — placing orders, authorizing payments, filing tickets, binding their operators to commitments. Some vendors brand it KYAI; some just say "agent identity." KYA has won as the shorthand.&lt;/p&gt;

&lt;p&gt;The crucial conceptual move, and the one that breaks everything that came before: &lt;strong&gt;agents need their own identity, not borrowed user credentials&lt;/strong&gt;. An agent acting on behalf of a user isn't the user. It's a separate actor with its own developer, its own version, its own behavioural history, and — once it's been in production for a while — its own reputation.&lt;/p&gt;

&lt;p&gt;Eric Broda's framing in the Agentic Mesh writeups puts it cleanly: KYA applies the same primitive as KYC and KYB — verify identity, assess risk, apply controls, keep evidence — to software agents that can take real actions inside business workflows. The Trulioo + PayOS reference model ("Digital Agent Passport") proposes five concrete steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify the agent developer.&lt;/strong&gt; A real business behind it, KYB-style.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock the agent code.&lt;/strong&gt; Only approved code can run under that identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture user permission.&lt;/strong&gt; Proof of consent from whichever human is being represented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue a passport.&lt;/strong&gt; A tamper-proof credential the agent can present at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous lookup.&lt;/strong&gt; Revocation and behaviour monitoring in real time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vouched's variant (via Model Context Protocol – Identity, or MCP-I) adds reputation tracking and decentralised identifiers. Skyfire's version is a JWT-style agent credential — and their recent partnership with F5 makes the immediate commercial wedge clear: bot-management systems need a way to distinguish legitimate, revenue-generating agent traffic from malicious automation. &lt;em&gt;"Don't block my AI shopping agent the way you'd block a scraper"&lt;/em&gt; is becoming the fastest commercial argument for KYA in the field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agents broke the existing identity stack
&lt;/h2&gt;

&lt;p&gt;The natural objection: &lt;em&gt;can't an agent just use the human's OAuth token? We already have identity for the user — pass it down.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three reasons that doesn't work, and they're the same three reasons KYA exists as a category at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Reputation belongs to the agent, not the user.&lt;/strong&gt; If an agent built by Vendor X starts misbehaving across the ecosystem — abandoning carts, creating chargebacks, abusing returns — that signal needs to attach to the agent, not to every consumer who happens to use it. You &lt;em&gt;could&lt;/em&gt; track reputation on &lt;code&gt;(user_id, agent_id)&lt;/code&gt; pairs riding on borrowed user credentials, but it conflates two distinct accountability surfaces and misaligns liability. Agent-native identity keeps the two layers clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Revocation is per-agent, not per-user.&lt;/strong&gt; When a vulnerability is found in a specific agent version, the response is "stop trusting this agent version everywhere, immediately" — not "log every user out." That needs a credential the issuer can revoke without nuking the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Audit trails need to attribute correctly.&lt;/strong&gt; Regulators (and any sensible internal compliance function) will want to know which agent took which action. Did the user click the buy button, or did the agent autonomously decide to? OAuth alone collapses that distinction; KYA preserves it.&lt;/p&gt;

&lt;p&gt;This is the philosophical wedge between KYA and "just bolt OAuth onto an agent." OAuth gives an agent the user's permission. KYA gives the agent its own accountable identity.&lt;/p&gt;

&lt;p&gt;And there's a fourth reason that's about to matter more than the other three: &lt;strong&gt;regulators are arriving&lt;/strong&gt;. KYC and KYB didn't become standard practice because banks volunteered them — they became standard because the Bank Secrecy Act, the USA PATRIOT Act, FATF guidance and successive AML directives across the EU made them mandatory. KYA is on the same trajectory. The &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj" rel="noopener noreferrer"&gt;EU AI Act&lt;/a&gt; already imposes obligations on operators of "high-risk" AI systems, including identification, logging and human-oversight requirements that map cleanly onto KYA primitives. Successive US executive orders on AI have pushed in the same direction, and FATF's emerging work on AI-driven financial flows is the next shoe to drop. The pattern with regulated identity has always been the same: voluntary best practice → industry standard → mandatory for regulated entities. KYA is mid-step-two right now, and the agents-touching-money use case is precisely where regulators tend to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The KYA landscape today
&lt;/h2&gt;

&lt;p&gt;The vendor map is still being drawn — most of the work is happening in 2025 and 2026, and the category boundary keeps shifting. Here's a neutral roundup of the players and what each is actually shipping.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trulioo + PayOS&lt;/strong&gt; are pushing the &lt;em&gt;Digital Agent Passport&lt;/em&gt; reference model — the five-step framework that's becoming the most-cited architectural definition of what a KYA system needs to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skyfire&lt;/strong&gt; is shipping the &lt;em&gt;KYA token&lt;/em&gt; — a JWT-style agent credential — and pursuing the immediate commercial wedge through partnerships with bot-management vendors (notably F5). The story: let legitimate agent traffic through, block the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vouched&lt;/strong&gt; is shipping &lt;em&gt;MCP-I&lt;/em&gt; (Model Context Protocol – Identity), extending &lt;a href="https://ucpchecker.com/transports" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; with identity primitives and adding reputation tracking and decentralised identifiers on top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove&lt;/strong&gt; has positioned &lt;em&gt;Verified Agent&lt;/em&gt; and &lt;em&gt;KYAPay&lt;/em&gt; as the payment-flavoured framing — explicitly listing it alongside ACP, AP2, and UCP as a peer trust layer in their AI-native commerce framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persona&lt;/strong&gt; is bringing its established dynamic-IDV stack into the agent context, leaning on the same orchestration engine that powers their human-verification flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few adjacent acronyms are circling the same conceptual space — Prove's &lt;em&gt;KYAPay&lt;/em&gt;, Vouched's &lt;em&gt;MCP-I&lt;/em&gt;, Skyfire's &lt;em&gt;KYA token&lt;/em&gt;. These are largely vendor brandings on the same underlying problem: how does a merchant decide whether to trust the software agent on the other end of the connection?&lt;/p&gt;

&lt;p&gt;And it's worth flagging the competitive frontier honestly. Visa's Intelligent Commerce protocol bakes KYA-style identity directly into the Visa network; Mastercard's Agent Pay does the same for its rails. Some vendors are pitching their identity layer as &lt;em&gt;the&lt;/em&gt; layer — not a layer on top of UCP, MCP, or AP2. So you'll hear both &lt;em&gt;composition&lt;/em&gt; rhetoric ("we work with UCP") and &lt;em&gt;substitution&lt;/em&gt; rhetoric ("our identity protocol replaces what UCP gestures at") in the same vendor decks. Worth knowing which one you're hearing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How KYA sits relative to UCP
&lt;/h2&gt;

&lt;p&gt;This is where developers building on UCP get tripped up, so it's worth spelling out carefully. &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;UCP&lt;/a&gt; already does some of what KYA does — and explicitly punts on the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What UCP already encodes.&lt;/strong&gt; Every UCP request carries a &lt;code&gt;UCP-Agent&lt;/code&gt; header pointing to a &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;&lt;code&gt;/.well-known/ucp&lt;/code&gt;&lt;/a&gt; profile. That profile publishes signing keys, so &lt;a href="https://datatracker.ietf.org/doc/rfc9421/" rel="noopener noreferrer"&gt;RFC 9421 HTTP Message Signatures&lt;/a&gt; can authenticate the platform cryptographically. The same profile serves as both capability declaration and key resolution — and verifiers must ensure the authenticated identity is consistent with the &lt;code&gt;UCP-Agent&lt;/code&gt; header. So at the transport layer, UCP gives you &lt;em&gt;"this request demonstrably came from the entity that controls profile X."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the cryptographic half of agent identity. Necessary, but not sufficient.&lt;/p&gt;

&lt;p&gt;UCP also defines an &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;Identity Linking capability&lt;/a&gt; via OAuth 2.0 — but that's user-to-merchant account linking (loyalty, wishlists, authenticated checkout), not agent attestation. And &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;AP2&lt;/a&gt; Mandates provide cryptographic proof of user consent specifically for the payment moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where KYA layers in.&lt;/strong&gt; UCP says nothing authoritative about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who &lt;em&gt;operates&lt;/em&gt; the entity behind a profile (the KYB-on-the-agent-owner question).&lt;/li&gt;
&lt;li&gt;Whether the agent's &lt;em&gt;code&lt;/em&gt; is what its operator claims it is.&lt;/li&gt;
&lt;li&gt;The agent's &lt;em&gt;behavioural reputation&lt;/em&gt; across merchants.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;verified-human-behind-the-session&lt;/em&gt; question, beyond an OAuth grant.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Revocation&lt;/em&gt; and continuous risk scoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the clean composition story is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP is the protocol. KYA is the trust overlay. UCP gets the bytes from agent to merchant with provable origin. KYA tells the merchant whether to trust that origin — who's behind it, whether the user is real, whether this agent has misbehaved elsewhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The two are complementary, and the leading KYA vendors are largely pitching that way. The substitution rhetoric — &lt;em&gt;"forget UCP, just use our identity protocol"&lt;/em&gt; — exists, but it tends to come from vendors whose protocols don't yet have the capability vocabulary UCP does. Compose the two; you get both halves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common questions
&lt;/h2&gt;

&lt;p&gt;These are the exact questions we see most often when developers and compliance teams start mapping their agent-identity work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between KYC and KYA?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;KYC verifies a human customer. KYA verifies a software agent. They operate at different layers and you increasingly need both.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;KYC is the mandatory regulatory floor for onboarding a human into a financial relationship — government ID, address, sanctions screening. KYA is the equivalent pattern applied to the software agent acting on that human's behalf — verifying the developer, locking the code, capturing user consent, issuing an agent credential, monitoring behaviour over time. If your AI shopping agent represents a verified KYC'd user, you've covered the human; KYA covers the &lt;em&gt;agent representing the human&lt;/em&gt;. Same regulatory logic, one abstraction level up.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between KYB and KYA?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;KYB verifies the company; KYA verifies the software the company built. KYA actually depends on KYB.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a KYA framework "verifies the agent developer," it's running KYB on that developer's company — checking registration, controllers, sanctions. So KYB is the foundation: you can't trust an agent's passport unless you trust the entity that issued it. KYA then adds the agent-specific layer on top: which code is running, which user authorised it, what's the agent's behavioural track record.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is AP2 a form of KYA?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AP2 is a narrow KYA primitive, not a KYA solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AP2 Mandates provide cryptographic proof that a specific user consented to a specific payment by a specific agent. That's one of the five things a full KYA framework does — the &lt;em&gt;capture user permission&lt;/em&gt; step. AP2 doesn't verify the agent developer, doesn't lock the code, doesn't track reputation, doesn't handle revocation. A merchant integrating AP2 has solved consent-for-payment; they haven't solved Know Your Agent. Most production stacks will end up running AP2 &lt;em&gt;inside&lt;/em&gt; a broader KYA framework, not instead of one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does UCP include KYA?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Partially. UCP provides cryptographic agent-identity proof at the transport layer — but not the operator verification, code attestation, or reputation tracking that complete KYA requires.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UCP's combination of &lt;code&gt;/.well-known/ucp&lt;/code&gt; profiles, published signing keys, and RFC 9421 HTTP Message Signatures gives you cryptographic confirmation that a request came from the entity controlling a given profile. That's necessary infrastructure for KYA but it's not the whole stack — you still need to verify &lt;em&gt;who that entity is&lt;/em&gt; (KYB), &lt;em&gt;what code it's running&lt;/em&gt; (attestation), and &lt;em&gt;whether you should trust its agent's behavioural history&lt;/em&gt; (reputation). UCP and KYA are designed to compose, not to substitute for each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you actually adopt
&lt;/h2&gt;

&lt;p&gt;Depends on what you're building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're an agent or tooling developer&lt;/strong&gt;, sign your requests properly — implement &lt;a href="https://datatracker.ietf.org/doc/rfc9421/" rel="noopener noreferrer"&gt;RFC 9421&lt;/a&gt; Message Signatures, publish keys via your UCP profile, and start integrating with one of the KYA vendors (Trulioo, Skyfire, Vouched, Prove, Persona) so your agent can present a verifiable passport when merchants ask for one. The merchants that ask first will be the high-AOV ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a merchant or platform&lt;/strong&gt;, your first move is a clean UCP profile that establishes cryptographic agent identity at the transport layer — that's what &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;a free check&lt;/a&gt; validates. Once that's in place, start tracking which KYA credentials the agents hitting your endpoint are presenting. You don't have to enforce KYA today, but you want visibility into what's coming through so you can move from passive logging to active policy when the standards mature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're in risk or compliance&lt;/strong&gt;, KYA is the bridge between your existing KYC/KYB programs and the new actor class your business is starting to transact with. Map your current KYC vendor's roadmap against KYA capabilities — Onfido, Trulioo, Persona, Jumio are all heading there, with very different positioning. Pick the vendor whose framing matches your buyer expectation: regulated-financial-services vendors will buy compliance-first language; commerce platforms will buy bot-management-first language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a payments company&lt;/strong&gt;, AP2 is your immediate technical lane and KYA is your strategic envelope. AP2 Mandates fit inside a broader KYA story, and the payment networks (Visa Intelligent Commerce, Mastercard Agent Pay) are already pulling KYA-style identity into their rails. The question is whether to follow their identity layer, build your own, or partner with one of the dedicated KYA vendors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-line summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KYC verifies humans, KYB verifies the companies they hide behind, and KYA verifies the software agents now acting on behalf of both. The lineage is the same risk-management primitive — verify, assess, control, evidence — applied to each new class of actor as it becomes powerful enough to matter. KYA is mid-trajectory toward mandatory for regulated entities; cryptographic agent identity at the transport layer is shippable today.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UCP gives you cryptographic agent identity at the transport layer; the KYA category sits on top of it, adding operator verification, code attestation, consent capture, credential issuance, and behavioural monitoring. Together they're the trust stack for agentic commerce. Apart, each one only solves half the problem.&lt;/p&gt;

&lt;p&gt;If you're getting started, the foundation is the same as every other piece of agent-readiness work: a valid, machine-readable UCP profile with proper signing keys.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your manifest:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse verified stores:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer guide to /.well-known/ucp:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/well-known-ucp" rel="noopener noreferrer"&gt;ucpchecker.com/well-known-ucp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related reading:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;MCP vs UCP vs AP2: What is the Difference?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related reading:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/blog/ucp-tc-ships-attribution-into-core" rel="noopener noreferrer"&gt;The UCP Technical Council Just Shipped Attribution into Core&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>ai</category>
      <category>data</category>
    </item>
    <item>
      <title>Introducing the UCP Playground Extension: An AI Shopping Agent in Your Side Panel</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 28 May 2026 10:01:33 +0000</pubDate>
      <link>https://dev.to/benjifisher/introducing-the-ucp-playground-extension-an-ai-shopping-agent-in-your-side-panel-4964</link>
      <guid>https://dev.to/benjifisher/introducing-the-ucp-playground-extension-an-ai-shopping-agent-in-your-side-panel-4964</guid>
      <description>&lt;p&gt;Our &lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;first extension&lt;/a&gt; answered one question while you browse: &lt;em&gt;is this store agent-ready?&lt;/em&gt; A green dot in your toolbar, fired by a single probe to &lt;code&gt;/.well-known/ucp&lt;/code&gt;. It quietly became our biggest discovery engine.&lt;/p&gt;

&lt;p&gt;Today we're shipping our second extension — and it answers the obvious follow-up: &lt;strong&gt;okay, so what actually happens when an agent shops here?&lt;/strong&gt; — without making you leave the page.&lt;/p&gt;

&lt;p&gt;Meet the &lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/ucp-playground-%E2%80%94-ai-shopp/hlblkioegnephlgkmgdlemlbkaimhdpp" rel="noopener noreferrer"&gt;UCP Playground — AI Shopping Agent&lt;/a&gt;&lt;/strong&gt; extension. Open Chrome's side panel on any UCP-enabled store, pick a model, and an AI agent shops it live — right beside the page. It searches, compares, builds a cart, and reaches checkout, driving the store through its &lt;em&gt;own published UCP tools&lt;/em&gt;. No screen-scraping, no separate tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/ucp-playground-%E2%80%94-ai-shopp/hlblkioegnephlgkmgdlemlbkaimhdpp" rel="noopener noreferrer"&gt;Install it free from the Chrome Web Store →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From a green dot to a live agent
&lt;/h2&gt;

&lt;p&gt;We've been building toward this in three steps.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;first extension&lt;/a&gt;&lt;/strong&gt; is passive detection: one HTTP request per domain, a badge that tells you whether a store speaks the protocol. &lt;strong&gt;&lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=playground-extension" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;&lt;/strong&gt; on the web is the runtime layer: it runs live agent shopping sessions against real stores and shows every JSON-RPC message flowing between agent and merchant — now across &lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;16 frontier models and dozens of real stores&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The gap was the hop between them. You'd spot a UCP store while browsing, then go to a separate site to watch an agent try it. We even teased closing that gap in the first extension's write-up — &lt;em&gt;"see the green dot, click Open in Playground, and you're watching Claude shop."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This extension closes it. Detection and action now live in the same tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A side panel, side by side.&lt;/strong&gt; Click the toolbar icon and Playground opens in Chrome's native side panel, next to the storefront. You see the human page and the agent's run at the same time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat with any UCP store.&lt;/strong&gt; Type what you'd ask a shop assistant — &lt;em&gt;"find a waterproof jacket under £100"&lt;/em&gt; — and the agent executes the store's UCP tools to answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The full tool-call timeline.&lt;/strong&gt; Every step is visible: search, product lookup, cart, checkout — with raw responses, timing, product cards, cart state, and the final checkout URL. It's the same observability the web Playground is known for, docked beside the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick your model.&lt;/strong&gt; Run any model exposed by your Playground account, so you can compare how different agents handle the same store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured, not scraped.&lt;/strong&gt; The extension drives the store through its &lt;a href="https://ucpchecker.com/blog/ucp-identity-linking-agentic-commerce" rel="noopener noreferrer"&gt;published MCP tools&lt;/a&gt; — the exact path a real agent takes — so what you see is the &lt;em&gt;protocol&lt;/em&gt; behaving, not a DOM hack that breaks on the next redesign.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8hd152ipyvnnttpcfpb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8hd152ipyvnnttpcfpb.webp" alt="The UCP Playground side panel running a full agent shopping flow on Everlane — product lookup, add-to-cart, and a generated checkout link, beside the live storefront" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The side panel drives the store's own UCP tools — get_product_details, update_cart, checkout — beside the page, with timing on every call.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a side panel
&lt;/h2&gt;

&lt;p&gt;Side-by-side is the whole point. When you can see the store's own page and the agent's tool calls together, the gaps jump out: a product the agent can't resolve, an option that doesn't map, a checkout that stalls where the website sails through.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;builders&lt;/strong&gt;, that's a debugging loop measured in seconds — validate product schemas, option resolution, and checkout flows against a live agent without wiring up anything. For &lt;strong&gt;merchants&lt;/strong&gt;, it's the first time you can &lt;em&gt;watch how an agent experiences your store&lt;/em&gt; the way a customer's assistant soon will — the same kind of run that produced &lt;a href="https://ucpchecker.com/blog/first-autonomous-ai-agent-purchase-ucp" rel="noopener noreferrer"&gt;the first fully autonomous UCP purchase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8l7e5vj9fbx40qjk69zp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8l7e5vj9fbx40qjk69zp.webp" alt="The side panel handling a multi-item request on Kylie Cosmetics — two search_catalog calls, product cards and shade selection, next to the storefront" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Multi-item search and option resolution on Kylie Cosmetics, side by side with the store.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;first extension&lt;/a&gt; was pure client-side: one &lt;code&gt;fetch()&lt;/code&gt; to &lt;code&gt;/.well-known/ucp&lt;/code&gt;, a badge, done. This one is a thin client in front of the &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=playground-extension" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; engine — your browser handles detection and display; the agent itself runs server-side. Four moving parts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Detection.&lt;/strong&gt; On navigation, the extension probes the current host's &lt;code&gt;/.well-known/ucp&lt;/code&gt; — the same one-request check the first extension uses, with the host permission scoped to that exact path. It only ever reads the &lt;em&gt;hostname&lt;/em&gt; to know where to look.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The side panel.&lt;/strong&gt; Clicking the toolbar icon opens Chrome's native side panel (&lt;code&gt;sidepanel.html&lt;/code&gt;) docked beside the page. The &lt;code&gt;tabs&lt;/code&gt; permission lets the panel follow you as you move between stores, so it always knows which store to target — without touching anything on the page itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The agent runs on the Headless API — not in your browser.&lt;/strong&gt; The extension doesn't run a model locally or scrape the DOM. It sends your message and the store's hostname to the &lt;strong&gt;UCP Playground Headless API&lt;/strong&gt;, authenticated with your personal access token. Playground orchestrates the chosen model and executes the store's &lt;em&gt;published MCP tools&lt;/em&gt; server-side — the same engine behind the web Playground and our &lt;a href="https://ucpchecker.com/blog/ucp-playground-evals" rel="noopener noreferrer"&gt;evals&lt;/a&gt; — then streams the session back to the panel. That's why setup needs a free account and a token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The timeline.&lt;/strong&gt; Every step renders in order — &lt;code&gt;search_catalog&lt;/code&gt;, &lt;code&gt;get_product_details&lt;/code&gt;, &lt;code&gt;update_cart&lt;/code&gt;, &lt;code&gt;complete_checkout&lt;/code&gt; — each with its raw response, latency, product cards, cart state, and the final checkout URL. The same observability the web Playground is known for, docked beside the storefront.&lt;/p&gt;

&lt;p&gt;Everything heavy — the model, the tool execution, the session record — lives in Playground. The extension is the lens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it reads — and what it doesn't
&lt;/h2&gt;

&lt;p&gt;The first extension made a point of its ultra-narrow permissions; we hold the same line here, with one honest difference — a side panel that follows you across stores needs &lt;code&gt;tabs&lt;/code&gt; to know which store you're on.&lt;/p&gt;

&lt;p&gt;Here's the full ledger: &lt;code&gt;storage&lt;/code&gt; (your token and settings), &lt;code&gt;activeTab&lt;/code&gt; + &lt;code&gt;tabs&lt;/code&gt; (the current store's hostname), &lt;code&gt;sidePanel&lt;/code&gt; (the panel itself), and host access scoped to &lt;code&gt;/.well-known/ucp&lt;/code&gt; plus &lt;code&gt;ucpplayground.com&lt;/code&gt;. What it never requests: content-script access to store pages, your cookies, your history, or &lt;code&gt;&amp;lt;all_urls&amp;gt;&lt;/code&gt;. It reads &lt;em&gt;which&lt;/em&gt; store you're looking at, not &lt;em&gt;what's on the page&lt;/em&gt; — and that hostname is the only thing about your browsing that ever leaves the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up in under a minute
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/ucp-playground-%E2%80%94-ai-shopp/hlblkioegnephlgkmgdlemlbkaimhdpp" rel="noopener noreferrer"&gt;Install from the Chrome Web Store&lt;/a&gt;&lt;/strong&gt; (Chrome, Edge, Brave — any Chromium browser).&lt;/li&gt;
&lt;li&gt;Create a free account at &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=playground-extension" rel="noopener noreferrer"&gt;ucpplayground.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Generate a personal access token in settings and paste it into the extension options.&lt;/li&gt;
&lt;li&gt;Browse. It auto-detects UCP-enabled stores; click the icon to open the side panel and start shopping.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where it fits in the stack
&lt;/h2&gt;

&lt;p&gt;Each of our tools answers a different question, and now they chain cleanly from your toolbar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detect&lt;/strong&gt; — the &lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;UCP Checker extension&lt;/a&gt;: is this store agent-ready?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt; — &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Checker&lt;/a&gt;: how agent-ready is it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act &amp;amp; observe&lt;/strong&gt; — &lt;em&gt;this&lt;/em&gt; extension + &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=playground-extension" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;: what happens when an agent actually shops it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor&lt;/strong&gt; — &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt;: did anything change?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first extension turned passive browsing into a discovery map. This one turns it into a test bench — point an agent at any store on the web and watch the protocol work, live, beside the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://chromewebstore.google.com/detail/ucp-playground-%E2%80%94-ai-shopp/hlblkioegnephlgkmgdlemlbkaimhdpp" rel="noopener noreferrer"&gt;UCP Playground — AI Shopping Agent&lt;/a&gt; — Chrome Web Store&lt;/li&gt;
&lt;li&gt;Our analysis — &lt;a href="https://ucpchecker.com/blog/how-a-browser-extension-became-our-biggest-discovery-engine" rel="noopener noreferrer"&gt;How a browser extension became our biggest discovery engine&lt;/a&gt; and &lt;a href="https://ucpchecker.com/blog/why-we-built-ucp-playground" rel="noopener noreferrer"&gt;Why we built UCP Playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;UCP Playground at 1,000+ agent sessions&lt;/a&gt; — what 16 models and real stores reveal&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About UCP Checker
&lt;/h2&gt;

&lt;p&gt;UCP Checker is the independent validation and monitoring layer for the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;. We crawl, validate and grade every public UCP manifest we can find, run the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;merchant directory&lt;/a&gt;, the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; and live &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;adoption stats&lt;/a&gt;, and — through &lt;a href="https://ucpplayground.com/?utm_source=ucpchecker&amp;amp;utm_medium=blog&amp;amp;utm_campaign=playground-extension" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; — test how real AI agents behave against real stores.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install the Playground extension:&lt;/strong&gt; &lt;a href="https://chromewebstore.google.com/detail/ucp-playground-%E2%80%94-ai-shopp/hlblkioegnephlgkmgdlemlbkaimhdpp" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grade it (UCP Score):&lt;/strong&gt; &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get notified on changes:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;ucpchecker.com/alerts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>product</category>
      <category>ucp</category>
    </item>
    <item>
      <title>Google Opened UCP for Lodging. We Already Tested What It Needs to Handle.</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Tue, 26 May 2026 09:39:24 +0000</pubDate>
      <link>https://dev.to/benjifisher/google-opened-ucp-for-lodging-we-already-tested-what-it-needs-to-handle-3m7b</link>
      <guid>https://dev.to/benjifisher/google-opened-ucp-for-lodging-we-already-tested-what-it-needs-to-handle-3m7b</guid>
      <description>&lt;p&gt;Google has opened the door to agentic hotel booking. A new developer page — &lt;a href="https://developers.google.com/hotels/ucp" rel="noopener noreferrer"&gt;UCP for Lodging&lt;/a&gt; — describes an open standard to "turn AI interactions into instant bookings for room reservations." But there is no spec to read yet: the page says plainly that detailed onboarding and specs are "coming soon," and points you to a waitlist rather than documentation. This is an announcement, not a release.&lt;/p&gt;

&lt;p&gt;That makes now the moment to write the piece nobody else has. We have already run five frontier models against expiring travel inventory and documented exactly where agents break when an offer times out mid-session. So instead of paraphrasing a waitlist, here is the prescriptive read: what UCP for Lodging will have to specify for agentic hotel booking to actually work — and what hotels should test before they integrate. Our bias throughout: &lt;strong&gt;we saw it in the data first.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Google actually published — and what it didn't
&lt;/h2&gt;

&lt;p&gt;The page is short on detail by design. UCP for Lodging is positioned as an open standard for "direct, instant reservations" that reduces "friction and abandonment," compatible with AP2, A2A and MCP. (New to how those layers fit together? &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;We break the stack down here&lt;/a&gt;.) Two things it does &lt;strong&gt;not&lt;/strong&gt; contain: a published spec, and any named partners. The only call to action is a "Join the waitlist" button.&lt;/p&gt;

&lt;p&gt;One organizational tell worth registering: the page lives at &lt;code&gt;/hotels/ucp&lt;/code&gt;, not &lt;code&gt;/merchant/ucp&lt;/code&gt; where the retail protocol sits. UCP for Lodging is being driven by Google's hotels team — the group behind hotel ads — not its general commerce team. Different stakeholders, different roadmap. The travel-distribution names from Google Marketing Live — Booking.com, Expedia, Hilton, Marriott, IHG, Accor, Choice Hotels, Trip.com, Wyndham and Amadeus — are the supply context, though none appear on this page.&lt;/p&gt;

&lt;p&gt;We covered the demand side switching on across Google's surfaces in &lt;a href="https://ucpchecker.com/blog/google-universal-cart-ucp" rel="noopener noreferrer"&gt;Google Universal Cart &amp;amp; UCP&lt;/a&gt;, and why travel is agentic commerce's hardest vertical in &lt;a href="https://ucpchecker.com/blog/agentic-ai-travel-ucp" rel="noopener noreferrer"&gt;our travel analysis&lt;/a&gt;. Lodging is the hardest case inside the hardest vertical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lodging is harder than retail — and harder than flights
&lt;/h2&gt;

&lt;p&gt;A retail SKU is a fixed thing with a fixed price. A hotel "offer" is generated on the fly from a property, a room type, a rate plan, a date range and an occupancy — wrapped in a pile of taxes and fees — and it changes by the second.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The offer is a combination, not a SKU.&lt;/strong&gt; Property × room type × rate plan × dates × guests produces a vast, dynamic offer space. There is no stable identifier to drop in a cart and trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length-of-stay pricing.&lt;/strong&gt; Three nights is not three times the nightly rate; pricing varies by date and stay length.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate-plan semantics.&lt;/strong&gt; Refundable vs non-refundable, prepaid vs pay-at-property, member rates, packages — each carries different money and different rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancellation and modification policies.&lt;/strong&gt; Free-cancel deadlines and penalty schedules are part of the offer, and getting servicing wrong has real financial stakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All-in price transparency.&lt;/strong&gt; Resort fees plus city and occupancy taxes mean the nightly rate an agent sees is not the price the guest pays. An agent quoting the wrong number is a broken booking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perishable availability.&lt;/strong&gt; Rooms sell out mid-session; an offer from thirty seconds ago may be gone or repriced.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we already know breaks: the data
&lt;/h2&gt;

&lt;p&gt;The perishable-availability and repricing problems are not hypothetical — we measured them. We built a mock travel server that issued offers with explicit expiry windows and ran &lt;a href="https://ucpchecker.com/blog/we-tested-5-ai-models-expiring-travel-inventory" rel="noopener noreferrer"&gt;five frontier models against it&lt;/a&gt;. Not one checked an offer's time-to-live before booking; only one survived a three-second expiry window; none surfaced a price change unless asked. The agents treated time-boxed travel inventory exactly like a static retail SKU.&lt;/p&gt;

&lt;p&gt;Apply that to lodging. An agent that does not re-validate will happily "confirm" a room that sold out two minutes ago, or quote a pre-tax nightly rate as the total. Those are not edge cases in hotel booking — they are the median path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What UCP for Lodging will need to specify
&lt;/h2&gt;

&lt;p&gt;From the gaps above, here is the shortlist the spec has to cover for agentic hotel booking to be safe. Concretely, a lodging offer needs to look more like this than a retail product:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"marriott-LHR-deluxe-king-20260704"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"room_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deluxe_king"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rate_plan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"non_refundable_prepaid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stay"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"check_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-04"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"nights"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"guests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;921.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"includes_taxes_fees"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"free_cancel_until"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ttl_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"revalidate_before_booking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;lodging offer object&lt;/strong&gt; carrying room type, rate plan, stay dates, occupancy and an &lt;strong&gt;all-in total&lt;/strong&gt; (taxes and fees included), with a &lt;strong&gt;TTL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine-readable cancellation and modification policy&lt;/strong&gt; — deadlines and penalties as structured data, not prose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandatory re-validation before booking&lt;/strong&gt; — confirm the room is still available at the quoted total before commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicing capabilities&lt;/strong&gt; for modify, cancel and no-show, with full request context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity, loyalty and payment timing&lt;/strong&gt; — member rates, loyalty numbers, deposits and pay-at-property.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A retail offer carries none of these. The lodging extension lives or dies on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What hotels should test before integrating
&lt;/h2&gt;

&lt;p&gt;You cannot test against a spec that is not published yet — but you can test the thing the spec will sit on top of: your booking engine and the agents that will drive it. Before you join the waitlist and integrate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does your offer carry a clock?&lt;/strong&gt; Confirm your booking engine can expose a time-boxed offer with a validity window. &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;Validate your endpoint →&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is your price all-in?&lt;/strong&gt; Make sure an agent can read the total with taxes and fees, not just the nightly rate. &lt;a href="https://ucpchecker.com/catalog-validator" rel="noopener noreferrer"&gt;Check your catalog →&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you re-validate before commit?&lt;/strong&gt; An agent must be able to confirm availability and price before it books.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are your cancellation policies machine-readable?&lt;/strong&gt; Deadlines and penalties an agent can parse, not a paragraph of terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are you fast enough?&lt;/strong&gt; Agents abandon after roughly two seconds; the verified retail median is 156ms. &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;How we measure →&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch an agent break.&lt;/strong&gt; Run a frontier model through your booking flow and see what it does when an offer expires mid-session — because &lt;a href="https://ucpchecker.com/blog/we-tested-5-ai-models-expiring-travel-inventory" rel="noopener noreferrer"&gt;our data says it will not check&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Two waves: now, and when the spec drops
&lt;/h2&gt;

&lt;p&gt;The spec is "coming soon," and the language suggests weeks, not months. This piece is the first wave — the prescriptive read from the announcement and the data. When the actual UCP for Lodging spec lands, we will publish the side-by-side: what we said it needed versus what Google shipped, with conformance checks against the first live lodging endpoints. If you want that the day it is ready, &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;set up alerts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're watching
&lt;/h2&gt;

&lt;p&gt;Whether the published spec models offers as time-boxed objects with all-in pricing; which waitlist partners ship a live endpoint first; whether cancellation and servicing make the first cut or get deferred; and — the one we will keep testing — whether agents stop being blind to time. We track the ecosystem monthly in &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-may-2026" rel="noopener noreferrer"&gt;the State of Agentic Commerce census&lt;/a&gt;, and we will report what the data shows, not what the page promises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google for Developers — &lt;a href="https://developers.google.com/hotels/ucp" rel="noopener noreferrer"&gt;UCP for Lodging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google blog — &lt;a href="https://blog.google/products-and-platforms/products/shopping/shopping-updates-google-marketing-live/" rel="noopener noreferrer"&gt;Shopping updates from Marketing Live&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Our analysis — &lt;a href="https://ucpchecker.com/blog/agentic-ai-travel-ucp" rel="noopener noreferrer"&gt;Agentic AI in Travel: Why UCP Isn't Travel-Ready Yet&lt;/a&gt; and &lt;a href="https://ucpchecker.com/blog/google-universal-cart-ucp" rel="noopener noreferrer"&gt;Google Universal Cart &amp;amp; UCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Our testing — &lt;a href="https://ucpchecker.com/blog/we-tested-5-ai-models-expiring-travel-inventory" rel="noopener noreferrer"&gt;We Tested 5 AI Models on Expiring Travel Inventory&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About UCP Checker
&lt;/h2&gt;

&lt;p&gt;UCP Checker is the independent validation and monitoring layer for the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;. We crawl, validate and grade every public UCP manifest we can find, run the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;merchant directory&lt;/a&gt;, the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; and live &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;adoption stats&lt;/a&gt;, and test how real AI agents behave against real stores. We track spec and ecosystem events — retail today, travel and lodging as they arrive — as they ship.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your store or booking endpoint:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grade it (UCP Score):&lt;/strong&gt; &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate your catalog:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/catalog-validator" rel="noopener noreferrer"&gt;ucpchecker.com/catalog-validator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get the side-by-side when the spec drops:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;ucpchecker.com/alerts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lodging is the hardest booking an agent will attempt. We will be measuring it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retail merchant figures are live from the UCP Checker index and update every 24 hours; agent-testing methodology is on our &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt; page.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>data</category>
      <category>ucp</category>
    </item>
    <item>
      <title>Agentic AI in Travel: Why UCP Isn't Travel-Ready Yet — and What We Measured</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Fri, 22 May 2026 14:51:28 +0000</pubDate>
      <link>https://dev.to/benjifisher/agentic-ai-in-travel-why-ucp-isnt-travel-ready-yet-and-what-we-measured-19h4</link>
      <guid>https://dev.to/benjifisher/agentic-ai-in-travel-why-ucp-isnt-travel-ready-yet-and-what-we-measured-19h4</guid>
      <description>&lt;p&gt;In a new post, Amadeus — the system of record behind roughly 3 billion flight searches a day, 400-plus airlines and 2 million hotel properties — laid out its read on agentic AI in travel. The headline from CTO Sylvain Roy: protocols, not chatbots, are what make agentic travel work, and the protocols that exist today are not ready. MCP, he argues, is "only a first step"; the Universal Commerce Protocol "could open large new distribution and conversion opportunities" but remains "largely retail-native and is still in the process of being adapted to handle the full complexity of travel."&lt;/p&gt;

&lt;p&gt;He is right — and we can put data behind it. Before Amadeus weighed in, we built a mock travel server with expiring offers and pointed five frontier models at it. Not one checked an offer's time-to-live before booking. Only one survived a three-second expiry window. None flagged a price change unless explicitly asked. Travel's defining feature — perishable inventory priced in real time — is precisely where today's agents fall over.&lt;/p&gt;

&lt;p&gt;So here is the state of play from the monitoring seat: travel's &lt;strong&gt;supply side just showed up to UCP&lt;/strong&gt;, but the &lt;strong&gt;demand side cannot reliably transact on it yet&lt;/strong&gt;, and the protocol needs travel-specific work before it can. This is the read on agentic commerce's hardest vertical. Our bias throughout: &lt;strong&gt;we saw it in the data first.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What just happened: travel's supply side standardized on UCP
&lt;/h2&gt;

&lt;p&gt;Two signals landed in quick succession. At Google Marketing Live 2026, Google extended UCP into hotels and local food delivery, naming a launch roster that reads like the entire travel-distribution stack: Accor, Amadeus, Booking.com, Choice Hotels, Expedia Group, Hilton, IHG, Marriott, Trip.com and Wyndham. Booking a hotel "right from AI Mode in Search" is the demo. (We covered the full package — &lt;a href="https://ucpchecker.com/blog/google-universal-cart-ucp" rel="noopener noreferrer"&gt;Universal Cart, multi-item checkout, BNPL and the rest&lt;/a&gt; — separately.)&lt;/p&gt;

&lt;p&gt;Then Amadeus published its position. Notably, it is &lt;strong&gt;not&lt;/strong&gt; an adoption announcement. Roy frames Amadeus as the "embedded and neutral execution layer for travel" and says it is ready to collaborate on travel-ready agentic protocols — but commits to no UCP timeline. The subtext is the honest one: the supply side is interested, the rails are forming, and nobody is claiming travel is solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why travel is agentic commerce's hardest vertical
&lt;/h2&gt;

&lt;p&gt;Retail is, relatively, simple: a product has a fixed SKU, a stable price and a quantity. Travel has none of those guarantees. Amadeus calls out five gaps, and each is a place a retail-native protocol strains.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic offers, not fixed SKUs.&lt;/strong&gt; A flight or room is not a catalog entry — it is a dynamically generated Offer ID built from origin, destination, dates, fare family, ancillaries and disruption rules. There is no stable identifier for an agent to drop in a cart and trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perishable inventory, real-time pricing.&lt;/strong&gt; Availability and price change by the second, with no true SKU equivalent. An offer an agent saw thirty seconds ago may already be gone or repriced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex servicing.&lt;/strong&gt; Changes, cancellations and disruption handling demand full request context, and the stakes of getting it wrong are far higher than a returned T-shirt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity, settlement and regulation.&lt;/strong&gt; Multi-party fulfillment, traveler identity verification and compliance obligations ride on every booking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data quality and control.&lt;/strong&gt; Personalization needs traveler context shared across parties while suppliers keep visibility and control of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UCP models the retail case well — fixed catalog, cart, checkout, payment handlers. (New to how UCP sits next to MCP and AP2? &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;We break the stack down here&lt;/a&gt;.) Travel needs primitives the retail spec does not have yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data: agents are blind to time
&lt;/h2&gt;

&lt;p&gt;The perishable-inventory and real-time-pricing problems are not theoretical. They are measurable, and we measured them.&lt;/p&gt;

&lt;p&gt;We built a mock travel server that issued offers with explicit expiry windows and ran &lt;a href="https://ucpchecker.com/blog/we-tested-5-ai-models-expiring-travel-inventory" rel="noopener noreferrer"&gt;five frontier models against it across 21 sessions&lt;/a&gt;. The results were stark: not one model checked an offer's TTL before attempting to book; only one survived a three-second expiry window; none surfaced a price change unless we asked. The agents treated time-sensitive travel inventory exactly like a static retail SKU — and that is the failure mode that turns a "confirmed" booking into a charge for an offer that no longer exists.&lt;/p&gt;

&lt;p&gt;The same blindness shows up on the retail side. Across 33 sessions on a live store, only two of five models caught a stale price even when handed yesterday's number — and the deeper problem was structural: the merchant data layer did not expose temporal metadata at all. A model cannot reason about expiry if nothing in the stack tells it the offer expires.&lt;/p&gt;

&lt;p&gt;That is Amadeus's "perishable inventory" and "live search at scale" challenges, observed in production. The protocol that wins travel has to carry time — TTLs, price-as-of timestamps, re-validation before commit — as a first-class signal, and agents have to be built to respect it. Neither is true today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retail-native, not travel-ready: what UCP still needs
&lt;/h2&gt;

&lt;p&gt;The encouraging part is that UCP is extensible by design. The spec grows through capability extensions — the Technical Council has been adding cart, order, loyalty and identity primitives since launch. Travel is simply the next, harder extension surface. From the gaps above, the shortlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;dynamic-offer primitive&lt;/strong&gt; — an offer object carrying a TTL and a price-validity window, replacing the assumption of a stable SKU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-validation in the checkout flow&lt;/strong&gt; — an agent must confirm the offer is still valid and still the quoted price before it commits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicing capabilities&lt;/strong&gt; for change, cancel and disruption, with enough context to handle them safely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity and settlement&lt;/strong&gt; extensions for multi-party, regulated fulfillment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Concretely, the dynamic-offer primitive looks something like this — a travel offer that carries its own clock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LHR-NRT-20260612-A1F2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;842.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ttl_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price_valid_until"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-12T19:30:03Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"revalidate_before_checkout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A retail SKU carries none of those fields, and that is the whole problem: nothing tells an agent the offer it is holding has already expired. None of these are exotic. They are the difference between a protocol that can sell a tote bag and one that can sell a Tokyo itinerary. And the backers are aligned to build them: the companies behind UCP — Google, Shopify, Amazon, Microsoft, Meta, Stripe and Salesforce, the group whose &lt;a href="https://ucpchecker.com/blog/ucp-tech-council-expands-amazon-meta-microsoft-salesforce-stripe" rel="noopener noreferrer"&gt;Technical Council recently expanded&lt;/a&gt; — now have the travel-distribution establishment at the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means
&lt;/h2&gt;

&lt;p&gt;For &lt;strong&gt;travel suppliers&lt;/strong&gt; (airlines, hotels, OTAs, GDSs): being named at a keynote is not the same as being agent-ready. The supply side is forming the rails, but the offer, pricing and servicing semantics that make travel safe for agents are not in the published spec yet. The window to shape those primitives — rather than inherit retail's — is open now, and Amadeus is signalling it wants in.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;demand-side players&lt;/strong&gt; (agents, assistants, AI shopping surfaces): do not ship autonomous travel booking on retail assumptions. Our data says agents will book expired offers and miss price changes unless both the protocol and the agent treat time as first-class. Until travel primitives land, keep a human on the commit step.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;the ecosystem&lt;/strong&gt; (us): we do not yet monitor live travel UCP endpoints — there are not any in production to monitor. What we can measure today is the agent side, and we have shown the gap is real. As travel manifests go live, the same validation, scoring and monitoring we run across more than 6,500 retail merchants — tracked monthly in &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-may-2026" rel="noopener noreferrer"&gt;the State of Agentic Commerce census&lt;/a&gt; — will extend to them. The neutral measurement layer travel is asking for is the one we already operate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're watching
&lt;/h2&gt;

&lt;p&gt;Whether the Technical Council opens a travel working group or a dynamic-offer extension; which of the GML travel partners ships a live, parseable endpoint first; whether Amadeus moves from "ready to collaborate" to a concrete commitment; and — the one we will keep testing — whether the next generation of models stops being blind to time. We will report what the data shows, not what the slides promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Amadeus — &lt;a href="https://amadeus.com/en/blog/articles/agentic-ai-travel-mcp-ucp-standards" rel="noopener noreferrer"&gt;Agentic AI in travel: why MCP and UCP standards matter&lt;/a&gt; (Sylvain Roy, CTO)&lt;/li&gt;
&lt;li&gt;Google blog — &lt;a href="https://blog.google/products-and-platforms/products/shopping/shopping-updates-google-marketing-live/" rel="noopener noreferrer"&gt;Shopping updates from Marketing Live&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Our testing — &lt;a href="https://ucpchecker.com/blog/we-tested-5-ai-models-expiring-travel-inventory" rel="noopener noreferrer"&gt;We Tested 5 AI Models on Expiring Travel Inventory&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About UCP Checker
&lt;/h2&gt;

&lt;p&gt;UCP Checker is the independent validation and monitoring layer for the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;. We crawl, validate and grade every public UCP manifest we can find, run the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;merchant directory&lt;/a&gt;, the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; and live &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;adoption stats&lt;/a&gt;, and test how real AI agents behave against real stores. We track spec and ecosystem events — retail today, travel as it arrives — as they ship.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your store:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grade it (UCP Score):&lt;/strong&gt; &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See capability coverage:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/capabilities" rel="noopener noreferrer"&gt;ucpchecker.com/capabilities&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse the directory:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get notified when an endpoint changes:&lt;/strong&gt; &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;ucpchecker.com/alerts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Travel is the hardest test agentic commerce has set itself. We will be measuring it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retail merchant figures are live from the UCP Checker index and update every 24 hours; agent-testing methodology is on our &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt; page.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>data</category>
      <category>ucp</category>
    </item>
    <item>
      <title>Shopify Just Shipped a UCP CLI. It Buys Anywhere — But Only Finds Shopify.</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 21 May 2026 17:09:41 +0000</pubDate>
      <link>https://dev.to/benjifisher/shopify-just-shipped-a-ucp-cli-it-buys-anywhere-but-only-finds-shopify-38lf</link>
      <guid>https://dev.to/benjifisher/shopify-just-shipped-a-ucp-cli-it-buys-anywhere-but-only-finds-shopify-38lf</guid>
      <description>&lt;p&gt;On &lt;strong&gt;May 18, 2026&lt;/strong&gt;, Shopify published &lt;a href="https://www.npmjs.com/package/@shopify/ucp-cli" rel="noopener noreferrer"&gt;&lt;code&gt;@shopify/ucp-cli&lt;/code&gt;&lt;/a&gt; to npm — a command-line tool and MCP server it describes as "a shopping skill for AI agents, powered by the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;." Within days it's at v0.5.0, MIT-licensed, &lt;a href="https://github.com/Shopify/ucp-cli" rel="noopener noreferrer"&gt;open on GitHub&lt;/a&gt;. The pitch, from Ilya Grigorik's launch post: millions of Shopify merchants natively speak UCP, billions of products are discoverable through a global catalog, and now any agent can learn to shop them with two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @shopify/ucp-cli
ucp skills add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI shipping is not the interesting part. A reference client for a maturing protocol was always coming. &lt;strong&gt;The interesting part is that &lt;code&gt;@shopify/ucp-cli&lt;/code&gt; is really two tools wearing one binary — and only one of them leaves Shopify.&lt;/strong&gt; One layer is pure, platform-neutral UCP that will transact against any conformant merchant on any stack. The other is a discovery engine hardwired to Shopify's own catalog. Pull them apart and you get a clear read on where the protocol is genuinely open today, and where the gravity still pulls toward the platform with the biggest index.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@shopify/ucp-cli&lt;/code&gt; is agent-first by design. Every command takes and returns structured JSON, so a model can compose payloads and parse results without scraping human-readable output. &lt;code&gt;ucp skills add&lt;/code&gt; installs a bundled &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;&lt;code&gt;SKILL.md&lt;/code&gt;&lt;/a&gt; — the operating manual that teaches an agent &lt;em&gt;when&lt;/em&gt; to search versus discover, how to render totals, how to surface required disclosures, and when to hand off to a human. The full command surface mirrors the UCP shopping service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ucp catalog search&lt;/code&gt; / &lt;code&gt;catalog lookup&lt;/code&gt; / &lt;code&gt;catalog get_product&lt;/code&gt; — find products&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ucp cart create | update | get | cancel&lt;/code&gt; — build a cart with confirmed pricing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ucp checkout create | update | complete | cancel&lt;/code&gt; — convert and pay&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ucp order get&lt;/code&gt; — post-purchase status&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ucp discover --business &amp;lt;url&amp;gt;&lt;/code&gt; — ask a store what it actually supports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two design choices stand out. First, &lt;strong&gt;live introspection&lt;/strong&gt;: &lt;code&gt;ucp discover&lt;/code&gt; and &lt;code&gt;--input-schema&lt;/code&gt; make real network calls to the merchant, not static doc lookups. The agent composes against whatever the merchant advertises &lt;em&gt;right now&lt;/em&gt; — including extensions added since it last shopped there. Second, &lt;strong&gt;every response carries a &lt;code&gt;cta&lt;/code&gt;&lt;/strong&gt; — the CLI tracks where you are in the flow and returns the next-best commands as structured recommendations, so the agent doesn't have to memorize the operating model. There's also a configurable escalation hook (&lt;code&gt;UCP_ON_ESCALATION&lt;/code&gt;) for the moments a merchant needs the human back in the loop.&lt;/p&gt;

&lt;p&gt;It's a genuinely well-built piece of agent tooling. Which is exactly why the boundary inside it is worth tracing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two layers, two answers
&lt;/h2&gt;

&lt;p&gt;The question that matters for everyone who isn't Shopify: &lt;strong&gt;does it work outside Shopify?&lt;/strong&gt; The honest answer is that the CLI has two layers, and they answer differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  The transaction layer is pure UCP
&lt;/h3&gt;

&lt;p&gt;Cart, checkout, order, and per-merchant catalog operations route through the generic &lt;code&gt;dev.ucp.shopping&lt;/code&gt; service. There is no Shopify branching in the dispatch path. When you pass &lt;code&gt;--business https://store.example.com&lt;/code&gt;, the CLI fetches that store's &lt;code&gt;/.well-known/ucp&lt;/code&gt; profile, negotiates a compatible protocol version and transport, and dispatches against the endpoint the merchant advertises — exactly as the spec describes. The capabilities it negotiates against are the neutral ones on &lt;code&gt;ucp.dev&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev.ucp.shopping.checkout   → ucp.dev/2026-04-08/schemas/shopping/checkout.json
dev.ucp.shopping.cart       → ucp.dev/2026-04-08/schemas/shopping/cart.json
dev.ucp.shopping.catalog.*  → ucp.dev/2026-04-08/schemas/shopping/catalog_*.json
dev.ucp.shopping.order      → ucp.dev/2026-04-08/schemas/shopping/order.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means a WooCommerce, Magento, BigCommerce, or fully custom store that publishes a valid UCP profile can be carted and checked out by this CLI today. The README says as much in plain language: build carts and complete checkouts "against any UCP-supporting merchant." The transaction layer is real, standards-based, and platform-neutral.&lt;/p&gt;

&lt;h3&gt;
  
  
  The discovery layer is Shopify
&lt;/h3&gt;

&lt;p&gt;Now run &lt;code&gt;ucp catalog search&lt;/code&gt; with no &lt;code&gt;--business&lt;/code&gt;. Where does it go? Straight to a hardcoded default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"ucp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"default_catalog_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://catalog.shopify.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "search across millions of merchants" headline resolves against &lt;a href="https://shopify.dev/docs/agents/catalog/global-catalog-extension" rel="noopener noreferrer"&gt;&lt;code&gt;catalog.shopify.com&lt;/code&gt;&lt;/a&gt;. And the catalog tools aren't even part of core UCP — they're surfaced through two &lt;strong&gt;Shopify-namespaced extensions&lt;/strong&gt;, &lt;code&gt;dev.shopify.catalog&lt;/code&gt; and &lt;code&gt;dev.shopify.catalog.global&lt;/code&gt;, with schemas served from &lt;code&gt;shopify.dev&lt;/code&gt;, not &lt;code&gt;ucp.dev&lt;/code&gt;. The results name their sellers as &lt;code&gt;*.myshopify.com&lt;/code&gt; domains. (The bundled skill even warns agents to check &lt;code&gt;variants[*].seller.domain&lt;/code&gt; rather than trust the brand in a product title — a Keychron keyboard in the global catalog might be sold by a third-party Shopify reseller, not Keychron itself.)&lt;/p&gt;

&lt;p&gt;So the asymmetry, stated plainly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Backed by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Discovery&lt;/strong&gt; (&lt;code&gt;catalog search&lt;/code&gt;, no &lt;code&gt;--business&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Shopify merchants only&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;catalog.shopify.com&lt;/code&gt;, &lt;code&gt;dev.shopify.catalog.global&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Transaction&lt;/strong&gt; (&lt;code&gt;--business &amp;lt;url&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Any UCP merchant, any platform&lt;/td&gt;
&lt;td&gt;generic &lt;code&gt;dev.ucp.shopping&lt;/code&gt;, &lt;code&gt;ucp.dev&lt;/code&gt; schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;It can buy anywhere. It can only find Shopify.&lt;/strong&gt; To transact with a non-Shopify store, an agent has to already know that store's URL — the CLI will happily check out there, but it will never surface the store in a search.&lt;/p&gt;

&lt;p&gt;One smaller detail for implementers: the CLI negotiates a protocol range of &lt;code&gt;2026-01-23&lt;/code&gt; to &lt;code&gt;2026-04-08&lt;/code&gt; — the same dated releases — and it doesn't speak the working-draft &lt;code&gt;"draft"&lt;/code&gt; version. Reference tooling is tracking published spec versions, not &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why discovery is the layer that's hard to open
&lt;/h2&gt;

&lt;p&gt;This isn't a knock on Shopify, and it isn't an oversight. It's structural. &lt;strong&gt;A transaction is a one-to-one conversation; discovery is an index.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Standardizing a checkout means agreeing on a message shape between two parties who already found each other. UCP does that well, and the CLI proves it — point it at any conformant endpoint and it works. But standardizing &lt;em&gt;discovery&lt;/em&gt; means someone has to build and host the index of who sells what, keep it fresh, and serve it at query time. That is expensive, and it accrues to whoever already has the catalog. Shopify has millions of merchants and their product data in one place, so a Shopify-backed global catalog is the path of least resistance — for Shopify.&lt;/p&gt;

&lt;p&gt;The consequence is that as agent commerce matures, the transaction layer commoditizes while discovery concentrates. The protocol gives every merchant an equal ability to &lt;em&gt;be transacted with&lt;/em&gt;. It does not, on its own, give every merchant an equal ability to &lt;em&gt;be found&lt;/em&gt;. That gap isn't in the spec — it's in who builds the index on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means in practice
&lt;/h2&gt;

&lt;p&gt;For &lt;strong&gt;Shopify merchants&lt;/strong&gt;: you're discoverable by default. Your products sit in the global catalog an agent searches before it knows which store to visit, with no work on your part. That's a real distribution advantage, and it's the clearest argument in the launch.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;non-Shopify merchants&lt;/strong&gt; (&lt;a href="https://ucpchecker.com/platforms/woocommerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/magento" rel="noopener noreferrer"&gt;Magento&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/bigcommerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;, and custom stacks): your UCP endpoint works fine with this CLI — an agent that has your URL can cart and check out against you today. But you will not appear in the default &lt;code&gt;catalog search&lt;/code&gt;. Conformance buys you transactability; it does not buy you discoverability inside a Shopify-owned index. If agent-driven discovery matters to your channel, you need to live in a catalog or directory that spans platforms — and you need your manifest to actually be valid, because an agent that can't parse your profile can't transact with you no matter how it arrived. (&lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;Run a check&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;agent builders&lt;/strong&gt;: treat the global catalog as a Shopify discovery surface, not a universal one. It's an excellent default for "find me X" with no merchant named. For cross-platform coverage you'll need to bring merchant URLs from elsewhere and lean on &lt;code&gt;discover --business&lt;/code&gt;. The transaction primitives are solid and genuinely portable; the discovery primitive is platform-scoped. Plan your retrieval layer accordingly.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;evaluators&lt;/strong&gt; (us): this sharpens why we run an independent, cross-platform &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;directory&lt;/a&gt;. We index UCP merchants by &lt;em&gt;verification&lt;/em&gt; — does this domain serve a valid, working manifest — not by membership in any one platform's catalog. The WooCommerce and Magento long tail that a Shopify global catalog structurally can't surface is exactly the part of the ecosystem we track. We measured the platform split in our &lt;a href="https://ucpchecker.com/blog/agentic-commerce-optimization-ucp-readiness-data" rel="noopener noreferrer"&gt;readiness data&lt;/a&gt; and revisit it every month in the &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-may-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt; census; a Shopify-only discovery default is a meaningful shift in how that long tail gets found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to read more
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The package: &lt;a href="https://www.npmjs.com/package/@shopify/ucp-cli" rel="noopener noreferrer"&gt;&lt;code&gt;@shopify/ucp-cli&lt;/code&gt; on npm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The source: &lt;a href="https://github.com/Shopify/ucp-cli" rel="noopener noreferrer"&gt;github.com/Shopify/ucp-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The bundled agent skill: &lt;a href="https://github.com/Shopify/ucp-cli/blob/main/skills/ucp/SKILL.md" rel="noopener noreferrer"&gt;&lt;code&gt;skills/ucp/SKILL.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shopify's global catalog extension: &lt;a href="https://shopify.dev/docs/agents/catalog/global-catalog-extension" rel="noopener noreferrer"&gt;global-catalog-extension&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How the three protocol layers fit together: &lt;a href="https://ucpchecker.com/blog/mcp-vs-ucp-vs-ap2-whats-the-difference" rel="noopener noreferrer"&gt;MCP vs UCP vs AP2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About UCP Checker
&lt;/h2&gt;

&lt;p&gt;UCP Checker is the independent validation and monitoring layer for the &lt;a href="https://ucpchecker.com/protocol" rel="noopener noreferrer"&gt;Universal Commerce Protocol&lt;/a&gt;. We crawl, validate, and grade every public UCP manifest we can find — across &lt;a href="https://ucpchecker.com/platforms/shopify" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/woocommerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/bigcommerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/magento" rel="noopener noreferrer"&gt;Magento&lt;/a&gt; and beyond — and run the cross-platform &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;merchant directory&lt;/a&gt;, the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt;, and the &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;adoption stats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to know whether agents can actually transact with your store, on any platform: &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;run a check&lt;/a&gt;. If you want to catch the moment your store's UCP support changes — a platform update, a spec bump, an endpoint breaking silently — &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;set up UCP Alerts&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>ucp</category>
      <category>shopify</category>
    </item>
    <item>
      <title>How to Test Your UCP Implementation with AI Agents</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Fri, 15 May 2026 09:11:04 +0000</pubDate>
      <link>https://dev.to/benjifisher/how-to-test-your-ucp-implementation-with-ai-agents-180g</link>
      <guid>https://dev.to/benjifisher/how-to-test-your-ucp-implementation-with-ai-agents-180g</guid>
      <description>&lt;p&gt;You ship a UCP manifest. The validator returns green. The schema parses cleanly. Every required field is present, every URL resolves, every transport responds. You declare the work done and move on.&lt;/p&gt;

&lt;p&gt;Three weeks later, you find out your store has been quietly failing every agent shopping session. The cart endpoint accepts adds but rejects checkouts. A specific variant ID throws a 400 on &lt;code&gt;update_cart&lt;/code&gt;. The agent reaches &lt;code&gt;ready_for_complete&lt;/code&gt; and stalls because your payment handler doesn't recognise the token format. None of these issues showed up in static validation. All of them block real users on agent-mediated flows.&lt;/p&gt;

&lt;p&gt;This post is about how to actually test your UCP implementation — not as a schema document, but as a runtime surface that real frontier agents have to operate against. The short version: &lt;strong&gt;schema validation is necessary but not sufficient&lt;/strong&gt;. The long version is the rest of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  What validators catch and what they miss
&lt;/h2&gt;

&lt;p&gt;A UCP validator (including ours, &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;the validator at ucpchecker.com/ucp-validator&lt;/a&gt;) checks structural things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manifest is valid JSON&lt;/li&gt;
&lt;li&gt;Required fields are present (&lt;code&gt;spec&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;, &lt;code&gt;signing_keys&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Declared spec version is one we recognise&lt;/li&gt;
&lt;li&gt;Transport endpoints return non-error responses&lt;/li&gt;
&lt;li&gt;Schema URLs resolve&lt;/li&gt;
&lt;li&gt;Capability namespaces match the spec catalogue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the things you can verify without actually running an agent flow against the store. They're table-stakes, and the &lt;a href="https://ucpchecker.com/blog/introducing-ucp-score-agent-readiness-grade" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; bakes them into the structural-conformance dimension of its grade.&lt;/p&gt;

&lt;p&gt;What static validation doesn't catch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether &lt;code&gt;update_cart&lt;/code&gt; rejects valid variant IDs intermittently&lt;/li&gt;
&lt;li&gt;Whether the cart endpoint's success response contains the line items it claims to contain&lt;/li&gt;
&lt;li&gt;Whether the checkout flow surfaces the buyer-specific payment instruments your customer can actually use&lt;/li&gt;
&lt;li&gt;Whether your &lt;code&gt;search_catalog&lt;/code&gt; returns more than 8 KB of HTML in a &lt;code&gt;description&lt;/code&gt; field that crashes Claude's tool-calling layer&lt;/li&gt;
&lt;li&gt;Whether two different models pick the same variant ID for "Medium" against your product (the &lt;a href="https://ucpchecker.com/blog/ucp-variant-data-guide" rel="noopener noreferrer"&gt;variant-data problem&lt;/a&gt; we cover separately)&lt;/li&gt;
&lt;li&gt;Whether the agent can recover when one of your tool calls returns a 500 mid-flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are runtime properties. They only surface when you run an actual agent against an actual checkout. And they're where the gap between "store passes validation" and "agent can buy" lives. The April &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-april-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce report&lt;/a&gt; sized that gap concretely: of 4,014 verified UCP stores, only &lt;strong&gt;9 delivered a flawless end-to-end agent experience&lt;/strong&gt;. A 0.2% flawless rate against a 98%+ conformance rate. The runtime gap is the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-layer testing pyramid
&lt;/h2&gt;

&lt;p&gt;The right way to test UCP is not "validator or no validator" — it's three layers, each catching a different class of problem, in increasing order of cost and fidelity:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Catches&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Schema validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;&lt;code&gt;/ucp-validator&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Manifest parse errors, missing required fields, malformed URLs&lt;/td&gt;
&lt;td&gt;seconds, free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Capability score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;&lt;code&gt;/score&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Surface signals, declared capabilities, transport reachability, robots/sitemap hygiene&lt;/td&gt;
&lt;td&gt;seconds, free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Live agent eval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Variant resolution, cart/checkout shape, error recovery, multi-model behaviour, attribution flow&lt;/td&gt;
&lt;td&gt;dollars per session, paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each layer feeds the next. If layer 1 fails, layer 2 has nothing to score. If layer 2 reports gaps, layer 3 will find them magnified in real agent runs. Skipping layers wastes layer 3's time on bugs the cheaper layers would have caught — that's the case for running them in order rather than going straight to live agents.&lt;/p&gt;

&lt;p&gt;Most teams stop at layer 2. &lt;strong&gt;Stopping at layer 2 is what produces the 99.8%-conformant / 0.2%-flawless gap.&lt;/strong&gt; A clean Score gets you to "the agent has a fair chance." A clean Score plus a clean eval gets you to "the agent reliably completes the flow you care about."&lt;/p&gt;

&lt;h2&gt;
  
  
  What live agent testing actually looks like
&lt;/h2&gt;

&lt;p&gt;Layer 3 is where most readers are unfamiliar, so this section walks through what running an agent test against your own store actually involves.&lt;/p&gt;

&lt;p&gt;The shape: you point a frontier agent (Claude, GPT, Gemini, Grok, Llama — whichever model you want to evaluate against) at your store's UCP manifest endpoint and give it a multi-turn shopping prompt. The agent does what an agent does — discovers your tools via the manifest, calls &lt;code&gt;search_catalog&lt;/code&gt; against your products, evaluates the results, picks something, calls &lt;code&gt;update_cart&lt;/code&gt;, navigates checkout. The framework records every tool call, every response, every model decision, the full token-by-token event stream.&lt;/p&gt;

&lt;p&gt;At the end of the session you get a structured report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the agent reach &lt;code&gt;checkout_reached&lt;/code&gt; (full transaction completion)?&lt;/li&gt;
&lt;li&gt;Or did it stop at &lt;code&gt;cart_created&lt;/code&gt;, &lt;code&gt;search_only&lt;/code&gt;, or &lt;code&gt;failed&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;How many tool calls did it make? How many succeeded? Which ones errored?&lt;/li&gt;
&lt;li&gt;How many tokens did the model consume?&lt;/li&gt;
&lt;li&gt;How long did the session take?&lt;/li&gt;
&lt;li&gt;If the agent failed, why?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the data layer 1 and layer 2 can't produce. &lt;strong&gt;Schema validation tells you what your store says; agent eval tells you what an agent does with what your store says.&lt;/strong&gt; They're answering different questions.&lt;/p&gt;

&lt;p&gt;For most stores, the first eval session is uncomfortable. The agent picks the wrong variant. Or it adds something to the cart and then stalls because the response shape isn't quite what it expected. Or it reaches &lt;code&gt;ready_for_complete&lt;/code&gt; and can't move forward because your payment-handler declaration doesn't match what the agent has been trained to handle. Each of those is a fix you can make, and each fix lifts your real conversion rate the next time an actual user-facing agent shops your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why testing on one model isn't enough
&lt;/h2&gt;

&lt;p&gt;A useful pattern from the &lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;Playground 1,000-session dataset&lt;/a&gt;: the same store gets meaningfully different outcomes across different models. A store that completes checkout 65% of the time on Claude Sonnet 4.5 might complete only 18% of the time on GPT-5.2 — the same UCP implementation, the same shopping prompt, just a different model.&lt;/p&gt;

&lt;p&gt;That spread isn't because one model is "better." It's because each frontier model has its own quirks in how it handles tool calls, schemas, error responses, and ambiguous data. Models differ on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How they handle empty arrays vs missing fields&lt;/li&gt;
&lt;li&gt;Whether they follow up on a 4xx response or move on&lt;/li&gt;
&lt;li&gt;How aggressively they retry failed tool calls&lt;/li&gt;
&lt;li&gt;How they parse multi-line strings in description fields&lt;/li&gt;
&lt;li&gt;Whether they pass through optional metadata fields verbatim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real-world implication: &lt;strong&gt;your customers don't all use the same agent&lt;/strong&gt;. Some use ChatGPT-routed flows; some use Anthropic's; some use Google AI Mode; some use a custom agent built on Llama. Testing against just one model means catching only the bugs that one model surfaces, while shipping silent failures to everyone using a different one. Multi-model coverage is what gets you from "this passes for our internal demo" to "this works for real customer traffic."&lt;/p&gt;

&lt;p&gt;UCP Playground supports head-to-head testing across 15+ frontier models. The &lt;a href="https://ucpplayground.com/models/compare?models=claude-sonnet-4-5%2Cgpt-5-2" rel="noopener noreferrer"&gt;comparison view&lt;/a&gt; lets you run the same store against any two models on the same workload. We'd suggest at minimum testing against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Anthropic model (Claude Opus or Sonnet)&lt;/li&gt;
&lt;li&gt;One OpenAI model (GPT-5.2 or GPT-4o)&lt;/li&gt;
&lt;li&gt;One Google model (Gemini 3.1 Pro or 2.5 Flash)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three models cover most of the deployed-agent universe. If any of the three behaves badly against your store, you have a real problem worth fixing before more traffic arrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring tests into your deploy pipeline
&lt;/h2&gt;

&lt;p&gt;Manual eval is fine for one-off audits. If you're shipping changes regularly, you want this in CI. The Playground exposes a &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;headless API&lt;/a&gt; for exactly that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/collections          — define a test (sequence of prompts + models + stores)
POST /api/v1/collections/{id}/run — trigger the test
GET  /api/v1/collection-runs/{id} — poll status + results
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern most teams ship first: a deploy-time test that triggers an eval after every UCP-related code change, asserts on key metrics, and fails the build if any of them regress. A reasonable assertion shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/ucp-eval.yml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run UCP eval&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;curl -X POST $PLAYGROUND_API/v1/collections/$COLLECTION_ID/run \\&lt;/span&gt;
      &lt;span class="s"&gt;-H "Authorization: Bearer $PLAYGROUND_TOKEN"&lt;/span&gt;
    &lt;span class="s"&gt;# Poll, then assert:&lt;/span&gt;
    &lt;span class="s"&gt;# - checkout_rate &amp;gt;= 80&lt;/span&gt;
    &lt;span class="s"&gt;# - errors.total == 0&lt;/span&gt;
    &lt;span class="s"&gt;# - avg_duration_ms &amp;lt; 30000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same shape as Lighthouse CI for web performance. A regression catch you bolt onto your pipeline rather than rediscover in production. The &lt;a href="https://ucpchecker.com/blog/ucp-playground-evals" rel="noopener noreferrer"&gt;UCP Playground Evals launch post&lt;/a&gt; walks through the full pattern with a worked example.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order to do this in
&lt;/h2&gt;

&lt;p&gt;If you're starting from a fresh UCP implementation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;validator&lt;/a&gt;&lt;/strong&gt; against your manifest. Fix any structural errors. This is the cheapest layer; do it first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get a &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt;&lt;/strong&gt; for your domain. Aim for B+ (70+) before moving to live testing. Below that, you have surface-level gaps that'll dominate the eval results and waste your test budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a &lt;a href="https://ucpplayground.com/evals" rel="noopener noreferrer"&gt;Playground eval&lt;/a&gt;&lt;/strong&gt; against your store with two different frontier models on a single shopping sequence. Fix whatever fails. Common first-time failures: variant-data ambiguity, response-shape inconsistencies, tool argument validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand to three models&lt;/strong&gt; once your single-model baseline works. Multi-model coverage is what catches the long-tail issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire the eval into CI&lt;/strong&gt; once your implementation is stable. From this point on, every code change that touches UCP runs against real agents before it ships.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you've already got a UCP implementation in production and are trying to figure out why agents aren't completing checkouts, skip step 2 and go straight to step 3. The eval will show you the specific failure mode, and you can backfill the score work later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good looks like
&lt;/h2&gt;

&lt;p&gt;A store that's passed all three layers cleanly looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validator&lt;/strong&gt;: green&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt;: A grade (85+) across Discovery, Conformance, and Capability Coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eval&lt;/strong&gt;: 80%+ checkout rate against Claude Sonnet 4.5, Gemini 3 Flash, and one other model of your choice; &amp;lt;5s average tool-call latency; zero categorised errors across at least 20 sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the bar. The &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-april-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce&lt;/a&gt; is tracking how many stores hit that bar — currently fewer than 1% of verified stores. The work to get from 99% conformance to 1% bar-clearing is mostly testing work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validator&lt;/strong&gt; (free, instant): &lt;a href="https://ucpchecker.com/ucp-validator" rel="noopener noreferrer"&gt;ucpchecker.com/ucp-validator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt; (free, instant): &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live agent eval&lt;/strong&gt; (paid per session): &lt;a href="https://ucpplayground.com/evals" rel="noopener noreferrer"&gt;ucpplayground.com/evals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-model comparison view&lt;/strong&gt;: &lt;a href="https://ucpplayground.com/models" rel="noopener noreferrer"&gt;ucpplayground.com/models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI-ready eval API&lt;/strong&gt;: documented at &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;ucpplayground.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Schema validation is necessary. It is not sufficient. The agents your customers use will run real flows against your store, and the only way to know whether those flows succeed is to run them yourself first.&lt;/p&gt;

&lt;p&gt;Test before they do.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
    <item>
      <title>The State of Agentic Commerce — May 2026</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Thu, 14 May 2026 09:45:37 +0000</pubDate>
      <link>https://dev.to/benjifisher/the-state-of-agentic-commerce-may-2026-500g</link>
      <guid>https://dev.to/benjifisher/the-state-of-agentic-commerce-may-2026-500g</guid>
      <description>&lt;p&gt;In April, the story was a platform pulling a lever: Shopify migrated its entire UCP fleet to v2026-04-08 in four days, BigCommerce showed up with three stores, and we said the question for May was &lt;em&gt;which platform ships next&lt;/em&gt; — because every prior jump in the directory had been a step function caused by a platform-level deployment.&lt;/p&gt;

&lt;p&gt;May's answer: none, and it didn't matter. No platform shipped a UCP wave this month. BigCommerce still has three verified stores. WooCommerce still has three. Salesforce Commerce Cloud still has none verified, though a custom build is reportedly in development. And the directory still grew ~32% — the same rate as April — because the &lt;em&gt;baseline&lt;/em&gt; discovery rate stepped up. For the first time since we started this report, UCP grew on a slope instead of a staircase.&lt;/p&gt;

&lt;p&gt;This is the fourth monthly state-of-the-ecosystem report from UCP Checker. Here's what the data says as of May 12, 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5,294&lt;/strong&gt; &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;verified UCP stores&lt;/a&gt; (up from 4,014 in April, &lt;strong&gt;+32%&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5,892&lt;/strong&gt; total domains tracked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1,829&lt;/strong&gt; new merchants discovered this month; &lt;strong&gt;775&lt;/strong&gt; this week alone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5,264&lt;/strong&gt; verified stores on the latest &lt;a href="https://ucpchecker.com/specs/2026-04-08" rel="noopener noreferrer"&gt;v2026-04-08 spec&lt;/a&gt; (99.4%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5,235&lt;/strong&gt; verified stores at A grade on &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; (98.9%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three consecutive months of ~30% growth is a real curve now, not a launch artifact. But the &lt;em&gt;shape&lt;/em&gt; changed. February was discovery (first 1,000 Shopify stores). March was expansion (crossed 3,000, first non-Shopify manifests). April was consolidation (the four-day Shopify spec migration). May is the first month where the headline growth came from neither a new platform nor a spec event — it came from crawler optimisations we shipped in early May. The stores were always out there; we just got faster at finding them.&lt;/p&gt;

&lt;p&gt;That distinction matters for forecasting. If May's growth had been platform-driven, you'd model the next jump as "wait for SFCC." Since it's discovery-rate-driven, the model is different: the directory keeps filling at a steady clip until either we exhaust the discoverable Shopify long tail, or a platform finally ships a wave and the staircase resumes. Both will happen; the order is the open question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shopify's head start, four months in
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Monitored&lt;/th&gt;
&lt;th&gt;Verified&lt;/th&gt;
&lt;th&gt;Verified %&lt;/th&gt;
&lt;th&gt;Avg score (verified)&lt;/th&gt;
&lt;th&gt;Avg manifest latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/shopify" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5,242&lt;/td&gt;
&lt;td&gt;5,241&lt;/td&gt;
&lt;td&gt;~100%&lt;/td&gt;
&lt;td&gt;92.5&lt;/td&gt;
&lt;td&gt;178 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/custom" rel="noopener noreferrer"&gt;Custom &amp;amp; Headless&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;642&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;7.0%&lt;/td&gt;
&lt;td&gt;83.0&lt;/td&gt;
&lt;td&gt;356 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/woocommerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;92.3&lt;/td&gt;
&lt;td&gt;1,023 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/bigcommerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;993 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/magento" rel="noopener noreferrer"&gt;Magento&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;85.0&lt;/td&gt;
&lt;td&gt;218 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpchecker.com/platforms/prestashop" rel="noopener noreferrer"&gt;PrestaShop&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;84.0&lt;/td&gt;
&lt;td&gt;548 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Shopify is 99% of the verified directory — unchanged from April. Every non-Shopify platform combined sums to 53 verified stores, the same as last month. The head start is still the dominant signal in the data, and the Custom &amp;amp; Headless cohort is the mirror image: 642 domains attempted UCP, only 45 got to verified (a 7% completion rate). When a platform hands you the boilerplate, you compound; when you build it yourself, most attempts stall before validation. That's a tooling gap, not a spec problem.&lt;/p&gt;

&lt;p&gt;The more interesting movement came from two more platforms shipping UCP support — &lt;strong&gt;Bareconnect&lt;/strong&gt; and &lt;strong&gt;Selly.io&lt;/strong&gt; — both of which already have verified stores live in the directory today, not roadmap promises. The numbers are still small. How either platform is exposing UCP (default for every storefront, opt-in, or a paid tier) decides whether this stays a handful or turns into a wave — that detail we don't know yet. But it's the first new platform movement since the Shopify migration.&lt;/p&gt;

&lt;p&gt;Two structural notes on the table. BigCommerce and WooCommerce manifests run ~1 second versus Shopify's 178 ms because they're served from the storefront origin rather than a CDN-cached endpoint — a meaningful handicap as agent response budgets tighten. And geographically the directory is still a US/&lt;code&gt;.com&lt;/code&gt; story: 4,720 of 5,294 verified stores ship under generic TLDs; the largest attributable ccTLD cohorts are &lt;code&gt;.uk&lt;/code&gt; (229), &lt;code&gt;.au&lt;/code&gt; (120), and &lt;code&gt;.ca&lt;/code&gt; (66); continental Europe is under 2% by ccTLD (a floor, not a true distribution).&lt;/p&gt;

&lt;h2&gt;
  
  
  Capability coverage: the ceiling, and the edges
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Verified adopters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.checkout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,269&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.fulfillment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,264&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.catalog.lookup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,257&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.catalog.search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.order&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.discount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,253&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.cart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;— the cliff —&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.common.identity_linking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.buyer_consent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.checkout.embedded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.ap2_mandate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dev.ucp.shopping.payment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Identical pattern to March and April: the seven core shopping capabilities ship together as a Shopify-side bundle (~5,250 adopters each), then an 800× cliff. Identity linking: 6. AP2 mandate — the primitive that makes an agentic transaction auditably user-authorised — still 1 (&lt;a href="https://ucpchecker.com/status/houseofparfum.nl" rel="noopener noreferrer"&gt;houseofparfum.nl&lt;/a&gt;, WooCommerce, scoring 100). Payment capability: still 0. Of 5,294 verified stores, &lt;strong&gt;5,161 (&amp;gt;99%) sit at Tier 2&lt;/strong&gt;, one is Tier 3, one is Tier 4. The deeper primitives aren't slow-adopting, they're &lt;em&gt;not adopting yet&lt;/em&gt;. When demand for AP2 turns into pressure (regulators, payment networks, the working group's eventual requirements), this number moves fast — the way checkout did once Shopify bundled it. Until then, "UCP store" means "agent-shoppable," not "mandate-credentialed."&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the movement was: the edges of the spec
&lt;/h3&gt;

&lt;p&gt;The new signals in May's data sit at the edges of the spec rather than its core. The first is in the capability namespace itself: below the standard &lt;code&gt;dev.ucp.*&lt;/code&gt; entries, a handful of non-standard, vendor-prefixed capabilities are now appearing on real verified manifests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;com.pwc.accelerator.loyalty.rewards&lt;/code&gt; — 2 stores. PwC's agentic-commerce accelerator (more below).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.appointedd.schedule&lt;/code&gt; / &lt;code&gt;.booking&lt;/code&gt; / &lt;code&gt;.intent&lt;/code&gt; — 1 store. Appointment-scheduling primitives — booking-vertical UCP, not retail.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.woocommerce.ai_storefront&lt;/code&gt; — 1 store. A WooCommerce-specific storefront extension.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sh.agentscore.identity&lt;/code&gt; — 1 store. An identity primitive from a third party.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;com.agoragentic.x402.checkout&lt;/code&gt; — 1 store. A checkout extension referencing x402 (the HTTP-402 micropayment pattern).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None is adopted at scale yet — 1–2 stores each, almost certainly vendors' own test deployments — but it's the first month the namespace long tail has held anything other than Shopify defaults. It's the leading indicator of a UCP &lt;em&gt;extension&lt;/em&gt; ecosystem: third parties shipping vertical capabilities (loyalty, booking, identity, micropayments) on top of the core spec, a more realistic near-term diversification path than "another commerce platform ships a wave."&lt;/p&gt;

&lt;p&gt;The PwC entry is worth pulling out, because it isn't a platform — it's a consultancy. PwC has launched an &lt;strong&gt;agentic-commerce accelerator&lt;/strong&gt;: a practice that stands up custom UCP-enabled storefronts for enterprise clients, with its own capability extensions (the &lt;code&gt;com.pwc.accelerator.*&lt;/code&gt; namespace) layered on the core spec. That's a third adoption channel, distinct from "platform ships a wave" and "developer hand-builds" — call it &lt;strong&gt;consulting-led&lt;/strong&gt;. It's slower per engagement, but each accelerator that standardises on UCP arrives with a portfolio of enterprise clients attached. PwC is the leading edge; Deloitte, EY, KPMG, Accenture, McKinsey, BCG, and the systems integrators (Capgemini, IBM, TCS, Infosys) all face the same build-it-once, deploy-to-many incentive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transports and payment handlers: the monoculture, and the experiments tier
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transport&lt;/th&gt;
&lt;th&gt;Verified declarations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;5,258&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedded&lt;/td&gt;
&lt;td&gt;5,243&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2A&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MCP and Embedded are universal because Shopify declares both. REST shows up on 47 stores — the non-Shopify hand-builds, REST being the natural fit for anyone implementing without an MCP server. A2A (Google's Agent2Agent transport, formally added in v2026-04-08) holds at two. Payment handlers tell the same monoculture story: &lt;strong&gt;5,250 verified stores declare Google Pay and 5,241 declare Shopify Card&lt;/strong&gt; — the same shared Shopify-managed handler IDs we &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-february-2026" rel="noopener noreferrer"&gt;flagged in February&lt;/a&gt; as a single point of failure. Everything else is a rounding error. The payment &lt;em&gt;partner&lt;/em&gt; ecosystem (Stripe, Adyen, Visa, Mastercard, PayPal, Affirm, Splitit — all on the &lt;a href="https://ucpregistry.com" rel="noopener noreferrer"&gt;registry&lt;/a&gt;) is mature on paper; the live &lt;em&gt;handler declarations&lt;/em&gt; are two Shopify-managed IDs and a handful of experiments.&lt;/p&gt;

&lt;p&gt;The experiments are the part worth zooming in on, because the same small set of builders is populating the spec's newer transport, its newer handler shapes, and its newer capability namespaces simultaneously. Both A2A adopters are agent-native rather than retail: one is an agent-identity storefront running pure A2A with a cryptographically signed manifest (JWS / EdDSA) and two custom payment handlers on crypto rails — an &lt;code&gt;mpp&lt;/code&gt; rail on Tempo mainnet and an &lt;code&gt;x402&lt;/code&gt; rail on Base; the other is an agent-to-agent service exposed across MCP + A2A + REST, selling a USDC-priced audit via a &lt;code&gt;com.agoragentic.x402&lt;/code&gt; handler plus a direct USDC receive address. Both ship the custom capability namespaces flagged in the capability section above (&lt;code&gt;sh.agentscore.identity&lt;/code&gt;, &lt;code&gt;com.agoragentic.x402.checkout&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Separately, payment processors are starting to run dev UCP endpoints with fully custom handler integrations — their own handler IDs, their own &lt;code&gt;init&lt;/code&gt; / &lt;code&gt;verify&lt;/code&gt; protocol shapes, declared at v2026-04-08 over REST against real merchants, iterating against the &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;Checker&lt;/a&gt; as they build. Still dev, not live, but for the first time the gap between the partner roster and the live handler declarations has something in it that's neither Shopify-default nor mock fixture — and it's coming from processors with the scale to move real merchant bases. Two data points in each direction don't make a trend, but the &lt;em&gt;pattern&lt;/em&gt; is coherent: the spec's newer surfaces (A2A transport, custom handler shapes, third-party namespaces) are populated by a small set of builders doing novel work in parallel, while the core carries volume. That's the shape of a protocol leaving its launch phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  How agents actually perform
&lt;/h2&gt;

&lt;p&gt;The numbers above tell you which stores &lt;em&gt;have&lt;/em&gt; UCP. This section is which stores &lt;em&gt;work&lt;/em&gt; when an agent shops them. &lt;a href="https://ucpplayground.com/evals" rel="noopener noreferrer"&gt;UCP Playground Evals&lt;/a&gt; &lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;passed 1,000 recorded agent sessions&lt;/a&gt; this month — and it's well past that now: a thousand-plus end-to-end agent shopping runs across 105 unique stores and 16 frontier models, totalling ~57M tokens, &lt;strong&gt;~12 hours of cumulative agent runtime&lt;/strong&gt;, and roughly $119,000 in aggregate cart value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outcomes: where the agent stops
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;checkout_reached&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;475&lt;/td&gt;
&lt;td&gt;37.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;search_only&lt;/code&gt; (browsed, didn't cart)&lt;/td&gt;
&lt;td&gt;344&lt;/td&gt;
&lt;td&gt;27.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;failed&lt;/code&gt; (provider error, refusal, max turns)&lt;/td&gt;
&lt;td&gt;261&lt;/td&gt;
&lt;td&gt;20.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;cart_created&lt;/code&gt; (carted, didn't proceed)&lt;/td&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;td&gt;13.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;62% of sessions end without a completed checkout&lt;/strong&gt; — and that ratio has stayed stable as the dataset grew, which is itself the finding. As we add models and stores, the &lt;em&gt;shape&lt;/em&gt; of failure doesn't change: agents find products fine (search works nearly everywhere), build carts often, then ~14% of sessions stall at a cart that won't convert and ~21% fail outright (about half of those are variant-shape problems — the agent picks a variant ID the cart rejects and flails until it hits the turn limit). We dug into exactly that this month in &lt;a href="https://ucpchecker.com/blog/ucp-variant-data-guide" rel="noopener noreferrer"&gt;UCP Variant Data: The #1 Reason Agent Checkouts Fail&lt;/a&gt; — the single largest categorisable cause of the gap between "has a manifest" and "agent can buy from it," and almost entirely fixable in the merchant's variant data without touching any tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model leaderboard
&lt;/h3&gt;

&lt;p&gt;Checkout-conversion rate by model, from the &lt;a href="https://ucpplayground.com/leaderboard" rel="noopener noreferrer"&gt;UCP Playground model leaderboard&lt;/a&gt; — sessions where the agent reached a checkout URL ÷ total sessions for that model (the live leaderboard breaks out search, cart, and speed too):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;th&gt;Checkout %&lt;/th&gt;
&lt;th&gt;Avg session&lt;/th&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/claude-sonnet-4-5" rel="noopener noreferrer"&gt;Claude Sonnet 4.5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~38 s&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/llama-3-3-70b" rel="noopener noreferrer"&gt;Llama 3.3 70B&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;49.3%&lt;/td&gt;
&lt;td&gt;~48 s&lt;/td&gt;
&lt;td&gt;Meta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/deepseek-v3-2" rel="noopener noreferrer"&gt;DeepSeek V3.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;45.0%&lt;/td&gt;
&lt;td&gt;~46 s&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gemini-3-flash" rel="noopener noreferrer"&gt;Gemini 3 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;174&lt;/td&gt;
&lt;td&gt;42.0%&lt;/td&gt;
&lt;td&gt;~21 s&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/grok-4" rel="noopener noreferrer"&gt;Grok 4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;39.6%&lt;/td&gt;
&lt;td&gt;~77 s&lt;/td&gt;
&lt;td&gt;xAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/claude-opus-4-6" rel="noopener noreferrer"&gt;Claude Opus 4.6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;39.0%&lt;/td&gt;
&lt;td&gt;~30 s&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gemini-2-5-flash" rel="noopener noreferrer"&gt;Gemini 2.5 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;36.0%&lt;/td&gt;
&lt;td&gt;~12 s&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gpt-4o" rel="noopener noreferrer"&gt;GPT-4o&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;31.7%&lt;/td&gt;
&lt;td&gt;~15 s&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gemini-3-1-pro" rel="noopener noreferrer"&gt;Gemini 3.1 Pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;29.2%&lt;/td&gt;
&lt;td&gt;~48 s&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gemini-2-5-pro" rel="noopener noreferrer"&gt;Gemini 2.5 Pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;27.8%&lt;/td&gt;
&lt;td&gt;~34 s&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/gpt-5-2" rel="noopener noreferrer"&gt;GPT-5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;20.6%&lt;/td&gt;
&lt;td&gt;~36 s&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/deepseek-r1" rel="noopener noreferrer"&gt;DeepSeek R1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;15.8%&lt;/td&gt;
&lt;td&gt;~60 s&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/o4-mini" rel="noopener noreferrer"&gt;o4-mini&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;14.3%&lt;/td&gt;
&lt;td&gt;~42 s&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/grok-3-mini" rel="noopener noreferrer"&gt;Grok 3 Mini&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;9.5%&lt;/td&gt;
&lt;td&gt;~57 s&lt;/td&gt;
&lt;td&gt;xAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ucpplayground.com/models/qwq-32b" rel="noopener noreferrer"&gt;QwQ 32B&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~61 s&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things hold from April, plus one shift:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search works everywhere. Checkout completion is the next frontier.&lt;/strong&gt; Every model that runs to completion finds products. Checkout conversion ranges from 0% to 52% — a 50-point spread across the field, which is exactly where the work-to-do sits. The best model in the field completes checkout about half the time today; the headroom from there is the frontier the next quarter gets to push.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning-tuned models still underperform.&lt;/strong&gt; QwQ 32B: 0% across 25 sessions. Grok 3 Mini: 9.5%. o4-mini: 14.3%. DeepSeek R1: 15.8%. Models that burn tokens on deliberation struggle with the fast, sequential, low-ambiguity tool-calling that shopping requires. Shopping rewards decisive, not thoughtful — true in April, true with 3× the data. (GPT-5.2 also lands below the median at 20.6%.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed and success are decoupled.&lt;/strong&gt; Gemini 2.5 Flash finishes a session in ~12 seconds; Grok 4 takes ~77. Their checkout rates are 36% and 40% — basically a wash. Being fast doesn't make you good at this; being slow doesn't either. The Claude models sit mid-pack on speed (~30–38 s) and top on conversion, which is the combination that actually matters when the agent is spending someone's money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shift:&lt;/strong&gt; in April we reported DeepSeek V3.2 leading the composite shopping score. With ~3× the sessions, Claude Sonnet 4.5 is now clearly out front on checkout completion — 52% over 256 sessions, by far the largest sample — with Meta's Llama 3.3 70B the surprise second. Treat any single month's ranking as provisional until the eval dataset gets to the point — soon — where it stops being indicative and becomes authoritative.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reliability gap, one more time
&lt;/h2&gt;

&lt;p&gt;We've made this the editorial spine of every one of these reports, and the May data doesn't let us retire it. &lt;strong&gt;98.9% of verified stores carry an A on UCP Score&lt;/strong&gt; (5,235 of 5,294; the rest are 57 B's and two C's). By conformance, the directory is in excellent shape. But conformance isn't end-to-end agent-readiness, and that's the gap UCP Score doesn't grade.&lt;/p&gt;

&lt;p&gt;A clean schema doesn't tell you whether the cart endpoint accepts the variant the agent picked, whether response-time budgets hold under load, whether payment-handler tokenisation completes inside the agent's timeout window, or whether the checkout URL drops the agent into an auth loop a browser would have handled with cookies. &lt;a href="https://ucpplayground.com/evals" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; is the test harness developers use to exercise that second layer — replay sessions, probe edge cases, see exactly where an agent trips. By design it surfaces failure modes, not steady-state performance; treating Playground completion rates as a consumer-shopping success metric mis-reads the tool. But the &lt;em&gt;categories&lt;/em&gt; of failure it surfaces — variant mismatch, slow tokenisation, malformed cart responses, checkout redirect loops — are real, and they're what separate an A-graded manifest from a store an agent can reliably transact against in production.&lt;/p&gt;

&lt;p&gt;That's the gap we'd point a platform team at — and it isn't a percentage, it's a posture. The protocol's first phase, call it the first four months, was about getting the schema right, and the ecosystem did that. The next phase is the unglamorous second-order work: error recovery, schema robustness, response-time SLAs, variant-data hygiene, the long tail of edge cases that separate "manifest valid" from "agent transacts without anything tripping it up." That work &lt;em&gt;is&lt;/em&gt; happening — the Playground sessions above are senior engineers doing exactly it. The open question is whether the posture spreads from the engineering teams already running this loop to the long tail of merchants still on bundled defaults. That's where the next quarter's competitive distance gets built.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demand side: AI traffic is converting
&lt;/h2&gt;

&lt;p&gt;For four months this report has focused on supply — which stores have UCP, what capabilities they declare, the shape of their manifests, what agents do against them in testing. On May 11 Shopify &lt;a href="https://www.shopify.com/enterprise/blog/ai-search-insights" rel="noopener noreferrer"&gt;published its first real demand-side dataset&lt;/a&gt;, and the numbers reframe the urgency of everything above.&lt;/p&gt;

&lt;p&gt;Across Shopify storefronts in Q1 2026, by Shopify's analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-referred orders grew nearly 13× year-over-year.&lt;/strong&gt; Referral sessions from AI chatbots (ChatGPT, Perplexity, Gemini, Copilot, Claude, Grok) grew more than &lt;strong&gt;8× YoY&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-referred sessions convert at ~50% higher rates&lt;/strong&gt; than organic search when they start on product pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average order value is 14% higher&lt;/strong&gt; for AI-referred than for organic-search orders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More than half of AI-referred sessions start on a product detail page&lt;/strong&gt;, vs ~20% for organic — "journey compression," the buyer arrives ready to buy because the AI did the research first.&lt;/li&gt;
&lt;li&gt;AI-referred conversion outperforms organic SEO in &lt;strong&gt;23 of 25 merchant categories&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caveat: this is Shopify's analysis of Shopify storefronts with undisclosed methodology, so treat the precise numbers as Shopify-published rather than independently verified. But the &lt;em&gt;direction&lt;/em&gt; is the story: agentic commerce isn't theoretical traffic any more. It's converting at premium rates, in volume, growing fast — and that's the demand signal that explains why every TC member is racing to ship at the productisation layer right now. Shopify Field CTO Sandy Jeong framed the operational work in three buckets: &lt;strong&gt;data readiness&lt;/strong&gt; (machine-readable catalog with structured attributes), &lt;strong&gt;channel infrastructure&lt;/strong&gt; (direct API syndication to AI platforms), and &lt;strong&gt;organisational alignment&lt;/strong&gt; (a named DRI, not a committee). The teams that get those three right capture the 13× curve; the teams that don't watch it route around them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec and ecosystem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Attribution landed in core.&lt;/strong&gt; On May 5 the Technical Council &lt;a href="https://ucpchecker.com/blog/ucp-tc-ships-attribution-into-core" rel="noopener noreferrer"&gt;merged a top-level &lt;code&gt;attribution&lt;/code&gt; field&lt;/a&gt; into cart, checkout, catalog, and order operations — campaign IDs, click identifiers (&lt;code&gt;gclid&lt;/code&gt;, &lt;code&gt;fbclid&lt;/code&gt;, &lt;code&gt;ttclid&lt;/code&gt;), source/medium markers, as an open string-keyed map. It's the first time advertising-and-measurement infrastructure has landed in UCP core, and the trajectory implication is the story: a protocol that carries attribution context is a protocol being built for commercial-scale deployment, not just technical demos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The council expanded — and the regional question got sharper.&lt;/strong&gt; Amazon, Meta, Microsoft, Salesforce, and Stripe &lt;a href="https://ucpchecker.com/blog/ucp-tech-council-expands-amazon-meta-microsoft-salesforce-stripe" rel="noopener noreferrer"&gt;joined the Technical Council&lt;/a&gt; at the end of April — a governance signal as much as an adoption one (none of the five has shipped a UCP store wave yet), but a notable one: the steering group now includes the company building the leading proprietary alternative (Amazon's "Buy for Me") and the company behind the leading rival protocol (Stripe, ACP). Convergence pressure, formalised.&lt;/p&gt;

&lt;p&gt;Two German commerce trade publications picked up the expansion within a day of each other and used our breakdown of the 16-seat composition as a primary source: &lt;a href="https://excitingcommerce.de/2026/04/27/amazon-schliesst-sich-googles-universal-commerce-protocol-an/" rel="noopener noreferrer"&gt;Exciting Commerce&lt;/a&gt; on April 27 (which drove the European enterprise retail audience &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; was built for), and &lt;a href="https://www.shoptechblog.com/2026/04/28/agentic-commerce-das-ucp-council-wachst/" rel="noopener noreferrer"&gt;Shoptechblog&lt;/a&gt; the next day. Both lead with the same regional point — &lt;em&gt;"Keine Rolle spielen weiter europäische und asiatische Unternehmen"&lt;/em&gt; ("European and Asian companies continue to play no role") — and Shoptechblog adds the analytical layer: the new members sent senior engineers and architects rather than C-suite executives (implementation work, not press); each company's participation reads as defensive; and the real contest isn't the standardised protocol but the layers &lt;em&gt;above&lt;/em&gt; it — ranking, paid placement, customer ownership. Which is exactly why attribution-in-core is more than plumbing: it's the first of those upper layers getting wired into the spec itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two TC members shipped at the productisation layer.&lt;/strong&gt; The contest moving up the stack got two concrete examples this month. On May 5 Google &lt;a href="https://searchengineland.com/google-expands-ucp-checkout-to-main-search-shopping-results-476540" rel="noopener noreferrer"&gt;expanded UCP-powered checkout out of AI Mode into the main shopping section of standard Search results&lt;/a&gt;, with &lt;a href="https://www.thekeyword.co/news/google-ucp-checkout-main-search" rel="noopener noreferrer"&gt;Wayfair the first live retailer on the new surface&lt;/a&gt; — a "Buy" button on listings inside Google Search itself, Google Pay tokenisation, checkout completing without leaving the page. Zero-click search results just became zero-click &lt;em&gt;purchases&lt;/em&gt;. The &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-february-2026" rel="noopener noreferrer"&gt;two-track adoption story&lt;/a&gt; we drew in February has its first major convergence event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fstate-of-agentic-commerce-may-2026%2F02-google-wayfair-flow.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fstate-of-agentic-commerce-may-2026%2F02-google-wayfair-flow.webp" alt="Google AI Mode shopping flow on Wayfair: AI Mode query, product detail with Buy button, Google Pay order review, order complete confirmation" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;
Google's UCP-powered checkout flow on Wayfair: AI Mode query → product page with Buy button → Google Pay review → order complete. Source: Google.



&lt;p&gt;Shopify, separately, started rolling out an &lt;strong&gt;Agentic Storefronts dashboard&lt;/strong&gt; in merchant admin this week (&lt;a href="https://shopify.dev/docs/agents" rel="noopener noreferrer"&gt;live docs&lt;/a&gt;) — surfaces ChatGPT / Microsoft Copilot / AI Mode traffic, offers an "Allow Shopify to manage for me" toggle that auto-generates the AI-readability files (&lt;code&gt;llms.txt&lt;/code&gt;, &lt;code&gt;llms-full.txt&lt;/code&gt;, &lt;code&gt;agents.md&lt;/code&gt;) for stores that opt in. The dashboard is &lt;strong&gt;protocol-agnostic&lt;/strong&gt;: it covers ChatGPT (ACP), Copilot, and UCP-powered Search inside one admin view. UCP is one of the protocols Shopify is now monetising on the agentic-readiness layer, not the whole product. For Shopify it's the natural next step after the &lt;a href="https://ucpchecker.com/blog/ucp-v2026-04-08-spec-update" rel="noopener noreferrer"&gt;v2026-04-08 fleet migration&lt;/a&gt;; for everyone else watching the head start, it's the answer to what the &lt;em&gt;next&lt;/em&gt; phase of it looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fstate-of-agentic-commerce-may-2026%2F01-shopify-agentic-dashboard.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fucpchecker.s3.eu-west-1.amazonaws.com%2Fblog%2Fstate-of-agentic-commerce-may-2026%2F01-shopify-agentic-dashboard.webp" alt="Shopify Agentic Storefronts dashboard in merchant admin showing 2,060 agentic sessions and $6,447 earned in the last 30 days, split by ChatGPT, Microsoft Copilot, and Shop Channel, with an 'Allow Shopify to manage for me' toggle and agentic readiness checklist" width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;
Shopify Agentic Storefronts in merchant admin — ChatGPT / Microsoft Copilot / Shop Channel split, "Allow Shopify to manage for me" toggle, agentic-readiness checklist.



&lt;p&gt;&lt;strong&gt;A potential spec gap, still being validated.&lt;/strong&gt; In &lt;a href="https://ucpchecker.com/blog/ucp-variant-data-guide" rel="noopener noreferrer"&gt;the variant-data guide&lt;/a&gt; we noted that v2026-04-08 makes &lt;code&gt;variant.options[]&lt;/code&gt; optional even on products where &lt;code&gt;product.options[]&lt;/code&gt; is non-empty and there are multiple variants — meaning two fully spec-compliant manifests can produce identical-looking payloads where one is unambiguous and the other is agent-unresolvable. The candidate fix would be a conditional &lt;code&gt;MUST&lt;/code&gt; ("when &lt;code&gt;product.options&lt;/code&gt; is non-empty and &lt;code&gt;variants.length &amp;gt; 1&lt;/code&gt;, every variant MUST populate &lt;code&gt;options[]&lt;/code&gt;"). It's a working hypothesis from one analysis, not a filed proposal — we want to sweep more of the live dataset for real-world incidence and check the edge cases (single-variant simple products, productGroup behaviour, platforms that already populate &lt;code&gt;options&lt;/code&gt; by default) before raising it formally. If the pattern holds, it's a candidate for a future minor release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No v2026-05.&lt;/strong&gt; v2026-04-08 remains current. On the cadence so far, the next minor release more likely lands late summer (a notional v2026-08), probably bundling AP2 mandate refinements, schema corrections shaken out by running validators against thousands of real stores, and whatever the council formalises over the next two months. On the partner side: the &lt;a href="https://ucpregistry.com" rel="noopener noreferrer"&gt;registry&lt;/a&gt; now lists 61 merchants, 11 agents, and 8 extensions; the payment-handler roster (Adyen, Amex, Mastercard, Stripe, Visa, Checkout.com, Affirm, Splitit, PayPal) is unchanged and still almost entirely unrepresented in live manifest declarations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we shipped — and what developers are doing with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/blog/ucp-variant-data-guide" rel="noopener noreferrer"&gt;UCP Variant Data: The #1 Reason Agent Checkouts Fail&lt;/a&gt;&lt;/strong&gt; — the five variant-data anti-patterns, what clean variant data looks like, and the spec gap that lets compliant stores still be broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/blog/how-to-test-ucp-implementation" rel="noopener noreferrer"&gt;How to Test Your UCP Implementation&lt;/a&gt;&lt;/strong&gt; — the three-layer validation workflow: static audit, live agent test, continuous monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; is doing exactly what it was built to do.&lt;/strong&gt; This is the one we're proudest of this quarter. The Score turns "is my manifest agent-ready?" into a concrete, category-by-category checklist — and developers are using it that way: we've watched a failing manifest climb to an A grade in the space of a few hours, the developer iterating against the score breakdown between checks. That's the loop it was designed for, and it's now the loop it runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ucpplayground.com" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt; got sharper as a development tool.&lt;/strong&gt; Two halves of the same loop: the agent-inspection tooling — replay any session, see the exact tool call where an agent tripped — and the runtime shopping evals, now past &lt;strong&gt;1,000 recorded sessions&lt;/strong&gt; and &lt;strong&gt;more than 12 hours of cumulative agent runtime&lt;/strong&gt; against real stores. Together they take the build → test → fix cycle for an agent-ready storefront down from a sprint to an afternoon. Every improvement that got us there is in the &lt;a href="https://ucpplayground.com/changelog" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crawler throughput&lt;/strong&gt; — we roughly tripled the hourly crawl rate in early May (and added per-IP and global throttles to the expensive public routes so the directory stays fast under load). That's what moved the discovery curve this month.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to watch in June
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Second adopters at every edge.&lt;/strong&gt; May produced first adopters across multiple novel patterns — non-Shopify platforms shipping UCP (Bareconnect, Selly.io), a consultancy-built accelerator (PwC), non-default payment-handler integrations (the processors in dev), AP2 mandate (still one), third-party capability namespaces (each at 1–2 stores). The diagnostic for June is whether any doubles up. Each is a distinct watch item; the meta-question is the same: did May's first adopters survive contact with month two?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google's next live partner on main Search.&lt;/strong&gt; Wayfair is first up on Google's UCP-checkout expansion into standard Search results. The other co-developing TC retailers — Etsy, Target, Walmart — are the next-most-likely to follow. The cadence of those rollouts is the diagnostic for how fast Google is willing to push agent-completed transactions onto its highest-traffic surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The platform-level integration question.&lt;/strong&gt; SFCC, Adobe Commerce, Wix, Squarespace — any of them shipping a platform-level UCP integration is still the single highest-impact possible event, and still hasn't happened. The one-platform structure is four months old.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whether the eval leaderboard holds its shape.&lt;/strong&gt; Claude Sonnet 4.5 leads checkout completion on the largest sample; Llama 3.3 70B is the surprise second. Another month of sessions either confirms that or reshuffles it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;All data is from the UCP Checker crawler (re-checks every tracked domain at least every 24 hours) and UCP Playground's eval sessions, as of May 12, 2026. The verified-merchant dataset is published monthly on &lt;a href="https://huggingface.co/datasets/UCPChecker/ucp-merchants" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt; under CC-BY 4.0; the same data, a public REST API, the bulk checker, and the rest of our &lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;developer tools&lt;/a&gt; are all ungated.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse the directory: &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;ucpchecker.com/directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Track adoption live: &lt;a href="https://ucpchecker.com/stats" rel="noopener noreferrer"&gt;ucpchecker.com/stats&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run a UCP Score: &lt;a href="https://ucpchecker.com/score" rel="noopener noreferrer"&gt;ucpchecker.com/score&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Model + store leaderboard: &lt;a href="https://ucpplayground.com/evals" rel="noopener noreferrer"&gt;ucpplayground.com/evals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Public dataset, REST API &amp;amp; developer tools: &lt;a href="https://ucpchecker.com/developer-tools" rel="noopener noreferrer"&gt;ucpchecker.com/developer-tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Previous report: &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-april-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce — April 2026&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;External coverage cited in this report:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jochen Krisch, &lt;em&gt;"Amazon schließt sich Googles Universal Commerce Protocol an,"&lt;/em&gt; &lt;a href="https://excitingcommerce.de/2026/04/27/amazon-schliesst-sich-googles-universal-commerce-protocol-an/" rel="noopener noreferrer"&gt;Exciting Commerce&lt;/a&gt;, April 27, 2026&lt;/li&gt;
&lt;li&gt;Roman Zenner, &lt;em&gt;"Agentic Commerce: Das UCP Council wächst,"&lt;/em&gt; &lt;a href="https://www.shoptechblog.com/2026/04/28/agentic-commerce-das-ucp-council-wachst/" rel="noopener noreferrer"&gt;Shoptechblog&lt;/a&gt;, April 28, 2026&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://searchengineland.com/google-expands-ucp-checkout-to-main-search-shopping-results-476540" rel="noopener noreferrer"&gt;Google expands UCP Checkout to main Search shopping results&lt;/a&gt;, Search Engine Land, May 2026&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.google/products/ads-commerce/agentic-commerce-ai-tools-protocol-retailers-platforms/" rel="noopener noreferrer"&gt;New tech and tools for retailers to succeed in an agentic shopping era&lt;/a&gt;, Google blog (Ads &amp;amp; Commerce)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://shopify.dev/docs/agents" rel="noopener noreferrer"&gt;Shopify Agentic commerce developer docs&lt;/a&gt; — Agentic Storefronts, &lt;code&gt;llms.txt&lt;/code&gt;, &lt;code&gt;llms-full.txt&lt;/code&gt;, &lt;code&gt;agents.md&lt;/code&gt; reference&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.wislr.com/research/what-shopify-checks-for-agentic-readiness" rel="noopener noreferrer"&gt;What Shopify checks for agentic readiness&lt;/a&gt;, WISLR Research&lt;/li&gt;
&lt;li&gt;Kyle Risley, &lt;a href="https://www.shopify.com/enterprise/blog/ai-search-insights" rel="noopener noreferrer"&gt;"AI-referred shoppers convert better and spend more (2026)"&lt;/a&gt;, Shopify Enterprise Blog, May 11, 2026&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>data</category>
      <category>ucp</category>
    </item>
    <item>
      <title>UCP Variant Data: The #1 Reason Agent Checkouts Fail</title>
      <dc:creator>Benji Fisher</dc:creator>
      <pubDate>Wed, 13 May 2026 11:12:54 +0000</pubDate>
      <link>https://dev.to/benjifisher/ucp-variant-data-the-1-reason-agent-checkouts-fail-4jp5</link>
      <guid>https://dev.to/benjifisher/ucp-variant-data-the-1-reason-agent-checkouts-fail-4jp5</guid>
      <description>&lt;p&gt;A user asks an AI shopping agent for "a medium grey t-shirt." The agent finds the product. It picks a variant. It adds it to the cart. The merchant rejects the cart. The agent retries with a different variant. The merchant rejects that one too. The session ends in &lt;code&gt;cart_created&lt;/code&gt; without a checkout — the user's $40 purchase quietly disappears, and nobody on the merchant side ever sees the failure.&lt;/p&gt;

&lt;p&gt;This pattern is the &lt;strong&gt;single largest source of agent checkout failures we see across the 4,500+ verified UCP stores in the &lt;a href="https://ucpchecker.com/directory" rel="noopener noreferrer"&gt;directory&lt;/a&gt;&lt;/strong&gt;. More than schema invalidity, more than tool errors, more than payment-handler problems. Variant mismatch — the agent and the merchant disagreeing on which SKU corresponds to "Medium" — is responsible for a meaningful fraction of the gap between "store has a UCP manifest" and "agent can actually buy from it."&lt;/p&gt;

&lt;p&gt;The good news: it's almost entirely fixable on the merchant side, in your variant data structure, without changing any tooling. This post walks through the failure pattern, the five most common variant data anti-patterns we observe, and what clean variant data looks like in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a variant mismatch
&lt;/h2&gt;

&lt;p&gt;Here's the cleanest way to see the failure:&lt;/p&gt;

&lt;p&gt;Two frontier agents — call them Agent A and Agent B — get the same prompt against the same store: &lt;em&gt;"Add a medium grey t-shirt to my cart."&lt;/em&gt; Both agents call &lt;code&gt;search_catalog&lt;/code&gt;, both get the same product back, both see three variants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5571"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Small"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5572"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5573"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Large"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent A picks &lt;code&gt;var_5572&lt;/code&gt;. Agent B picks &lt;code&gt;var_5572&lt;/code&gt;. Both add to cart. Both succeed. &lt;strong&gt;Clean data, predictable behaviour.&lt;/strong&gt; Each variant declares its options as an array of &lt;code&gt;{name, label}&lt;/code&gt; pairs — the spec's &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/selected_option.json" rel="noopener noreferrer"&gt;&lt;code&gt;selected_option&lt;/code&gt;&lt;/a&gt; shape — so the agent matches "medium" against the &lt;code&gt;Size&lt;/code&gt; axis unambiguously.&lt;/p&gt;

&lt;p&gt;Now the broken version. Same prompt, same product, but the variant data looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5571"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"S"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5572"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"M"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5573"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"L"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5574"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium / Regular Fit"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5575"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grey"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium / Slim Fit"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent A picks &lt;code&gt;var_5572&lt;/code&gt; (interpreting "M" as the canonical "Medium"). Agent B picks &lt;code&gt;var_5574&lt;/code&gt; (interpreting "Medium / Regular Fit" as the more explicit match). &lt;strong&gt;Neither is wrong.&lt;/strong&gt; The user said "medium" and both interpretations are defensible. But because the variant data conflates two different axes — size and fit — into a single &lt;code&gt;Size&lt;/code&gt; label, the two agents diverge, and the user's experience depends on which model they're using. The spec form makes the bug obvious: &lt;code&gt;Fit&lt;/code&gt; should be its own &lt;code&gt;selected_option&lt;/code&gt;, not crammed into the &lt;code&gt;Size&lt;/code&gt; label.&lt;/p&gt;

&lt;p&gt;Worse: many real implementations don't even include the option labels. They expose only opaque variant IDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5571"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5572"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5573"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the agent has no way to know which variant corresponds to "Medium" at all. It guesses. Sometimes it guesses right. Often it doesn't. That's how checkout sessions end up in &lt;code&gt;cart_created&lt;/code&gt; without ever reaching &lt;code&gt;checkout_reached&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is the #1 failure mode
&lt;/h2&gt;

&lt;p&gt;Across the &lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;Playground session dataset&lt;/a&gt;, roughly &lt;strong&gt;62% of sessions end without a completed checkout&lt;/strong&gt;. The breakdown is informative:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;checkout_reached&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;search_only&lt;/code&gt; (browsed, didn't add)&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;failed&lt;/code&gt; (provider error, model refusal, max turns)&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;cart_created&lt;/code&gt; (added, didn't proceed)&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;cart_created&lt;/code&gt; cohort — sessions where the agent successfully picked something but couldn't finish — is the variant-mismatch signal. The agent had enough information to add to cart but the cart contents weren't valid for checkout. That's the structural shape of "wrong variant picked."&lt;/p&gt;

&lt;p&gt;Roughly half of the categorised &lt;code&gt;failed&lt;/code&gt; sessions are also variant-shape problems — the agent picked a variant ID that the cart endpoint rejects, retried with another, hit &lt;code&gt;max_turns_exceeded&lt;/code&gt; while flailing through the variant list. Add those in and &lt;strong&gt;variant-related failures account for somewhere around a fifth of all sessions&lt;/strong&gt;, which is more than any other categorisable failure mode.&lt;/p&gt;

&lt;p&gt;The thing that makes this pattern so consistent: &lt;strong&gt;clean variant data is not part of UCP Score or schema validation&lt;/strong&gt;. A store can pass &lt;a href="https://ucpchecker.com/blog/introducing-ucp-score-agent-readiness-grade" rel="noopener noreferrer"&gt;UCP Score&lt;/a&gt; at A grade and still emit variant data that breaks every agent in the field. The validator looks at whether the manifest parses; it doesn't look at whether the variants are agent-resolvable. That gap is exactly why this post exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  A spec gap that compounds the problem
&lt;/h2&gt;

&lt;p&gt;Even when a store is fully UCP-compliant, the protocol leaves room for ambiguity. The 2026-04-08 schema makes &lt;code&gt;variant.options[]&lt;/code&gt; optional — including on products where &lt;code&gt;product.options[]&lt;/code&gt; is non-empty and there are multiple variants. So a payload like &lt;code&gt;{"options": [{"name": "Size", "values": [{"label": "Small"}, {"label": "Medium"}]}], "variants": [{"id": "var_a"}, {"id": "var_b"}]}&lt;/code&gt; is technically valid but agent-unresolvable: nothing links &lt;code&gt;var_a&lt;/code&gt; to "Small" rather than "Medium." Two consumers looking at this payload can defensibly pick different variants for the same prompt.&lt;/p&gt;

&lt;p&gt;A conditional &lt;code&gt;MUST&lt;/code&gt; in the spec — &lt;em&gt;"when &lt;code&gt;product.options&lt;/code&gt; is non-empty and &lt;code&gt;variants.length &amp;gt; 1&lt;/code&gt;, every variant MUST populate &lt;code&gt;options[]&lt;/code&gt;"&lt;/em&gt; — would close this cleanly. Until that lands, agent-resolvability is on the merchant rather than the protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five variant anti-patterns
&lt;/h2&gt;

&lt;p&gt;In rough order of frequency observed across the dataset:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Opaque variant IDs with no option metadata
&lt;/h3&gt;

&lt;p&gt;The shape from the third example above — variants exposed only as &lt;code&gt;var_5572&lt;/code&gt;, no &lt;code&gt;options&lt;/code&gt;, no &lt;code&gt;attributes&lt;/code&gt;, no human-readable axis. Agents have no way to map a user's "Medium" to a specific ID. They either guess or pick the first variant, both of which produce wrong outcomes routinely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; every variant must carry the axis values that distinguish it from siblings, in the spec's &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/selected_option.json" rel="noopener noreferrer"&gt;&lt;code&gt;selected_option&lt;/code&gt;&lt;/a&gt; array form: &lt;code&gt;"options": [{"name": "Size", "label": "Medium"}, {"name": "Color", "label": "Grey"}]&lt;/code&gt;. The &lt;code&gt;name&lt;/code&gt; field tells the agent which axis the value belongs to; &lt;code&gt;label&lt;/code&gt; is what gets matched against the user's request. Whatever the product's options page shows to a human shopper — size, colour, material, fit — the variant data should expose programmatically with one &lt;code&gt;selected_option&lt;/code&gt; entry per axis.&lt;/p&gt;

&lt;p&gt;The corollary: descriptive attributes that aren't selection axes belong in &lt;code&gt;metadata&lt;/code&gt;, not &lt;code&gt;product.options[]&lt;/code&gt;. A one-variant simple product with "Color: Gray" should expose Gray as &lt;code&gt;metadata.attributes&lt;/code&gt;, not as a single-value &lt;code&gt;product.option&lt;/code&gt; — otherwise consumer UIs render a one-button picker that looks selectable but isn't. The split: &lt;code&gt;product.options[]&lt;/code&gt; is for axes the buyer chooses across; &lt;code&gt;metadata&lt;/code&gt; is for descriptive properties of the (only) variant.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Conflated axes in a single string
&lt;/h3&gt;

&lt;p&gt;The shape from the second example — &lt;code&gt;"Medium / Regular Fit"&lt;/code&gt; as a single option value where size and fit are two separate user choices. Agents can parse this, but inconsistently across models, because the conflation is ambiguous. Different models split the string differently, and the variant they end up picking depends on which side of the slash they prioritise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; each variant attribute lives in its own field. Don't compose. If your product has size + fit as two axes, the variant data should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5574"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Regular"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two clean axes, two unambiguous values, no string parsing required. Agents pick consistently. The array-of-&lt;code&gt;selected_option&lt;/code&gt; form is the shape UCP &lt;code&gt;2026-04-08&lt;/code&gt; defines for &lt;code&gt;variant.options&lt;/code&gt; — see &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/selected_option.json" rel="noopener noreferrer"&gt;&lt;code&gt;selected_option.json&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Inconsistent labelling between sibling variants
&lt;/h3&gt;

&lt;p&gt;Not all variants on the same product use the same option vocabulary. One says &lt;code&gt;"M"&lt;/code&gt;, another says &lt;code&gt;"Medium"&lt;/code&gt;, another says &lt;code&gt;"med"&lt;/code&gt;. We see this on stores that have grown organically — different teams added variants over different years, naming conventions drifted, the inconsistency is invisible to the merchandising team because the storefront UI hides it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; one canonical label per axis value, applied consistently across every variant on every product. If "Medium" is the canonical label, every Medium variant uses exactly &lt;code&gt;"Medium"&lt;/code&gt;. No &lt;code&gt;"M"&lt;/code&gt;, no &lt;code&gt;"med"&lt;/code&gt;, no &lt;code&gt;"Medium "&lt;/code&gt; (trailing space). Agents reason by string match; consistency is what makes the match reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Missing or inconsistent stock / availability flags
&lt;/h3&gt;

&lt;p&gt;A variant exists in the catalogue but is sold out, and the variant data doesn't say so. The agent picks it, the cart accepts the add, the checkout endpoint rejects it. The agent doesn't know to retry with a different variant — it had no signal that the variant was unavailable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; every variant declares its &lt;code&gt;availability&lt;/code&gt; object — &lt;code&gt;{"available": true, "status": "in_stock"}&lt;/code&gt; is the spec shape, with well-known status values &lt;code&gt;in_stock&lt;/code&gt;, &lt;code&gt;backorder&lt;/code&gt;, &lt;code&gt;preorder&lt;/code&gt;, &lt;code&gt;out_of_stock&lt;/code&gt;, and &lt;code&gt;discontinued&lt;/code&gt;. Agents skip unavailable variants if you tell them to, and &lt;code&gt;status&lt;/code&gt; gives them enough signal to decide whether to wait, substitute, or surface an out-of-stock message to the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Declared axes that variants don't honor
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;product.options[]&lt;/code&gt; declares the selectable axes; &lt;code&gt;variants[]&lt;/code&gt; is the universe of actual purchasable combinations. When the cardinality of declared axes doesn't match what variants actually carry — e.g., &lt;code&gt;product.options&lt;/code&gt; declares Color × Size = 9 combinations but only 3 color-only variants exist — agents try to satisfy a Size selection that no variant honors. Strict consumers return null and refuse to add; lenient consumers guess and pick wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; keep &lt;code&gt;product.options[]&lt;/code&gt; and &lt;code&gt;variants[]&lt;/code&gt; in sync. Either every declared axis combination has a corresponding variant, or the axis shouldn't be in &lt;code&gt;product.options[]&lt;/code&gt;. If sizes aren't actually configurable for this product, drop &lt;code&gt;Size&lt;/code&gt; from the axes; don't leave it dangling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What clean variant data looks like
&lt;/h2&gt;

&lt;p&gt;Here's the shape that resolves cleanly across every frontier model we test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod_42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Heavyweight Crew Tee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Heavyweight cotton crew-neck tee."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price_range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charcoal"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Small"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium"&lt;/span&gt;&lt;span class="p"&gt;}]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Regular"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5571"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charcoal / Small / Regular"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Heavyweight crew tee, charcoal, size small, regular fit."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"availability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charcoal"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Small"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Regular"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"var_5572"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charcoal / Medium / Regular"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Heavyweight crew tee, charcoal, size medium, regular fit."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"availability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Color"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charcoal"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Size"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Medium"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Regular"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four spec fields make this work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;product.options&lt;/code&gt;&lt;/strong&gt; at the product level — declares the axes (&lt;code&gt;Color&lt;/code&gt;, &lt;code&gt;Size&lt;/code&gt;, &lt;code&gt;Fit&lt;/code&gt;) and their valid values as an array of &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/product_option.json" rel="noopener noreferrer"&gt;&lt;code&gt;product_option&lt;/code&gt;&lt;/a&gt; &lt;code&gt;{name, values: [{label}]}&lt;/code&gt;. Agents know upfront how many dimensions a variant occupies and what values are valid on each axis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;variant.options&lt;/code&gt;&lt;/strong&gt; as an array of &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/selected_option.json" rel="noopener noreferrer"&gt;&lt;code&gt;selected_option&lt;/code&gt;&lt;/a&gt; &lt;code&gt;{name, label}&lt;/code&gt; — each axis has its own entry, no string parsing, no conflation. The &lt;code&gt;name&lt;/code&gt; matches the product-level axis; the &lt;code&gt;label&lt;/code&gt; matches the user's request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;variant.availability&lt;/code&gt;&lt;/strong&gt; with &lt;code&gt;available&lt;/code&gt; and &lt;code&gt;status&lt;/code&gt; — agents skip unavailable variants without trial-and-error, and &lt;code&gt;status&lt;/code&gt; (&lt;code&gt;in_stock&lt;/code&gt;, &lt;code&gt;backorder&lt;/code&gt;, &lt;code&gt;preorder&lt;/code&gt;, &lt;code&gt;out_of_stock&lt;/code&gt;, &lt;code&gt;discontinued&lt;/code&gt;) gives them enough signal to wait, substitute, or surface the right message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required scaffolding&lt;/strong&gt; — &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, and &lt;code&gt;price&lt;/code&gt; on every &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/variant.json" rel="noopener noreferrer"&gt;variant&lt;/a&gt;, and &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;price_range&lt;/code&gt;, &lt;code&gt;variants&lt;/code&gt; on the &lt;a href="https://ucp.dev/2026-04-08/schemas/shopping/types/product.json" rel="noopener noreferrer"&gt;product&lt;/a&gt;. These aren't "nice to have"; they're the schema's required fields. Variants missing any of them won't validate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Bonus stability:&lt;/strong&gt; when present, &lt;code&gt;option_value.id&lt;/code&gt; and &lt;code&gt;selected_option.id&lt;/code&gt; give stable identifiers that survive label drift. If your platform supports it (most do — Shopify uses GIDs, WooCommerce uses &lt;code&gt;pa_*&lt;/code&gt; taxonomy slugs), populate &lt;code&gt;id&lt;/code&gt; alongside &lt;code&gt;label&lt;/code&gt; and consumers can match on the stable key when labels change.&lt;/p&gt;

&lt;p&gt;Stores running variant data in this shape resolve user prompts to specific variants reliably across every model we've benchmarked. The pattern isn't novel — it's the same shape Shopify uses internally, the same shape WooCommerce variations use when properly structured, the same shape every traditional e-commerce platform ends up at after enough years of evolution. UCP just exposes it programmatically to the agent layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to validate your variant data
&lt;/h2&gt;

&lt;p&gt;Three layers, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Static audit.&lt;/strong&gt; Run your store through &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;UCPChecker&lt;/a&gt;. The validator surfaces variants with missing &lt;code&gt;options&lt;/code&gt; data, conflated axes, inconsistent labels across sibling variants, and missing availability flags. None of this is part of strict UCP-spec conformance, but our &lt;a href="https://ucpchecker.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt; flags variant-quality issues as part of the Capability Coverage score because they materially affect whether agents can transact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Live agent test.&lt;/strong&gt; Run a multi-model agent session against your store via &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;UCP Playground&lt;/a&gt;. The framework exercises the full search → variant-pick → cart → checkout flow against frontier agents across &lt;a href="https://ucpplayground.com/models" rel="noopener noreferrer"&gt;15+ models&lt;/a&gt;. If your variant data is ambiguous, you'll see different models pick different variants for the same prompt — the exact pattern we walk through in &lt;a href="https://ucpchecker.com/blog/ucp-playground-1000-agent-sessions" rel="noopener noreferrer"&gt;the Playground 1,000-sessions analysis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Continuous monitoring.&lt;/strong&gt; Variant data changes over time as you add products and SKUs. Set up &lt;a href="https://ucpchecker.com/alerts" rel="noopener noreferrer"&gt;UCP Alerts&lt;/a&gt; so you get notified when a variant audit starts surfacing new issues — typically a sign that a recent merchandising change introduced inconsistent labelling at scale.&lt;/p&gt;

&lt;p&gt;The order matters. Static audit catches the easy cases (missing fields, schema-shaped problems) cheaply. Live agent test catches the cases where the schema is fine but agents disagree (the conflated-axis cases, the inconsistent-label cases). Monitoring catches drift over time. Skipping any of the three leaves a class of variant problems undetected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to fix in your store, and how to verify it
&lt;/h2&gt;

&lt;p&gt;If you're a merchant reading this and your store is running on &lt;a href="https://ucpchecker.com/platforms/shopify" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/woocommerce" rel="noopener noreferrer"&gt;WooCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/bigcommerce" rel="noopener noreferrer"&gt;BigCommerce&lt;/a&gt;, &lt;a href="https://ucpchecker.com/platforms/magento" rel="noopener noreferrer"&gt;Magento&lt;/a&gt;, or &lt;a href="https://ucpchecker.com/platforms/prestashop" rel="noopener noreferrer"&gt;PrestaShop&lt;/a&gt;, the variant data structure is mostly determined by your platform's defaults. The platform-specific fixes are documented in the platform guides — but the meta-pattern is the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Audit&lt;/strong&gt; at &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt; — get a list of variant-data issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix&lt;/strong&gt; the most common one first (usually missing &lt;code&gt;options&lt;/code&gt; metadata)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test&lt;/strong&gt; at &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;ucpplayground.com&lt;/a&gt; with two different models against the same product, asking for the same variant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt; that both models pick the same variant ID consistently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor&lt;/strong&gt; weekly — variant drift is the most common reason a store's UCP Score regresses&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Variant data is a back-office data-quality problem dressed up as an agentic commerce problem. The fix is mostly editorial — get your axis labels consistent, expose your option values structurally, mark sold-out variants as such. None of this is technically hard. It's the kind of work that adds up to "agents can buy from your store" rather than "agents try to buy from your store and quietly fail."&lt;/p&gt;

&lt;p&gt;If you fix one thing on the agent-readiness side this quarter, fix variant data. The conversion lift is bigger than any other single change you can make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing worth naming:&lt;/strong&gt; consumer tools that silently paper over variant data problems (substring matching, positional guessing, falling back to &lt;code&gt;variants[0]&lt;/code&gt;) make this worse, not better. They hide the failure mode from merchants who would otherwise see it and fix the data. Faithful rendering — null when the match is ambiguous, errors when the data is inconsistent — is what produces correct merchant behaviour. If your variant data only works in some agents, that's a signal the data is the problem, not the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit your variants now&lt;/strong&gt;: &lt;a href="https://ucpchecker.com/check" rel="noopener noreferrer"&gt;ucpchecker.com/check&lt;/a&gt; — flags variant issues alongside the rest of the UCP Score&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test variant resolution with real agents&lt;/strong&gt;: &lt;a href="https://ucpplayground.com/" rel="noopener noreferrer"&gt;ucpplayground.com&lt;/a&gt; — run two models against your store on the same prompt, see if they pick the same variant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the broader failure-mode taxonomy&lt;/strong&gt;: &lt;a href="https://ucpchecker.com/blog/common-ucp-errors" rel="noopener noreferrer"&gt;Common UCP Errors and How to Fix Them&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track ecosystem-wide variant adoption&lt;/strong&gt;: &lt;a href="https://ucpchecker.com/blog/state-of-agentic-commerce-april-2026" rel="noopener noreferrer"&gt;State of Agentic Commerce — April 2026&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ucp</category>
    </item>
  </channel>
</rss>
