UCP Checker
Reference

UCP Check Methodology

How we validate merchant domains and compute the 0–100 UCP Score. Learn about the Universal Commerce Protocol and browse capabilities we track. The machine-readable version — score weights, grade bands and how the model is versioned — is in the API & MCP docs.

Overview

Two layers of analysis

UCP Checker evaluates merchant domains in two parts:

  1. Static Analysis — Does a valid UCP manifest exist? Is the JSON well-formed? Are the required fields present? Does robots.txt allow agents? This is the foundation: a published, valid, agent-reachable manifest.
  2. UCP Score — A 0–100 composite that summarises agent-readiness across three weighted categories: Agent Discovery, UCP Conformance, and Capability Coverage. Static analysis feeds the score; opt-in functional probes refine it.

Static analysis tells you whether a merchant publishes a UCP manifest. The UCP Score tells you how well agents can find, parse, and use it. Both layers are documented below. For full end-to-end agent shopping simulations against live infrastructure, see UCP Playground — a complementary product.

Part I — Static Analysis

Static analysis crawls the public manifest file and evaluates it against the UCP specification. This data powers the Merchant Directory and individual status pages.

01

Crawler Architecture & Dual-Request Flow

Each audit runs a two-step sequence to capture both policy and technical readiness:

  1. Policy Audit: Fetch https://{domain}/robots.txt and parse directives for wildcard * plus the major AI agents (GPTBot, Google-Extended, ClaudeBot, Applebot-Extended, CCBot). This determines if agents are legally allowed to index the manifest.
  2. Manifest Validation: Request https://{domain}/.well-known/ucp with User-Agent: UCPCheckerBot/1.0 (+https://ucpchecker.com/methodology) and Accept: application/json to gather the commerce capabilities.

All requests enforce HTTPS, follow up to 5 redirects, and timeout after 2 seconds to match agentic latency budgets.

02

Manifest Delivery Speed

We measure how fast the static manifest file downloads (connection + SSL + transfer). Latency feeds into the UCP Score's Discovery component. Agents typically abandon a request after ~2 seconds.

  • 🚀 Excellent: < 200ms – ideal for real-time agent workflows.
  • ⚠️ Fair: 200–800ms – acceptable but may slow multi-step reasoning.
  • 🐌 Slow: > 800ms – high risk of agent timeout.
  • Unreachable: > 2000ms – we abort and mark the domain unreachable.
03

AI Agent Policy Matrix

In addition to our own crawler, we audit robots.txt access for the foundational model bots powering the agentic economy:

  • GPTBot (OpenAI / ChatGPT)
  • Google-Extended (Gemini / Vertex AI)
  • ClaudeBot (Anthropic)
  • Applebot-Extended (Apple Intelligence)
  • CCBot (Common Crawl)

If a bot isn’t explicitly mentioned, we inherit the wildcard * policy.

04

Response Classification

Based on the HTTP response, we classify merchants into one of the following statuses:

Verified

HTTP 200 + valid JSON + required fields present (version, services, payment_handlers)

Not Detected

HTTP 404 - The endpoint does not exist

Invalid

HTTP 200 but response is not valid JSON, or required fields are missing

Blocked

HTTP 401/403 - WAF or bot mitigation prevented access.

Policy Blocked

robots.txt disallows /.well-known/ucp. Merchant opted out of agentic access.

Unreachable

Connection timeout, DNS failure, SSL error, or HTTP 5xx error

Error Semantics & Evidence

Every status is backed by the HTTP response we received:

  • 404 Not Detected: We store the 404 code and mark the crawl as evidence that no manifest is present.
  • 401/403 Blocked: If a bot wall blocks the request we record the error body so merchants can see what needs to be allowed.
  • 5xx / Connection Issues: We classify them as Unreachable and log whether it was a timeout, DNS failure, SSL mismatch, or server error.
  • Invalid JSON: We keep the response payload (when safe) so teams can diff malformed manifests.

This evidence appears on each status page so LLMs and humans can cite exactly why a readiness decision was made.

05

JSON Validation

For HTTP 200 responses, we validate the JSON structure against the spec version declared in the manifest. Validation is version-aware — we apply the rules for the declared version, falling back to the latest known rules for unrecognised versions. You can run this same validation yourself using the UCP Validator.

Currently supported spec versions: 2026-01-11, 2026-01-23, 2026-04-08, 2026-08-25 (current).

Required Fields

  • ucp.version - The UCP specification version (YYYY-MM-DD format)
  • ucp.services - Service definitions with transport and endpoint details
  • ucp.payment_handlers - Payment handler configuration

Optional Fields

  • ucp.capabilities - Supported capabilities (optional per spec; generates a warning if absent)
  • keys - JWK Set of public keys for signature verification, at the manifest root. v2026-08-25 removed signing_keys[] and promoted keys[] as the canonical field; we accept either at every version, so older manifests keep validating (optional but recommended)
  • ucp.supported_versions - Map of older protocol versions to their profile URIs (v2026-04-08+)
  • ucp.capabilities under dev.ucp.common.* - v2026-08-25 split the spec into shopping/, payment/ and common/ domains; payment, location, loyalty and identity capabilities now live under dev.ucp.common.* and validate the same way

Version-Aware Validation (v2026-04-08+)

The v2026-04-08 spec introduced a distinction between platform profiles and business profiles. Business profiles (served at /.well-known/ucp) are what individual stores publish. Platform profiles are what platforms like Shopify publish upstream.

For business profiles, spec and schema URLs on services, capabilities, and payment handlers are not required — stores inherit these from their platform. UCPChecker validates accordingly: stores declaring v2026-04-08 or later will not receive warnings about missing spec or schema fields.

Example Valid Manifest

{
  "ucp": {
    "version": "2026-08-25",
    "services": {
      "dev.ucp.shopping": [{
        "version": "2026-08-25",
        "spec": "https://ucp.dev/specification/shopping/",
        "transport": "rest",
        "endpoint": "https://api.example.com/ucp/v1",
        "schema": "https://example.com/openapi.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": [{
    "kid": "key-1",
    "kty": "EC",
    "crv": "P-256",
    "x": "example-x-coordinate",
    "y": "example-y-coordinate"
  }]
}

v2026-08-25 removed signing_keys[] and made keys[] — a JWK Set per RFC 7517 — the canonical root field every UCP verifier reads. Manifests still publishing signing_keys at the root keep validating here; we read either.

06

Readiness Decision Criteria

We mark a merchant as UCP ready when:

  • A manifest exists at /.well-known/ucp.
  • The manifest includes all required fields for its declared spec version (version, services, payment_handlers).
  • Endpoints referenced in the manifest resolve to HTTPS URLs.

Merchants missing one of these requirements are labeled as Not Detected (no manifest), Invalid (manifest present but incomplete), or Blocked/Unreachable (infrastructure issues). This creates a transparent readiness scale for agentic commerce teams.

07

Data Storage

For each check, we store:

  • Domain name (normalized, lowercase, no www)
  • Status classification
  • HTTP status code received
  • UCP version (if detected)
  • Capabilities summary and individual capability flags (checkout, identity linking, cart management, order, payment token, catalog)
  • Transport types detected (REST, MCP, A2A, Embedded)
  • Raw JSON response (if valid)
  • Error message and validation warnings (if applicable)
  • Timestamp of check (UTC)
  • Response latency (ms)
  • Robots policy verdict
  • Per-bot policy matrix for GPTBot, Google-Extended, ClaudeBot, Applebot-Extended, CCBot
  • Detected e-commerce platform (Shopify, WooCommerce, Magento, etc.)
08

Refresh Schedule

We periodically re-check all domains in our index:

  • Default interval: Every 24 hours
  • Priority domains: More frequently for verified merchants
  • On-demand: Users can trigger immediate checks via our checker tool

Observed vs. attempted. Not every attempt observes the store: a store's edge may rate-limit our crawler, or a host may not answer in time. An attempt that observes nothing is recorded, but it never changes a store's status, score, latency or any other measurement — those always describe the last observation, and every page and API response says when that was (observed) and, if later, when we last attempted. A store we have never managed to observe is shown as pending, not unreachable: unreachable is a verdict, and we do not issue verdicts we have not observed.

09

Rate Limiting

To be respectful to merchant servers:

  • We space out requests across our batch crawls
  • We cache results for 10 minutes to avoid duplicate requests
  • We identify ourselves clearly via User-Agent
  • We respect robots.txt where applicable
10

Domain Normalization & Canonicalization

When processing domain input, we normalize as follows:

  • Remove https:// or http:// prefix.
  • Strip www. (but store it if a manifest only exists there).
  • Remove trailing slashes, query strings, and paths.
  • Convert to lowercase and trim whitespace.
  • Support internationalized domains by preserving punycode.
  • Deduplicate so shop.example.com and https://SHOP.example.com/ map to one canonical merchant record.

Example: https://www.Example.COM/path becomes example.com. This ensures every status page has a clean slug like /status/example.com.

Part II — UCP Score

The UCP Score is a 0–100 rating that summarises how agent-ready a store is. It is computed from the static analysis above plus a handful of public surface signals (and, when the user opts in, lightweight functional probes). Every store with a completed check has a score; the score appears on the store's /score/{domain} page and on the leaderboard.

11

UCP Score (0–100)

The score is a weighted average of three category sub-scores, each independently rated 0–100:

Agent Discovery

30% weight

Can agents find and reach this store? Combines HTTPS on the manifest endpoint, reachability (status), agent-friendly robots.txt, and surface signals — /llms.txt, sitemap.xml, Open Graph tags, Organization JSON-LD, and the mobile viewport meta. Stores that fail discovery are invisible to agents regardless of how good the manifest is.

UCP Conformance

40% weight

Does the manifest validate against the spec? Validity is weighted 3× — an invalid manifest cannot score above ~50 in this category. Also rewards declaring a known spec version, providing signing keys, and minimising warnings. This is the single biggest contributor to the overall score because everything downstream depends on a parseable manifest.

Capability Coverage

30% weight

What can an agent actually do here? Rewards declared transports (REST / MCP / A2A), checkout support, payment handlers, and breadth of capabilities. When functional probes are run (opt-in, see §13), declared transports that don't actually respond drag this score down — declaring capabilities you can't deliver is worse than not declaring them.

Composite formula: Discovery × 0.30 + Conformance × 0.40 + Capabilities × 0.30, rounded to the nearest integer.

12

UCP Grade

The composite score maps to a single-letter grade for quick comparison. Bands are tuned so a passing grade requires a complete, valid manifest plus working discovery — not just a published file:

A 85–100 Agent-ready — valid manifest, strong discovery, broad capability coverage
B 70–84 Solid — minor warnings or one weak category, agents can still transact
C 50–69 Partial — manifest works but missing capabilities or surface signals
D 30–49 Weak — manifest reachable but invalid or near-empty
F 0–29 Failing — blocked, unreachable, or no manifest detected
13

Functional Probes (Opt-In)

By default the score is computed from static signals only — fast, cheap, safe for daily-cron-scale checking. When a user manually triggers a check (via the /score/{domain} page or the live checker), we additionally run two probe families:

  • Transport probes — Each declared transport endpoint (MCP, REST, A2A) gets a benign request: MCP receives a JSON-RPC tools/list, REST/A2A receive a GET. Connection refused, DNS failure, TLS errors, and 5xx responses count as failures. A manifest that declares transports without working endpoints is the worst kind of broken — looks perfect to static validators, fails the moment an agent tries to use it.
  • URL resolution probes — Every spec and schema URL declared in the manifest is fetched. Broken spec links suggest the manifest was copy-pasted without verification.

Probe failures are surfaced as recommendations on the score page and feed into the Capability Coverage sub-score. Probes are deliberately read-only and rate-limited — they do not exercise checkout or write any state.

14

Surface Signals

Surface signals are public files and meta tags an agent (or LLM) reads alongside the manifest to understand the store. We capture all of them on every reachable domain:

  • /llms.txt — An emerging convention (analogous to robots.txt) for hand-written briefs aimed at LLM agents. We capture the body for change-detection but do not score on its content.
  • /sitemap.xml — Tells agents which pages are canonical and how often they change.
  • Open Graph tags — Give agents and link unfurlers a clean title, description, and image.
  • Organization JSON-LD — Structured brand identity (name, logo, social profiles, contact info) so agents can verify who you are.
  • Mobile viewport — Mobile-originating agents render the page in a sandbox and use this tag for layout.

The presence of each signal is a Discovery sub-component. Missing signals are surfaced as low-effort recommendations on the score page.

15

Refresh Cadence & Score History

Scores update on every check:

  1. The 24-hour cron sweep refreshes static signals across the directory and recomputes scores. Probes do not run on the cron — that would be excessive load on merchants.
  2. User-triggered checks (live checker, /score/{domain} "Run a fresh check", claimed-domain weekly rescan) include functional probes and platform detection.
  3. Saved reports include a sparkline of your UCP Score across recent checks, so you can see your readiness trend at a glance.
FAQ

Common questions

How do I check a UCP manifest?
Use the UCP readiness checker or call https://{domain}/.well-known/ucp directly. We normalize the domain, fetch the manifest, and show the result with evidence.
Does {brand} support UCP?
Search our directory or visit /status/{brand}. Each status page documents whether a manifest was detected, when it was last fetched, and which capabilities were advertised. The full breakdown — including the UCP Score, sub-scores, and copy-paste fixes — lives at /score/{brand}.
What is Universal Commerce Protocol?
UCP is a machine-readable manifest that exposes commerce capabilities to agents. It's the backbone of agentic commerce readiness and lets search engines or assistants transact directly.
What is a UCP Score?
The UCP Score is a 0–100 composite rating measuring how agent-ready a store is. It combines Agent Discovery (30%), UCP Conformance (40%), and Capability Coverage (30%). Scores map to A/B/C/D/F grades. Every store with a completed check has a score — see /score/{domain} for the full breakdown.
How is the score calculated?
Each category is rated 0–100 then weighted: Discovery × 0.30 + Conformance × 0.40 + Capabilities × 0.30. Discovery rewards HTTPS, reachability, agent-friendly robots.txt, and surface signals (llms.txt, sitemap, OG, schema, viewport). Conformance rewards manifest validity (3× weighted), spec version, and signing keys. Capabilities rewards declared transports, checkout, payment handlers, and — for opt-in checks — live endpoint responses.
How is the UCP Score different from the UCP Playground?
The UCP Score is computed by UCP Checker from the manifest, surface signals, and lightweight functional probes — fast, cheap, safe to run at scale. The UCP Playground is a separate product that runs full end-to-end agent shopping simulations against live infrastructure. They're complementary: the score tells you whether agents can find and parse your endpoint; the Playground tells you whether agents can actually complete a transaction.
How do I appear on the leaderboard?
Any verified domain with a published, valid UCP manifest is automatically scored and ranked. Run a fresh check on your domain via the live checker — the result is added to the directory and the leaderboard ranked by UCP Score.
Questions?

Still need help?

If you have questions about our methodology or believe your domain has been incorrectly classified, please run a fresh check or contact us.

Check a Domain View Directory API & MCP docs

Weekly UCP Report

Get the agentic commerce digest every Monday

Real adoption data, ecosystem trends, new spec versions, and the stores that broke or recovered this week. Read by founders and engineers building the next generation of commerce.

Free forever No spam Unsubscribe anytime

View a sample report →

Weekly UCP Report
Issue #52 · Sep 28, 2026
+664
new verified stores
Verified rate
Latest spec
Cart capability