TRX-012Buy
UCP signing keys published and well formed
Checks whether your UCP profile publishes public signing keys, and only public ones.
What we check
We read the top-level keys array, a JWK Set beside ucp, and for profiles older than 2026-08-25 also ucp.signing_keys. For each key we look at its kid, kty, crv and alg, and at whether it carries any private member (d, p, q, dp, dq, qi, oth or k). We keep the names of those members only, never key values.
Why it matters
UCP defines how its messages, webhooks included, are signed with HTTP Message Signatures (RFC 9421), and a verifier reads the keys from keys[] in your profile. With no keys, a signed message from you cannot be checked. The profile schema forbids private key material: anything in the profile is public, so a key that carries it is leaked.
How we check
This check uses the profile the scan already read, so it makes no extra request. PASS: at least one key, each with a kid and a kty, none with private members, and where alg and crv are both set they match (ES256 with P-256, ES384 with P-384, EdDSA with Ed25519). WARN: a key has a problem that does not break the profile, such as a mismatched alg and crv, a kty other than EC or OKP (the two key types the profile schema names), or a missing kid. It is scored by the share of good keys, never below 40. FAIL: no keys at all, or any key with private material, which you should treat as a leaked key. SKIPPED: there is no profile, we could not read it, or it is not JSON.
How to fix it
- Publish your public JWKs (EC P-256 or OKP Ed25519) in a top-level "keys" array next to "ucp".
- Give each key a kid. For Web Bot Auth reuse, the profile schema asks for the key's JWK SHA-256 thumbprint (RFC 7638).
- If a private member was ever published, remove it and rotate that key.
What good looks like
{
"ucp": { "version": "2026-08-25", ... },
"keys": [
{ "kid": "<RFC 7638 thumbprint>", "kty": "OKP", "crv": "Ed25519", "alg": "EdDSA", "x": "..." }
]
}Sources
Read more
- UCP explained
The Universal Commerce Protocol: the profile a store publishes at /.well-known/ucp, the capabilities it declares there, and the checkout flow from a new basket to a placed order.
Could an agent buy from your store?
The free scan runs all 51 checks on your store in about five minutes.
Scan my store