Docs Sellers
Conformance and badge
LiveUpdated
Sellers. Written for merchants that receive agent orders.
Nobody issued an “agent-ready” badge for merchants before. Enruta’s suite runs the checkout lifecycle, protocol behavior, idempotency, mandate enforcement, the merchant signature and the receipt against your endpoint, and a fully green run earns a badge signed by Enruta that anyone can verify.
The suite
| Group | Tests | Passes when |
|---|---|---|
| Discovery | Profile, signing keys, capabilities, REST service (4) | /.well-known/ucp answers a profile with ucp.version, at least one ES256 key, the checkout capability and a REST transport |
| Lifecycle | Create, get, update, complete, get order (5) | A checkout is created, read, updated (address and fulfillment), completed with the mock handler’s success_token, and the order is fetched |
| Protocol | Envelope, version negotiation, error shape (3) | Responses carry the profile’s ucp.version; an unsupported version is refused with an error envelope; an unknown id returns the specified error shape |
| Idempotency | Replay, conflict (2) | The same Idempotency-Key replays the same response; the same key with a different body is refused (409 idempotency_conflict) |
| Mandate | AP2 negotiated, mandate required (2) | With a platform profile that declares AP2, the checkout carries the AP2 mandate capability, and complete without ap2.checkout_mandate answers mandate_required; skipped without --platform-profile |
| Signature | Merchant authorization (1) | ap2.merchant_authorization verifies with the profile’s keys |
| Receipt | Payment reference, receipt signature (2) | The order carries payment_reference and, when the store signs, a signature that verifies |
Results are { name, ok, detail }[]; tests that do not apply to your endpoint are skipped, not failed. The runner is the pure runConformance(endpoint, { domain }) in @enruta/sdk, with CONFORMANCE_TESTS exported, so the local command and the hosted run are the same code.
Run it
npx @enruta/cli validate https://shop.example --domain shop.example --platform-profile https://agent.example/profile
# enruta validate https://shop.example (shop.example) UCP 2026-08-25
result vector detail
ok discovery.profile
ok discovery.keys
ok discovery.capabilities
ok discovery.services
ok lifecycle.create chk_…
ok lifecycle.get
ok lifecycle.update
ok lifecycle.complete ord_…
ok lifecycle.order
ok protocol.envelope
ok protocol.version
ok protocol.error_shape
ok idempotency.replay
ok idempotency.conflict 409 idempotency_conflict
ok mandate.negotiated
ok mandate.required mandate_required
ok signature.merchant_authorization key_merchant_shop_2026-09
ok receipt.payment_reference
ok receipt.signature
# PASS: 19 of 19 passed in 2140 ms--json prints the results array; the exit code is 1 on any failure. The local run does not issue a badge.
POST /v0/sellers/conformance Authorization: Bearer enruta_slr_…
{ "domain": "shop.example", "endpoint": "https://shop.example" }
201 { "id": "cfr_01M2J3Q8W4T7K2N9B5D1H6XRS", "passed": 19, "total": 19, "results": [ … ], "badge_jws": "eyJ…" }
GET /v0/sellers/conformance → your runsA run with every applicable test green issues the badge; the seller console’s Conformance page runs the same call and shows the embed snippet.
The badge
A compact JWS signed with the Enruta seal key: { iss: "https://enruta.ai", sub: <domain>, endpoint, passed, total, run_id, iat, exp: +90 days, typ: "enruta-conformance+jwt" }. It is public, cached for an hour, and expires after ninety days so a badge always reflects a recent run.
GET https://app.enruta.ai/badges/reamandrule.com.json
{ "domain": "reamandrule.com", "passed": 19, "total": 19, "badge": "eyJ…", "verified_at": "2026-09-13T12:00:00Z", "verify_url": "https://app.enruta.ai/.well-known/enruta-keys.json" }
<img src="https://app.enruta.ai/badges/reamandrule.com.svg" alt="Enruta · agent-ready">The SVG reads “Enruta · agent-ready · 19/19” in the brand colors. The reference merchant shows it in its storefront footer, linked to the JSON.
Why it is free
The badge and the suite are part of the Accept tier, free permanently, like the verifier: the value of a record that both sides can verify grows with the number of merchants that can accept a mandate reference, and a conformance check is the cheapest way to make a merchant agent-ready. The vectors will be published with the schema and the verifier so that other tools can run the same suite.