UCP Checker

What is /.well-known/ucp?

One JSON file at a fixed address on your store that tells a UCP agent what it can do there: find products, build a cart, check out and pay. Here is what goes in it, what each part lets an agent do, and how to publish it so it passes.

https://yourstore.com/.well-known/ucp

The address follows the well-known URI convention, so an agent never has to search for it. Without the file, an agent is left reading your pages like a crawler, guessing at products and forms, and it usually fails at checkout. With it, the agent gets a contract: the capabilities you offer, the transports it can use and the payment methods you accept, each with its endpoint and schema.

The profile, in the order an agent reads it

The smallest profile that passes against release 2026-08-25, split into its five parts.

  1. {
      "ucp": {
        "version": "2026-08-25",
    1ucp.versionrequired

    Which release the store follows

    The agent reads this first and applies that release's rules to everything below. A release is a date, YYYY-MM-DD.

    Must be a published release. "2026", "1.0.0" or a typo fails.

  2.     "services": {
          "dev.ucp.shopping": [
            {
              "version": "2026-08-25",
              "spec": "https://ucp.dev/2026-08-25/specification/overview",
              "transport": "rest",
              "schema": "https://ucp.dev/2026-08-25/services/shopping/rest.openapi.json",
              "endpoint": "https://yourstore.com/ucp"
            }
          ]
        },
    2ucp.servicesrequired

    Where the agent sends requests

    One entry per transport: REST, MCP or A2A to call your services, Embedded to open your checkout in the buyer's browser. Without a reachable service, the rest of the profile is a promise.

    Every entry names its transport and endpoint, at the same version as ucp.version.

  3.     "capabilities": {
          "dev.ucp.shopping.checkout": [
            {
              "version": "2026-08-25",
              "spec": "https://ucp.dev/2026-08-25/specification/shopping/checkout",
              "schema": "https://ucp.dev/2026-08-25/schemas/shopping/checkout.json"
            }
          ]
        },
    3ucp.capabilitiesoptional, but a store that sells declares checkout

    What the agent may do here

    Catalog search lets it find products, cart and checkout let it buy, identity linking lets it act for a signed-in buyer, a permalink sends the buyer to your website.

    Every capability declares a schema. An extension names its parent in extends, and is dropped if the parent is missing.

  4.     "payment_handlers": {
          "com.example.processor": [
            {
              "id": "processor-1",
              "version": "2026-08-25",
              "spec": "https://example.com/ucp/handler",
              "schema": "https://example.com/ucp/handler/schema.json"
            }
          ]
        }
      },
    4ucp.payment_handlersrequired, even when empty

    How the agent pays

    The payment methods you accept and how to tokenise them, so card data never passes through the agent. Each handler has a unique id.

    Handlers version on their own schedule, so their version need not match ucp.version.

  5.   "keys": [
        {
          "kty": "EC",
          "crv": "P-256",
          "kid": "store-2026-10",
          "x": "…",
          "y": "…"
        }
      ]
    }
    5keysoptional, at the root

    How the agent checks your messages

    The public keys (a JWK Set) an agent uses to verify messages your store signs, such as order webhooks.

    Sits beside ucp, not inside it, and every key has a kid. Since 2026-08-25 it is keys; it used to be signing_keys.

the whole profile
{
  "ucp": {
    "version": "2026-08-25",
    "services": {
      "dev.ucp.shopping": [
        {
          "version": "2026-08-25",
          "spec": "https://ucp.dev/2026-08-25/specification/overview",
          "transport": "rest",
          "schema": "https://ucp.dev/2026-08-25/services/shopping/rest.openapi.json",
          "endpoint": "https://yourstore.com/ucp"
        }
      ]
    },
    "capabilities": {
      "dev.ucp.shopping.checkout": [
        {
          "version": "2026-08-25",
          "spec": "https://ucp.dev/2026-08-25/specification/shopping/checkout",
          "schema": "https://ucp.dev/2026-08-25/schemas/shopping/checkout.json"
        }
      ]
    },
    "payment_handlers": {
      "com.example.processor": [
        {
          "id": "processor-1",
          "version": "2026-08-25",
          "spec": "https://example.com/ucp/handler",
          "schema": "https://example.com/ucp/handler/schema.json"
        }
      ]
    }
  },
  "keys": [
    {
      "kty": "EC",
      "crv": "P-256",
      "kid": "store-2026-10",
      "x": "…",
      "y": "…"
    }
  ]
}

Replace com.example.processor with your payment provider's handler, and the endpoints with yours. Every dev.ucp.* entry carries the same version as ucp.version.

Check trace

What an agent finds when the profile is right

The same trace every status page shows, on an illustrative store that offers all five ways in. Check your store to see yours.

4 of 5 open
6 requests · 350 ms at the store · public requests only
  1. Finding the profile
    Open
  2. Acting for the buyer
    Offered
  3. In the buyer's browser
    Declared
  4. Calling its services
    Open
  5. Sending the buyer to the website
    Offered
UCP Checkerpublic requests
  • 2 requestsFinding the profile/.well-known/ucp · 200
  • read from profileActing for the buyerdeclared · accounts.yourstore.com
  • not calledIn the buyer's browserEmbedded · declared
  • 2 requestsCalling its servicesREST, MCP · answered
  • read from profileSending to the websitedeclared · /buy
  • 2 requestsOutside UCPhomepage · /llms.txt
Open
01 · Finding the profile2 requests
Served at /.well-known/ucp with 200 OK, 3.0 KB. robots.txt allows /.well-known/ucp.
Offered
02 · Acting for the buyerread from profile
The buyer can sign the agent in to their own account through accounts.yourstore.com.
Declared
03 · In the buyer's browsernot called
Declared. We don't call it, so whether it works shows only in an agent run.
Open
04 · Calling its services2 requests
The REST service answered at its address (200). The MCP service answered tools/list in 140 ms.
Offered
05 · Sending the buyer to the websiteread from profile
An agent can hand over a ready cart at yourstore.com/buy.
  1. 01 PROFILEGET /.well-known/ucp → 200, 3.0 KB of JSON120 ms
  2. 01 PROFILEGET /robots.txt → allows /.well-known/ucp–
  3. 01 PROFILEValid against the 2026-08-25 schema; keys publishedlocal
  4. 04 SERVICESPOST /mcp tools/list → 200140 ms
  5. 04 SERVICESGET /ucp → 20090 ms
  6. 03 NOTEEmbedded service declared; not called by this check–
  7. OUTSIDE UCPGET / → 200, Organization schema found–
  8. OUTSIDE UCPGET /llms.txt → 200, 2.3 KB–

The request it has to pass

Any server will do. What matters is the answer an agent gets, and the live check tests each line.

The agent asks
GET /.well-known/ucp HTTP/1.1
Host: yourstore.com
Accept: application/json
Your store answers
  • 200 OKat that exact URL: no redirect to www or another host
  • Content-Type: application/jsonnot text/plain or text/html
  • Cache-Control: public, max-age=300public, at least 60 seconds; never private or no-store
  • ETag or Last-Modifiedso an agent can revalidate its copy cheaply
  • robots.txtallows /.well-known/ucp, and no firewall rule turns agents away

How to serve it

Nginx
location = /.well-known/ucp {
    default_type application/json;
    alias /var/www/ucp.json;
    add_header Cache-Control "public, max-age=300";
}

The mistakes we see most

from real checks
Mistake
Served with the wrong Content-Type
text/plain or text/html breaks strict agents. Serve application/json. How to fix →
Mistake
Behind a redirect
The spec forbids redirects on the profile: an agent that follows it asks your domain, gets a redirect and stops. Serve it at the exact URL, with no hop to www or another host. Check for it →
Mistake
Blocked by a firewall
Some firewalls answer non-browser requests with 403 even though the file exists. Allow /.well-known/ucp explicitly. How to fix →
Mistake
Disallowed in robots.txt
Agents respect robots.txt. If the path is disallowed, they won't fetch the profile. Add an explicit allow rule. How to fix →
Mistake
Keys in the wrong place
2026-08-25 replaced signing_keys with keys, a JWK Set beside ucp. Keys nested under ucp fail. How to fix →
Mistake
A service with no transport
Every service entry needs transport: rest, mcp, a2a or embedded. Without it the service is unreachable. How to fix →
Mistake
A version that isn't a release
Typos, "2026" or "1.0.0" fail. Use a published release date. How to fix →

Check yours

It's live

Read it at its address, with the request above, and see what a UCP agent finds.

It's not live yet

Paste the profile and check it against its release with the same rules. Nothing is stored.

Questions

What is /.well-known/ucp?
A JSON profile served at the /.well-known/ucp path on your store origin that advertises how AI shopping agents can discover, browse, and check out at your store. Part of the Universal Commerce Protocol (UCP) spec.
Is /.well-known/ucp required for my store to appear in AI agents?
AI agents can still scrape your HTML without a profile, but the results will be slow, unreliable, and often fail at checkout. A valid /.well-known/ucp profile turns ad-hoc scraping into a structured contract — it is the difference between being shoppable by agents and being merely scrapeable.
What are the required fields in a UCP profile?
At the root: ucp. Inside ucp: version, services, and payment_handlers. capabilities is optional but strongly recommended. Public keys are optional; when a store publishes them, they live at the root alongside ucp as the keys array (a JWK Set), which in v2026-08-25 replaced the signing_keys field.
What is the most common mistake when publishing a UCP profile?
Serving it with the wrong Content-Type header. It must be application/json. Second most common: accidentally blocking GET requests to /.well-known/* at the WAF layer — agents then see HTTP 403 even though the file exists.
How do I validate my /.well-known/ucp profile?
Paste your domain into the inline checker on ucpchecker.com/well-known-ucp or run a full check at ucpchecker.com/check. Both run the same validator — schema validation, transport reachability, robots.txt audit, and payment handler verification.

Explore protocol data