UCP profile
Universal Commerce Protocol discovery for agentic shopping.
Why an agent cares
The profile is how an agent discovers that a business supports agentic commerce and how to connect to it. A profile that declares no usable capability or no connectable transport is discoverable and useless, which is the shape we look for.
Adoption
Platform default. A major platform ships it by default or in one click, so its footprint is measurable at web scale. For this one in particular, the entire measurable footprint comes from a single platform enabling it by default.
Direction of travel: ▲ rising, as at .
Shopify turned UCP on by default for every store in June 2026, and every live profile we have found is Shopify-hosted. Target, Walmart, Wayfair, Etsy and Nike serve none, so the footprint is one platform's default rather than adoption across retail.
| Adopter | Depth | Evidence |
|---|---|---|
| Shopify (all stores) | default-on | shopify.engineering |
| Google (AI Mode and Gemini checkout, Merchant Center) | production | blog.google |
| Fenty Beauty, Allbirds, Gymshark, Steve Madden, Death Wish Coffee, Mejuri, Brooklinen, Glossier, Kith, UNTUCKit, Chubbies (11 verified by Lumar probe, 2026-09-15) | production | shopify.engineering |
| Etsy, Walmart, Target, Wayfair (co-developers) | announced | nrf.com |
| Salesforce, BigCommerce | announced | bigcommerce.com |
What we check
| Check | Severity | Raises | On whose authority |
|---|---|---|---|
| UCP Invalid Document | high | conformance, usability | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Bad: a document is served at /.well-known/ucp but isn't valid JSON with a "ucp" object, so agents can't read it. Fix: serve { "ucp": { "version": ..., "capabilities": ..., "services": ... } }. | |||
| UCP Missing Required Registries | high | conformance, usability | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Bad: the profile omits ucp.services or ucp.payment_handlers, which UCP's business schema requires even when empty, so the document isn't a valid profile whatever else it declares. Fix: declare both keys, e.g. "services": { ... }, "payment_handlers": {}. | |||
| UCP Missing Transports | high | usability | Lumar readiness bar, beyond UCP specification overview |
Supporting documents: UCP specification overview Lumar readiness bar: no specification requires this. Bad: no ucp.services entry advertises a connectable transport (rest/mcp/a2a with an https endpoint, or embedded), so agents have no way to connect. This is a Lumar readiness bar, not a schema violation: UCP permits an empty services registry. Fix: declare at least one service binding with its https endpoint. | |||
| UCP Insecure URL | high | conformance, usability, security (CWE-319) | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Provisional security check; precision has not yet been measured. Bad: an endpoint, schema, spec or older-version URL in the profile isn't https, so checkout data, or the schema an agent builds requests from, can be read or altered in transit. UCP requires HTTPS for all communication. Fix: serve it over https and change the URL, e.g. "endpoint": "https://shop.example.com/ucp/v1". An advertised HTTP destination permits unencrypted communication. OWASP API API8 (2023) — Security MisconfigurationASVS V12.2.1 (5.0.0) — TLS for external HTTP services Only advertised transport configuration is observed; API deployment security is not fully assessed. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Schema Authority Mismatch | high | conformance, usability, security (CWE-345) | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Provisional security check; precision has not yet been measured. Bad: a capability, service or payment handler's schema is served from a host that doesn't own its name (another domain, an IP address, or a URL with user@ in it). UCP requires the two to match, and agents must reject the entity: anyone could have written that schema. Fix: serve the schema from the domain the name reverses to, e.g. com.example.pay from https://example.com/… or https://pay.example.com/…. A schema authority differs from its declared namespace owner. Schema provenance is compared; malicious schema execution is not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Private Key Exposed | high | conformance, usability, security (CWE-522) | specification: UCP public key schema, JSON Web Key (JWK) |
Supporting documents: UCP public key schema, JSON Web Key (JWK) Required by UCP public key schema and JSON Web Key (JWK). Provisional security check; precision has not yet been measured. Bad: the profile's keys list includes private key material (a JWK d, k or similar member), so anyone who reads the profile can sign as the store. Fix: remove the private members, publish only public keys, and rotate the key: treat the old one as compromised. Exposed identity material or weak authentication can enable identity misuse. OWASP Agentic ASI03 (2026) — Identity & Privilege AbuseOWASP API API2 (2023) — Broken AuthenticationASVS V13.3.2 (5.0.0) — Restrict access to secrets Actual credential use, permissions and privilege abuse are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP AP2 Mandate Without Signing Key | high | usability, security (CWE-347) | specification: UCP payment mandates extension |
Supporting documents: UCP payment mandates extension Related guidance in UCP payment mandates extension. Provisional security check; precision has not yet been measured. Bad: the profile declares AP2 mandates, which require the store to sign every checkout response, but publishes no keys to verify that signature against, so no agent can confirm the price and items are genuine. Fix: publish the store's public signing key in the profile's top-level "keys" array, with the kid its signatures name. AP2 is declared without a public key for mandate verification. Checkout signatures, payment integrity and replay defenses are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP OAuth Issuer Mismatch | high | conformance, usability, security (CWE-345) | specification: OAuth Authorization Server Metadata, UCP identity linking |
Supporting documents: OAuth Authorization Server Metadata, UCP identity linking Required by OAuth Authorization Server Metadata and UCP identity linking. Provisional security check; precision has not yet been measured. An advertised OAuth provider's metadata names a different issuer. OAuth requires an exact match to prevent issuer impersonation. Publish metadata whose issuer exactly matches the declared auth_url. Exposed identity material or weak authentication can enable identity misuse. OWASP Agentic ASI03 (2026) — Identity & Privilege AbuseOWASP API API2 (2023) — Broken AuthenticationASVS V10.5.3 (5.0.0) — Reject mismatched issuer metadata Actual credential use, permissions and privilege abuse are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP OAuth Private Key Exposed | high | conformance, usability, security (CWE-522) | specification: OpenID Connect Discovery, JSON Web Key (JWK) |
Supporting documents: OpenID Connect Discovery, JSON Web Key (JWK) Required by OpenID Connect Discovery and JSON Web Key (JWK). Provisional security check; precision has not yet been measured. An advertised OAuth provider's public key set carries private material. Remove private members and rotate exposed keys; retain only public verification keys. Exposed identity material or weak authentication can enable identity misuse. OWASP Agentic ASI03 (2026) — Identity & Privilege AbuseOWASP API API2 (2023) — Broken AuthenticationASVS V13.3.2 (5.0.0) — Restrict access to secrets Actual credential use, permissions and privilege abuse are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP OAuth Unsigned Signing Algorithm | high | conformance, usability, security (CWE-347) | specification: OAuth Authorization Server Metadata |
Supporting documents: OAuth Authorization Server Metadata Required by OAuth Authorization Server Metadata. Provisional security check; precision has not yet been measured. An advertised OAuth provider permits none for signed client authentication. OAuth forbids this for token, revocation and introspection endpoint authentication. Remove none from these signing algorithm lists. The advertised authentication configuration weakens identity protection. OWASP API API2 (2023) — Broken AuthenticationASVS V9.1.2 (5.0.0) — Exclude unsigned token algorithms No authenticated transaction or bypass is attempted. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Redirected Profile | high | conformance, usability | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Bad: /.well-known/ucp answers with a redirect, and UCP forbids both serving the profile that way and following it, so compliant agents never read the profile. Fix: serve the profile directly at /.well-known/ucp with a 200. | |||
| UCP OAuth Weak RSA Key | medium | usability, security (CWE-326) | specification: JSON Web Algorithms |
Supporting documents: JSON Web Algorithms Client requirements in JSON Web Algorithms. Provisional security check; precision has not yet been measured. An advertised OAuth provider public key set includes an RSA modulus below 2048 significant bits. No authentication or signature forgery is attempted. Fix: replace the weak key, internal destination or downgraded transport with the intended public secure configuration, as applicable. A published RSA modulus is below the supported algorithms’ minimum key strength. Only modulus size is checked; key generation, storage, runtime usage and signature verification are unassessed. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Weak RSA Key | medium | usability, security (CWE-326) | specification: JSON Web Algorithms |
Supporting documents: JSON Web Algorithms Client requirements in JSON Web Algorithms. Provisional security check; precision has not yet been measured. A profile RSA key has a modulus below 2048 significant bits. RFC 7518 sets minimums for RSA algorithm use; publishing a key does not establish how it is used. Fix: replace the weak key, internal destination or downgraded transport with the intended public secure configuration, as applicable. A published RSA modulus is below the supported algorithms’ minimum key strength. Only modulus size is checked; key generation, storage, runtime usage and signature verification are unassessed. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Invalid Version | medium | conformance, usability | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Bad: ucp.version is missing or not a real YYYY-MM-DD date, so agents can't tell which UCP revision to negotiate. Fix: set it to the spec date implemented, e.g. "version": "2026-01-15". | |||
| UCP Internal Endpoint | medium | usability, security (CWE-200) | Lumar readiness bar, beyond UCP specification overview |
Supporting documents: UCP specification overview Lumar readiness bar: no specification requires this. Provisional security check; precision has not yet been measured. Bad: a service endpoint only works inside a private network (localhost, a private or link-local IP, an internal name), so it is unreachable from the public internet and the public profile discloses part of the internal network. A Lumar bar: UCP's address rule covers profile fetches, not endpoints. Fix: publish the public https address agents should call. Public discovery metadata reveals internal service addresses. Reachability, authorization and SSRF exploitation are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Test Key | medium | usability, security (CWE-1394) | Lumar readiness bar, beyond UCP specification overview, HTTP Message Signatures, CFRG keys in JOSE, JSON Web Key (JWK), JSON Web Signature, JOSE examples |
Supporting documents: UCP specification overview, HTTP Message Signatures, CFRG keys in JOSE, JSON Web Key (JWK), JSON Web Signature, JOSE examples Lumar readiness bar: no specification requires this. Provisional security check; precision has not yet been measured. Bad: the profile publishes a known RFC example key whose private half is printed in the RFC, so anyone can sign as the store. This broader production-key bar is Lumar's; development profiles may intentionally use examples. Fix: generate a new key pair, publish only its public half, and sign with that instead. Exposed identity material or weak authentication can enable identity misuse. OWASP Agentic ASI03 (2026) — Identity & Privilege AbuseOWASP API API2 (2023) — Broken AuthenticationASVS V13.3.2 (5.0.0) — Restrict access to secrets Actual credential use, permissions and privilege abuse are not tested. Related guidance does not establish exploitation or framework compliance. Security checks are provisional. | |||
| UCP Invalid Cache-Control | medium | conformance, usability | specification: UCP specification overview |
Supporting documents: UCP specification overview Required by UCP specification overview. Bad: the profile's Cache-Control header isn't public with a max-age of at least 60 seconds, or says private, no-store or no-cache, which UCP's hosting rules forbid because profiles are stable documents shared caches should hold. Fix: send Cache-Control: public, max-age=300. | |||
| UCP Missing Capabilities | informational | nothing | specification: UCP specification overview |
Supporting documents: UCP specification overview UCP specification overview permits this, so it never fails the site. Informational (does not fail ucpValid): the profile declares no usable capability (a reverse-domain "verb" such as dev.ucp.shopping.checkout with a versioned schema). UCP makes capabilities optional, but declaring them tells agents what the store actually supports. | |||
| UCP Partially Assessed | coverage note | nothing | our own coverage |
Examples
Both run through the same checks as a live scan: the first passes, the second is flagged.
{
"ucp": {
"version": "2026-01-01",
"services": {
"dev.ucp.shopping": [
{
"version": "2026-01-01",
"spec": "https://ucp.dev/2026-01-01/specification/overview",
"transport": "rest",
"schema": "https://ucp.dev/2026-01-01/services/shopping/rest.openapi.json",
"endpoint": "https://business.example.com/ucp/v1"
}
]
},
"capabilities": {
"dev.ucp.shopping.checkout": [
{
"version": "2026-01-01",
"schema": "https://ucp.dev/2026-01-01/schemas/shopping/checkout.json"
}
],
"dev.ucp.common.identity_linking": [
{
"version": "2026-01-01",
"schema": "https://ucp.dev/2026-01-01/schemas/common/identity_linking.json"
}
],
"dev.ucp.common.payment.ap2_mandate": [
{
"version": "2026-01-01",
"schema": "https://ucp.dev/2026-01-01/schemas/common/payment_ap2_mandate.json"
}
]
},
"payment_handlers": {}
},
"keys": [
{
"kid": "store-2026",
"kty": "OKP",
"crv": "Ed25519",
"x": "hhsWfvG6EQ1kRa2CH_90BaGBZ2UIlQ4oJEnVnJBsTkk"
}
]
}{
"ucp": {
"version": "v1",
"services": {
"dev.ucp.shopping": [
{
"version": "2026-08-25",
"transport": "rest",
"endpoint": "http://shop.example.com/ucp/v1"
},
{
"version": "2026-08-25",
"transport": "mcp",
"endpoint": "http://169.254.169.254/ucp/mcp"
}
]
},
"capabilities": {
"dev.ucp.shopping.checkout": [
{
"version": "2026-08-25",
"schema": "https://ucp.dev@evil.example/schemas/shopping/checkout.json"
}
],
"dev.ucp.common.payment.ap2_mandate": [
{
"version": "latest",
"schema": "https://ucp.dev/2026-08-25/schemas/common/payment_ap2_mandate.json"
}
]
}
},
"keys": [
{
"kty": "OKP",
"crv": "Ed25519",
"x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs"
},
{
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
"d": "not-a-real-private-key"
}
]
}Specifications
| Document | Revision | Kind |
|---|---|---|
| RFC 7515 — JSON Web Signature | Published RFC | specification |
| RFC 7518 — JSON Web Algorithms | Published RFC | specification |
| UCP specification overview | Release of 25 August 2026 | specification |
| UCP identity linking | Release of 25 August 2026 | specification |
| RFC 8414 — OAuth Authorization Server Metadata | Published RFC | specification |
| OpenID Connect Discovery | Version 1.0 | specification |
| UCP payment mandates extension | Release of 25 August 2026 | specification |
| Universal Commerce Protocol | Living document | guidance |
| UCP profile schemas | Release of 25 August 2026 | specification |
| UCP public key schema | Release of 25 August 2026 | specification |
| RFC 8037 — CFRG keys in JOSE | Published RFC | specification |
| RFC 7520 — JOSE examples | Published RFC | specification |
| RFC 9421 — HTTP Message Signatures | Published RFC | specification |
| RFC 7517 — JSON Web Key (JWK) | Published RFC | specification |
Last re-read against the published documents: .