Gasharu Yirgacheffe
Washed, whole bean, 250 g
Seven small-production things we stand behind, a working age gate, and a shelf that reads itself out in JSON. Built to be poked at by agents.
Prices are what they cost. No member tier, no dark pattern, no drip pricing. Two lines need an age check before they can leave the shop, and that check is enforced by the API, not just the button.
Washed, whole bean, 250 g
Single origin cacao, 70%, 90 g
Early harvest, 500 ml
Jar, stoneground rye, linen cloth
210 mm, wa-handle, Shirogami 2
Skin contact, 2023, 75 cl
Nebbiolo, 2019, 75 cl. Serralunga fruit, 48 months in large cask, released only when it stops being angry with you.
Irish law requires us to verify 18 before these lines leave the shop. In this test build the gate is a single flag on the checkout request, and the API rejects restricted lines without it.
An agent reads the profile, prices a basket, and presents a payment credential. A human only appears when the shop asks for one, which here means the age gate.
GET /.well-known/ucp lists capabilities, versions and payment handlers. No account, no key exchange.
POST /api/checkout returns line items, VAT and a session id. Restricted lines come back gated until age is asserted.
The shelf is the same data the browser renders. Point a scraper or an agent runtime at these four endpoints and you have the whole shop.
// served with Cache-Control: public, max-age=3600 { "ucp": { "version": "2026-04-08", "supported_versions": ["2026-04-08"], "services": { "rest": { "base_url": "http://localhost:8088" } }, "capabilities": { "dev.ucp.shopping.cart": ["2026-04-08"], "dev.ucp.shopping.checkout": ["2026-04-08"], "dev.ucp.shopping.catalog": ["2026-04-08"] }, "handlers": { "card": { "scheme": "platform_token" }, "x402": { "scheme": "exact", "network": "eip155:8453", "settlement": "unimplemented" } }, "signing_keys": [] } }
Illustrative profile for local testing. Not a conformance claim.
Wine and bladed kitchen goods cannot be sold or delivered to anyone under 18 in Ireland. We ask once per session; a delivery driver may still ask for ID at the door.
Test build: your answer sets age_verified: true on the checkout request and is stored in local storage. Nothing is sent to a verification provider. Do not use this pattern in production; a real shop needs an age-verification service and a recorded audit trail.