# Hollin Kitchen Garden > A small market garden in Shropshire: seed, sowing advice and garden visits for people who grow their own. For demonstration only. This transaction runs on a test network with test money, and has no value. This shop sells to agents and to people. Every purchase is a real transaction on a test network, paid in its test USDC to the shop's own seller account there: prices are real-life prices, and each cent is paid as one millionth of a USDC. Each purchase has its own agreement, whose SHA-256, H, the payment request carries and the payment is bound to. One checkout stands behind every door, and a payment is presented at the door that asked for it. ## The networks Each checkout is paid on one network, which the buyer names as a CAIP-2 id: `network` in the JSON body of the request to `/buy/` (and to the test checkout), beside `quote` and `with`; `network` in the `buy` tool's arguments and in an A2A buy data part. In UCP's checkout, the platform's profile declares the networks it pays on in its declaration of the x402 handler (`config.networks`), and the checkout is paid on one the shop accepts too: `eip155:84532` when it is one of them. With none named, the checkout is paid on `eip155:84532`. The networks: Base Sepolia (`eip155:84532`, the default), Arc testnet (`eip155:5042002`), Avalanche® Fuji (`eip155:43113`), Hedera testnet (`hedera:testnet`), Stellar testnet (`stellar:testnet`), XRPL Testnet (`xrpl:1`), Ethereum Sepolia (`eip155:11155111`), Arbitrum Sepolia (`eip155:421614`), OP Sepolia (`eip155:11155420`), Polygon Amoy (`eip155:80002`), Unichain Sepolia (`eip155:1301`), World Chain Sepolia (`eip155:4801`), Ink Sepolia (`eip155:763373`), Celo Sepolia (`eip155:11142220`), Monad testnet (`eip155:10143`), Sei testnet (`eip155:1328`), Sonic testnet (`eip155:14601`), EDGE testnet (`eip155:33431`), Morph Hoodi (`eip155:2910`), Codex testnet (`eip155:812242`), Cronos testnet (`eip155:338`), Pharos Atlantic (`eip155:688689`), Plasma testnet (`eip155:9746`), Plume testnet (`eip155:98867`), XDC Apothem (`eip155:51`) and ZKsync Sepolia (`eip155:300`). - Base Sepolia (`eip155:84532`, the default): evm network; USDC `0x036CbD53842c5426634e7929541eC2318f3dCF7e`; the escrow, so a hold too; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_base_sepolia`. - Arc testnet (`eip155:5042002`): evm network; USDC `0x3600000000000000000000000000000000000000`; the escrow, so a hold too; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_arc_testnet`. - Avalanche® Fuji (`eip155:43113`): evm network; USDC `0x5425890298aed601595a70AB815c96711a31Bc65`; the escrow, so a hold too; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_avalanche_fuji`. - Hedera testnet (`hedera:testnet`): hedera network; USDC `0.0.429274`; no escrow, so no hold; the shop's seller account `0.0.11150176`; UCP's declaration `lcp_x402_hedera_testnet`. - Stellar testnet (`stellar:testnet`): stellar network; USDC `CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA`; no escrow, so no hold; the shop's seller account `GBWJRKISYDHDRGIEQNT7WYCRF362SVVPFXMMJSEBIO54HJNK4OYM4DHY`; UCP's declaration `lcp_x402_stellar_testnet`. - XRPL Testnet (`xrpl:1`): xrpl network; USDC `5553444300000000000000000000000000000000`; no escrow, so no hold; the shop's seller account `rNDVoAWfrGNQV5nPHGjyZWWdxth9jomwif`; UCP's declaration `lcp_x402_xrpl_testnet`. - Ethereum Sepolia (`eip155:11155111`): evm network; USDC `0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_ethereum_sepolia`. - Arbitrum Sepolia (`eip155:421614`): evm network; USDC `0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_arbitrum_sepolia`. - OP Sepolia (`eip155:11155420`): evm network; USDC `0x5fd84259d66Cd46123540766Be93DFE6D43130D7`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_op_sepolia`. - Polygon Amoy (`eip155:80002`): evm network; USDC `0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_polygon_amoy`. - Unichain Sepolia (`eip155:1301`): evm network; USDC `0x31d0220469e10c4E71834a79b1f276d740d3768F`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_unichain_sepolia`. - World Chain Sepolia (`eip155:4801`): evm network; USDC `0x66145f38cBAC35Ca6F1Dfb4914dF98F1614aeA88`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_world_chain_sepolia`. - Ink Sepolia (`eip155:763373`): evm network; USDC `0xFabab97dCE620294D2B0b0e46C68964e326300Ac`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_ink_sepolia`. - Celo Sepolia (`eip155:11142220`): evm network; USDC `0x01C5C0122039549AD1493B8220cABEdD739BC44E`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_celo_sepolia`. - Monad testnet (`eip155:10143`): evm network; USDC `0x534b2f3A21130d7a60830c2Df862319e593943A3`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_monad_testnet`. - Sei testnet (`eip155:1328`): evm network; USDC `0x4fCF1784B31630811181f670Aea7A7bEF803eaED`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_sei_testnet`. - Sonic testnet (`eip155:14601`): evm network; USDC `0x0BA304580ee7c9a980CF72e55f5Ed2E9fd30Bc51`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_sonic_testnet`. - EDGE testnet (`eip155:33431`): evm network; USDC `0x2d9F7CAD728051AA35Ecdc472a14cf8cDF5CFD6B`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_edge_testnet`. - Morph Hoodi (`eip155:2910`): evm network; USDC `0x7433b41C6c5e1d58D4Da99483609520255ab661B`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_morph_hoodi`. - Codex testnet (`eip155:812242`): evm network; USDC `0x6d7f141b6819C2c9CC2f818e6ad549E7Ca090F8f`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_codex_testnet`. - Cronos testnet (`eip155:338`): evm network; USDC `0xEb33dc5fac03833e132593659e1dE7256aB59794`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_cronos_testnet`. - Pharos Atlantic (`eip155:688689`): evm network; USDC `0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_pharos_atlantic`. - Plasma testnet (`eip155:9746`): evm network; USDC `0xE67Fb267022cBA8064Dd388CC2FED724F3120D9D`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_plasma_testnet`. - Plume testnet (`eip155:98867`): evm network; USDC `0xcB5f30e335672893c7eb944B374c196392C19D18`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_plume_testnet`. - XDC Apothem (`eip155:51`): evm network; USDC `0xb5AB69F7bBada22B28e79C8FFAECe55eF1c771D4`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_xdc_apothem`. - ZKsync Sepolia (`eip155:300`): evm network; USDC `0xAe045DE5638162fa134807Cb558E15A3F5A7F853`; no escrow, so no hold; the shop's seller account `0x9FB971E8A3ec00680bbE817A398c74e9067663E8`; UCP's declaration `lcp_x402_zksync_sepolia`. ## The doors - **x402 over HTTP:** `https://hollin-garden.integraledger.com/buy/`, its network in the body's `network`, answers `402` with x402 version 2's `PAYMENT-REQUIRED`, which holds the agreement's link; the same request again with `PAYMENT-SIGNATURE` pays it. - **x402 over MCP:** the tool `buy` at https://hollin-garden.integraledger.com/mcp, its network in `network`, with the payment in `params._meta["x402/payment"]`. - **UCP's checkout over REST:** `https://hollin-garden.integraledger.com/checkout-sessions` (UCP 2026-08-25), as the profile at https://hollin-garden.integraledger.com/.well-known/ucp declares it, paid through the x402 payment handler `com.integraledger.lcp.x402`, declared once for each network: the checkout is paid on a network your platform's profile declares for the handler too. Your platform's profile goes in `UCP-Agent`. - **UCP's checkout over MCP:** the tools `create_checkout`, `get_checkout`, `update_checkout`, `complete_checkout`, `cancel_checkout` and `get_order` at https://hollin-garden.integraledger.com/mcp, paid through the same handler. Your platform's profile goes in `meta["ucp-agent"]`. - **MPP:** on an EVM network, the `402` of `https://hollin-garden.integraledger.com/buy/` also carries MPP's `evm` `charge` challenge (`WWW-Authenticate: Payment …`), with an agreement of its own, for `sowing-calendar`, `garden-visit`, `members-pass`, `plant-doctor` and `sweet-pea-collection`; `Authorization: Payment ` pays it. - **A2A:** the agent card at `https://hollin-garden.integraledger.com/.well-known/agent-card.json` (and `/.well-known/agent.json`), in version 0.3 or 1.0 as the `A2A-Version` header asks (none is 0.3); JSON-RPC at `https://hollin-garden.integraledger.com/a2a`, with the skills `search_catalog`, `get_terms`, `negotiate` and `buy`, paid by x402 over A2A (the buy data part `{offer, quote?, with?, network?}`), and UCP's checkout over A2A. - **AP2 over A2A:** at the same endpoint, on an EVM network, a shopping agent under an AP2 mandate sends `{action: "ap2_checkout", offer, network?}` and is answered with AP2's checkout, a `checkout_jwt` this shop signs whose `legalContext` names the agreement and its agreement step; it pays the agreement step, then completes on the task with AP2's Checkout and Payment Mandates and the x402 payment, whose nonce is keccak256 of the Payment Mandate. - **The kit's own tools** at https://hollin-garden.integraledger.com/mcp, for an agent with no UCP platform profile: `search_catalog`, `lookup_catalog`, `get_product`, `get_terms`, `negotiate`, `buy`, `test_buy` and `get_purchase`. ## Offers - [Month-by-month vegetable sowing calendar](https://hollin-garden.integraledger.com/products/sowing-calendar): A spreadsheet (CSV) of 32 vegetables, herbs and flowers: when to sow under cover, when to sow outdoors, when to plant out and when to harvest, for a cool-temperate UK garden. $6.00, paid as 0.0006 USDC. Paid when bought (x402 `exact`). Delivers: A file, `sowing-calendar.csv`, in the answer to the paid request. Its size and SHA-256 are named in the agreement before the payment. Open to negotiation. Offer id `sowing-calendar`; buy at https://hollin-garden.integraledger.com/buy/sowing-calendar, its network in the body's `network`, paid by x402 or, on an EVM network, by MPP; test checkout https://hollin-garden.integraledger.com/test/buy/sowing-calendar. In a UCP checkout: the line's item is `sowing-calendar`. - [One-hour garden visit](https://hollin-garden.integraledger.com/products/garden-visit): An hour in your garden with a grower: soil, layout, what to sow and where. Booked now, paid when the visit is due. $45.00, owed later as 0.0045 USDC, not paid at purchase. Pay later: the price is owed, due when the booked slot starts, and the agreement says what is owed and when. On Base Sepolia, Arc testnet, Avalanche® Fuji, Ethereum Sepolia, Arbitrum Sepolia, OP Sepolia, Polygon Amoy, Unichain Sepolia, World Chain Sepolia, Ink Sepolia, Celo Sepolia, Monad testnet, Sei testnet, Sonic testnet, EDGE testnet, Morph Hoodi, Codex testnet, Cronos testnet, Pharos Atlantic, Plasma testnet, Plume testnet, XDC Apothem and ZKsync Sepolia: At purchase the buyer pays 0.000001 USDC, the smallest amount the token can move, by an EIP-3009 transfer whose nonce is H (H is the agreement's hash): it anchors the agreement on chain, and is not part of the price. On Hedera testnet: At purchase the buyer pays 0.000001 USDC, the smallest amount the token can move, by a Hedera Token Service transfer whose memo, signed by the payer, is `lcp:sha256:` followed by H (H is the agreement's hash): it anchors the agreement on chain, and is not part of the price. On Stellar testnet: At purchase the buyer pays 0.000001 USDC, one cent at the scale, by a Stellar transfer paid to a muxed address whose id is H's first 8 bytes (H is the agreement's hash): it anchors the agreement on chain, and is not part of the price. On XRPL Testnet: At purchase the buyer pays 0.000001 USDC, the smallest amount the token can move, by an XRPL payment whose InvoiceID, signed by the payer, is the SHA-256 of `lcp:sha256:` followed by H (H is the agreement's hash): it anchors the agreement on chain, and is not part of the price. (x402 `exact`.) Nothing here tracks or collects the amount owed. Delivers: A booking of 60 minutes, confirmed with a reference and an .ics file. Slots start at 09:00, 11:00, 14:00 (Europe/London) on tue, thu, sat, up to 28 days ahead; the catalogue lists the free ones. One booking takes one slot, and a slot is held for one buyer only. Asks for: name, postcode. Open to negotiation. Offer id `garden-visit`; buy at https://hollin-garden.integraledger.com/buy/garden-visit, its network in the body's `network`, paid by x402 or, on an EVM network, by MPP; test checkout https://hollin-garden.integraledger.com/test/buy/garden-visit. In a UCP checkout: the line's item is a slot variant, `garden-visit:`, as the catalogue lists the free slots; it asks for name at `$.buyer.first_name`, postcode at `$['com.integraledger.lcp.with'].postcode`, slot at `$.line_items[0].item.id`. - [Weekend sowing workshop, one place](https://hollin-garden.integraledger.com/products/sowing-workshop): Two hours in our polytunnel: sowing, pricking out and potting on, with a tray of your own to take home. The fee is held against your card when you book. $30.00, paid as 0.003 USDC. Authorise now, collect later: the whole price is authorised into escrow when bought, and collected by the seller 2 minutes after (x402 `auth-capture`). Until it is collected, it is authorised, not paid. Delivers: A booking of 120 minutes, confirmed with a reference and an .ics file. Slots start at 10:00, 14:00 (Europe/London) on sat, sun, up to 56 days ahead; the catalogue lists the free ones. One booking takes one slot, and a slot is held for one buyer only. Asks for: name. Offer id `sowing-workshop`; buy at https://hollin-garden.integraledger.com/buy/sowing-workshop, its network in the body's `network`, paid by x402, on a network with the escrow; test checkout https://hollin-garden.integraledger.com/test/buy/sowing-workshop. In a UCP checkout: the line's item is a slot variant, `sowing-workshop:`, as the catalogue lists the free slots; it asks for name at `$.buyer.first_name`, slot at `$.line_items[0].item.id`. - [Grower's pass, 30 days](https://hollin-garden.integraledger.com/products/members-pass): Thirty days of access to the members' guides: soil and feeding, pests and diseases, and crop rotation. $12.00, paid as 0.0012 USDC. Paid when bought (x402 `exact`). Delivers: A pass, good for 720 hours from the purchase, that opens 3 members' files. Offer id `members-pass`; buy at https://hollin-garden.integraledger.com/buy/members-pass, its network in the body's `network`, paid by x402 or, on an EVM network, by MPP; test checkout https://hollin-garden.integraledger.com/test/buy/members-pass. In a UCP checkout: the line's item is `members-pass`. - [Plant doctor: one diagnosis](https://hollin-garden.integraledger.com/products/plant-doctor): Tell us the plant and what is wrong with it. You get a written diagnosis with the likely cause and what to do this week. $2.30, paid as 0.00023 USDC. Paid when bought (x402 `exact`). Delivers: Work a language model does once, after the payment settles, on what the buyer gives; delivered in the answer to the paid request, and only then. The address the agreement names answers its state, size and hash. Asks for: plant, problem. Offer id `plant-doctor`; buy at https://hollin-garden.integraledger.com/buy/plant-doctor, its network in the body's `network`, paid by x402 or, on an EVM network, by MPP; test checkout https://hollin-garden.integraledger.com/test/buy/plant-doctor. In a UCP checkout: the line's item is `plant-doctor`; it asks for plant at `$['com.integraledger.lcp.with'].plant`, problem at `$['com.integraledger.lcp.with'].problem`. - [Sweet pea collection, six varieties](https://hollin-garden.integraledger.com/products/sweet-pea-collection): Six scented sweet pea varieties, thirty seeds of each, grown in our own beds and packed in paper envelopes. $8.50, paid as 0.00085 USDC. Paid when bought (x402 `exact`). Delivers: An order for goods, with its number. The order is recorded and the stock is reduced. Nothing is sent. Asks for: name, address. Open to negotiation. Offer id `sweet-pea-collection`; buy at https://hollin-garden.integraledger.com/buy/sweet-pea-collection, its network in the body's `network`, paid by x402 or, on an EVM network, by MPP; test checkout https://hollin-garden.integraledger.com/test/buy/sweet-pea-collection. In a UCP checkout: the line's item is `sweet-pea-collection`; it asks for name at `$.buyer.first_name`, address at `$.fulfillment`. ## Buy over HTTP, with x402 - `POST https://hollin-garden.integraledger.com/buy/` with JSON `{"quote"?, "with"?, "network"?}`, `network` the CAIP-2 id of the network it is paid on (without it, `eip155:84532`); `GET` for an offer that asks for nothing, paid on `eip155:84532`. Unpaid, it answers `402` with `PAYMENT-REQUIRED`: base64 of the `PaymentRequired`. A network this shop does not know, or one this way of paying is never paid on, is `400`; one not offered now, `503`; each with the reason. - Repeat the same request exactly, its body byte for byte, with `PAYMENT-SIGNATURE`: base64 of the payment. It answers `200` with `PAYMENT-RESPONSE`, or `202` while the payment is sent and not yet confirmed. Paid and not yet delivered, it answers `503` with `PAYMENT-RESPONSE` (the payment succeeded) and `Retry-After`, or `502` once the seller gave up the delivery: the payment is never said to have failed. - Every `402` declares x402's `payment-identifier` extension, not required: a payment that names itself with an id, sent again, is answered from the first, never paid twice. It carries `offer-receipt`'s signed offer, a JWS (ES256) whose `kid` is the key's method in https://hollin-garden.integraledger.com/.well-known/did.json; the paid answer's `PAYMENT-RESPONSE` carries the signed receipt. - `POST https://hollin-garden.integraledger.com/negotiate/` with `{"amount", "text", "negotiation"?}`: the same negotiation as the tool. - The doors' answers and the documents below are signed (RFC 9421, label `sig1`, covering `@status`, `content-digest` and `content-type`, algorithm `ecdsa-p256-sha256`) with the ES256 key whose `kid` the `keyid` names, in `keys[]` of https://hollin-garden.integraledger.com/.well-known/ucp. - Every door over HTTP, with the body it takes and what it asks to be paid, is declared in https://hollin-garden.integraledger.com/openapi.json (OpenAPI 3.1; each offer's door's `x-payment-info`, of the HTTP Payment scheme's discovery draft, names an offer of method `x402` for each network and, where MPP is offered, one of method `evm`, each with the amount in USDC base units, the token, the network and the payee). ## Buy over HTTP, with MPP - For `sowing-calendar`, `garden-visit`, `members-pass`, `plant-doctor` and `sweet-pea-collection`, on an EVM network (Base Sepolia, chain id 84532; Arc testnet, chain id 5042002; Avalanche® Fuji, chain id 43113; Ethereum Sepolia, chain id 11155111; Arbitrum Sepolia, chain id 421614; OP Sepolia, chain id 11155420; Polygon Amoy, chain id 80002; Unichain Sepolia, chain id 1301; World Chain Sepolia, chain id 4801; Ink Sepolia, chain id 763373; Celo Sepolia, chain id 11142220; Monad testnet, chain id 10143; Sei testnet, chain id 1328; Sonic testnet, chain id 14601; EDGE testnet, chain id 33431; Morph Hoodi, chain id 2910; Codex testnet, chain id 812242; Cronos testnet, chain id 338; Pharos Atlantic, chain id 688689; Plasma testnet, chain id 9746; Plume testnet, chain id 98867; XDC Apothem, chain id 51; ZKsync Sepolia, chain id 300), the `402` of `https://hollin-garden.integraledger.com/buy/` also carries MPP's challenge (the HTTP `Payment` scheme, method `evm`, intent `charge`): `WWW-Authenticate: Payment id="…", realm="…", method="evm", intent="charge", request="…", expires="…", opaque="…"`, for the same amount of the same token to the same payee, on the same network. - The challenge has an agreement of its own. Its `opaque`, base64url of JSON, holds `legalContext`, `lcp:sha256:` and that agreement's H, and `legalContextUrl`, its link; its `id` is base64url of H's 32 bytes, `.`, and its position. Its `request`, base64url of JSON, holds the `amount` in base units, the `currency` (USDC's address), the `recipient` (the payee) and `methodDetails` (`chainId`, `credentialTypes: ["authorization"]`, `decimals`). - Pay it with `Authorization: Payment `, base64url of JSON: the challenge echoed whole, `source` (your `did:pkh`), and `payload` `{type: "authorization", from, to, value, validAfter, validBefore, nonce, signature}`, an EIP-3009 `transferWithAuthorization` of the amount to the recipient whose `nonce` is keccak256 of the challenge's `id` and `realm`. An `mppx` client does this unchanged. The answer is `200` with `Payment-Receipt`. - Pay one of the two challenges, not both. The one paid is claimed; the other expires unpaid. Over MCP, this shop is x402 only. ## Buy over MCP, with x402 and the kit's own tools - Endpoint: https://hollin-garden.integraledger.com/mcp, streamable HTTP, MCP revision 2026-07-28, stateless, with no sign-in. Clients of the 2025 revisions are served too. - `search_catalog`, `lookup_catalog`, `get_product`: the catalogue, as UCP's Catalog capability. `meta["ucp-agent"]` is not required. - `get_terms`: the terms and conditions of sale, and an offer's terms with their hash. - `negotiate`: for an offer open to negotiation, propose a price in dollars and cents. At most 4 rounds; an accepted price stands for 10 minutes, for one purchase, under the negotiation's id. - `buy` `{offer, network?, quote?, with?}`: x402 version 2 over MCP, `network` the CAIP-2 id of the network the checkout is paid on. The first call answers payment required: a result with `isError: true` and the `PaymentRequired` in `structuredContent`. Call `buy` again with the same arguments and the signed payment object in `params._meta["x402/payment"]`. The result holds the delivery and the proof's address, and the receipt in `_meta["x402/payment-response"]`. A payment sent but not yet confirmed is answered as pending, not as an error: ask `get_purchase`, or send the same payment again. - `test_buy`: the test checkout, below. - `get_purchase` `{atrHash}`: a purchase's state, what was delivered (its kind, size and SHA-256, never its bytes) and its proof's address. The delivery itself is only in the answer to the paid request. ## Buy over A2A - The agent card: `GET https://hollin-garden.integraledger.com/.well-known/agent-card.json` (or `/.well-known/agent.json`, or either under `/a2a`). Send `A2A-Version: 1.0` (or `?A2A-Version=1.0`) for version 1.0's card; without it, or with `0.3`, the card is version 0.3's. The card is signed (a JWS over its RFC 8785 form) with the key in `keys[]`. - JSON-RPC at `POST https://hollin-garden.integraledger.com/a2a`, where the method's name says the version: `SendMessage`, `GetTask`, `ListTasks` and `CancelTask` are version 1.0's; `message/send`, `tasks/get` and `tasks/cancel` are version 0.3's. Nothing streams, and no push notifications are sent. - The skills: `search_catalog`, "Find in the catalogue"; `get_terms`, "Read the terms"; `negotiate`, "Negotiate a price"; `buy`, "Buy an offer". A data part `{"action", …}` names one of `search_catalog`, `lookup_catalog`, `get_product`, `get_terms`, `negotiate`, `buy` and `get_purchase`, with the same arguments as the MCP tool of that name. A data part `{"offer", "quote"?, "with"?, "network"?}` with no `action` is `buy`; a message in words goes to the seller's agent, which picks one. - Buying: the task asks for input (`TASK_STATE_INPUT_REQUIRED`, or `input-required` in 0.3) with x402's `PaymentRequired` in its status message's metadata under `x402.payment.required` (x402 over A2A, https://github.com/google-agentic-commerce/a2a-x402/blob/main/spec/v0.2), and H and the agreement's link in the task's metadata under `https://lcp.integraledger.com/a2a/legal-context/v1`. Check H as below, then send the signed payment in a second message to the same task, under `x402.payment.payload` with `x402.payment.status: "payment-submitted"`. The completed task carries the delivery, the receipt under `x402.payment.receipts`, and the proof's address. - UCP's checkout over A2A, as UCP's A2A binding has it: a data part `{"action", …}` naming one of `create_checkout`, `add_to_checkout`, `get_checkout`, `update_checkout`, `complete_checkout` and `cancel_checkout`, the checkout under `a2a.ucp.checkout` and its payment under `a2a.ucp.checkout.payment`, with your platform's profile in `UCP-Agent`. The `contextId` carries the checkout: an action that names no `id` acts on the context's checkout. The profile names the card as the `a2a` transport. ## Check out with UCP, over REST or MCP - The profile, https://hollin-garden.integraledger.com/.well-known/ucp (UCP 2026-08-25): the service `dev.ucp.shopping` over `rest` (endpoint https://hollin-garden.integraledger.com), `mcp` (https://hollin-garden.integraledger.com/mcp) and `a2a` (the A2A card, https://hollin-garden.integraledger.com/.well-known/agent-card.json); the capabilities `dev.ucp.shopping.checkout`, `dev.ucp.shopping.order`, `dev.ucp.shopping.discount`, `dev.ucp.shopping.fulfillment`, `dev.ucp.common.payment.terms`, `com.integraledger.lcp.with` and `dev.ucp.common.payment.ap2_mandate`, with the catalogue's; and the payment handler `com.integraledger.lcp.x402` (specification https://lcp.integraledger.com/ucp/x402/2026-10-02), declared once for each network: `lcp_x402_base_sepolia` (`eip155:84532`, token `0x036CbD53842c5426634e7929541eC2318f3dCF7e`, schemes `exact` and `auth-capture`); `lcp_x402_arc_testnet` (`eip155:5042002`, token `0x3600000000000000000000000000000000000000`, schemes `exact` and `auth-capture`); `lcp_x402_avalanche_fuji` (`eip155:43113`, token `0x5425890298aed601595a70AB815c96711a31Bc65`, schemes `exact` and `auth-capture`); `lcp_x402_hedera_testnet` (`hedera:testnet`, token `0.0.429274`, schemes `exact`); `lcp_x402_stellar_testnet` (`stellar:testnet`, token `CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA`, schemes `exact`); `lcp_x402_xrpl_testnet` (`xrpl:1`, token `5553444300000000000000000000000000000000`, schemes `exact`); `lcp_x402_ethereum_sepolia` (`eip155:11155111`, token `0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238`, schemes `exact`); `lcp_x402_arbitrum_sepolia` (`eip155:421614`, token `0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d`, schemes `exact`); `lcp_x402_op_sepolia` (`eip155:11155420`, token `0x5fd84259d66Cd46123540766Be93DFE6D43130D7`, schemes `exact`); `lcp_x402_polygon_amoy` (`eip155:80002`, token `0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582`, schemes `exact`); `lcp_x402_unichain_sepolia` (`eip155:1301`, token `0x31d0220469e10c4E71834a79b1f276d740d3768F`, schemes `exact`); `lcp_x402_world_chain_sepolia` (`eip155:4801`, token `0x66145f38cBAC35Ca6F1Dfb4914dF98F1614aeA88`, schemes `exact`); `lcp_x402_ink_sepolia` (`eip155:763373`, token `0xFabab97dCE620294D2B0b0e46C68964e326300Ac`, schemes `exact`); `lcp_x402_celo_sepolia` (`eip155:11142220`, token `0x01C5C0122039549AD1493B8220cABEdD739BC44E`, schemes `exact`); `lcp_x402_monad_testnet` (`eip155:10143`, token `0x534b2f3A21130d7a60830c2Df862319e593943A3`, schemes `exact`); `lcp_x402_sei_testnet` (`eip155:1328`, token `0x4fCF1784B31630811181f670Aea7A7bEF803eaED`, schemes `exact`); `lcp_x402_sonic_testnet` (`eip155:14601`, token `0x0BA304580ee7c9a980CF72e55f5Ed2E9fd30Bc51`, schemes `exact`); `lcp_x402_edge_testnet` (`eip155:33431`, token `0x2d9F7CAD728051AA35Ecdc472a14cf8cDF5CFD6B`, schemes `exact`); `lcp_x402_morph_hoodi` (`eip155:2910`, token `0x7433b41C6c5e1d58D4Da99483609520255ab661B`, schemes `exact`); `lcp_x402_codex_testnet` (`eip155:812242`, token `0x6d7f141b6819C2c9CC2f818e6ad549E7Ca090F8f`, schemes `exact`); `lcp_x402_cronos_testnet` (`eip155:338`, token `0xEb33dc5fac03833e132593659e1dE7256aB59794`, schemes `exact`); `lcp_x402_pharos_atlantic` (`eip155:688689`, token `0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B`, schemes `exact`); `lcp_x402_plasma_testnet` (`eip155:9746`, token `0xE67Fb267022cBA8064Dd388CC2FED724F3120D9D`, schemes `exact`); `lcp_x402_plume_testnet` (`eip155:98867`, token `0xcB5f30e335672893c7eb944B374c196392C19D18`, schemes `exact`); `lcp_x402_xdc_apothem` (`eip155:51`, token `0xb5AB69F7bBada22B28e79C8FFAECe55eF1c771D4`, schemes `exact`); `lcp_x402_zksync_sepolia` (`eip155:300`, token `0xAe045DE5638162fa134807Cb558E15A3F5A7F853`, schemes `exact`). Your platform's profile names the networks it pays on in its declaration of the handler (`config.networks`): a checkout is paid on one both declare, `eip155:84532` when it is one of them, and lists that network's declaration alone, which `complete` names; a profile that lists none is paid on `eip155:84532`. - Your platform's profile is required at checkout: send `UCP-Agent: profile=""` on every REST request, or `meta["ucp-agent"].profile` in every tool's arguments. This shop fetches it, and sends order webhooks to its order capability's `webhook_url`. The catalogue asks for no profile. - Over REST: `POST https://hollin-garden.integraledger.com/checkout-sessions` opens a checkout; `GET` and `PUT https://hollin-garden.integraledger.com/checkout-sessions/` read and update it; `POST https://hollin-garden.integraledger.com/checkout-sessions//complete` pays it; `POST https://hollin-garden.integraledger.com/checkout-sessions//cancel` cancels it; `GET https://hollin-garden.integraledger.com/orders/` reads its order. Each request that changes a checkout carries `Idempotency-Key`, a UUID: the same key with another body answers `409`. - Over MCP: `create_checkout` `{meta, checkout}`, `get_checkout` `{meta, id}`, `update_checkout` `{meta, id, checkout}`, `complete_checkout` `{meta, id, checkout: {payment}}`, `cancel_checkout` `{meta, id}` and `get_order` `{meta, id}`; `complete_checkout` and `cancel_checkout` take `meta["idempotency-key"]`, a UUID. The tools' names do not collide with the kit's own. - One offer for each checkout, quantity 1: the line's `item.id` is the offer's id, or for a booking a slot variant `:`. What an offer asks for goes in UCP's own fields: a name in `buyer.first_name` and `buyer.last_name`, an email in `buyer.email`, a phone number in `buyer.phone_number`, an address as a `shipping` method's selected destination in `fulfillment`; anything else in the checkout's `com.integraledger.lcp.with` member, by its name. What is missing is a `missing` message at its path; a value is at most 1000 characters, and a longer one is `invalid` at its path, never cut. A platform whose profile does not declare the extension an ask needs (`com.integraledger.lcp.with`, or UCP's fulfillment extension for an address) cannot send it: the checkout is `requires_escalation`, with a `requires_buyer_input` message naming the ask, and its `continue_url` is the offer's page, which says how to give it. A checkout opened by a signed request is answered only to requests its platform signs. An agreed price from `negotiate` is a discount code, the negotiation's id, in `discounts.codes`. - The statuses: `incomplete` while something asked for is missing; `requires_escalation` while the offer asks for something the platform cannot send; `ready_for_complete` once it is priced and sellable, when its agreement is issued for its network; `complete_in_progress` while a payment is sent and not yet confirmed; `completed`, with its `order`, once settled (a delivery not yet made is a `delivery_pending` info, and one given up a `not_delivered` warning); `canceled`. Each change of the terms, or of the network, issues a new agreement, with its own H. - To pay: at `ready_for_complete`, the checkout's `ucp.payment_handlers["com.integraledger.lcp.x402"]` lists one declaration, its network's, which holds as its `config` the x402 `PaymentRequired`: its `extensions.legalContext` holds H and the agreement's link, and its `accepts` the one option, paying the payee on that network. The checkout's `links[]` holds `{type: "legal_context", url, title: "lcp:sha256:" + H}`. Check H as below, sign the option as x402 has it signed, and complete with one instrument `{id, handler_id: , type: "x402", credential: {type: "x402", x402Version: 2, paymentPayload, paymentRequirements}}` in `payment.instruments`. A refused payment is a `payment_failed` message, and the checkout stays open. - Under AP2 mandates (`dev.ucp.common.payment.ap2_mandate`, when your profile declares it, with a key in its `keys[]`), a platform's agent completes without a person. Every checkout carries `ap2.merchant_authorization`, a detached JWS (ES256, `kid` the key in this profile's `keys[]`) over the RFC 8785 form of the whole checkout without `ap2`. Its `links[]` also hold `{type: "legal_context_agreement", url}`, the agreement step: before you complete, `GET` it and pay its 402, an x402 `exact` payment whose EIP-3009 nonce is H. A checkout under AP2 mandates is paid on an EVM network. Then complete with `ap2.checkout_mandate`, an SD-JWT (`~`, signed with a key of your profile) whose payload has `vct: "mandate.checkout.1"`, `checkout_jwt` (the merchant authorization with the checkout as its payload) and `checkout_hash` (base64url of its SHA-256), and `exp`; and in the instrument's `credential.token` the payment mandate, an SD-JWT with `vct: "mandate.payment.1"` and `transaction_id` the `checkout_hash`. The EIP-3009 nonce of the payment is keccak256 of the token, as AP2's samples sign it, not H. Under AP2 mandates this shop sells offers paid now in full: a checkout under them for an offer paid later, or authorised now and collected later, is answered `item_unavailable`, and no agreement is issued; buy it in a checkout without them. - Pay later: the checkout's `payment` terms (`dev.ucp.common.payment.terms`) say what is owed and when; the handler asks only for the anchoring payment. - Authorise now, collect later: the handler's option is x402 `auth-capture`, into the escrow on the checkout's network, which must have one. - The order: `GET https://hollin-garden.integraledger.com/orders/` and `get_order` answer UCP's order to the platform whose checkout made it, when the request is signed with that platform's key; anyone else is answered the kit's summary of the delivery. Order webhooks go, signed, to that platform's `webhook_url`. ## Before you sign - The payment request's `extensions.legalContext.info` holds `value`, the agreement's hash H, and `legalContextUrl`, its link. Fetch the link, hash the exact bytes with SHA-256, and compare with H. Sign only if they match. - On Base Sepolia, Arc testnet, Avalanche® Fuji, Ethereum Sepolia, Arbitrum Sepolia, OP Sepolia, Polygon Amoy, Unichain Sepolia, World Chain Sepolia, Ink Sepolia, Celo Sepolia, Monad testnet, Sei testnet, Sonic testnet, EDGE testnet, Morph Hoodi, Codex testnet, Cronos testnet, Pharos Atlantic, Plasma testnet, Plume testnet, XDC Apothem and ZKsync Sepolia: For an offer paid when bought, and for pay later's anchoring payment (x402 `exact`), H is the nonce of the EIP-3009 authorization; for an offer authorised now and collected later (x402 `auth-capture`), H is in the escrow payment's salt. The same offers are offered through MPP too (the `evm` method's `authorization` credential), under an agreement of their own: its challenge's `id` is base64url of its H and the challenge's position, its `opaque` names H, and the EIP-3009 authorization's nonce is keccak256 of the id and the realm. - On Hedera testnet: For an offer paid when bought, and for pay later's anchoring payment (x402 `exact` on Hedera), H is the memo of the Hedera transaction the buyer signs, written `lcp:sha256:` followed by H, which any Mirror Node shows by the transaction's id. - On Stellar testnet: On Stellar (x402 `exact`), for an offer paid when bought and for pay later's anchoring payment, the challenge's `payTo` is the payee's muxed address (`M…`), whose 64-bit id is the first 8 bytes of H: the payer signs the Soroban `transfer` of USDC to it, and the USDC lands in the payee's own account (`G…`), its transfer event carrying that id. - On XRPL Testnet: On XRPL (x402 `exact`), for an offer paid when bought and for pay later's anchoring payment, H rides as the `InvoiceID` of the Payment the buyer signs: the SHA-256 of `lcp:sha256:` followed by H (the option's `extra.invoiceId`). The buyer pays its own fee and spends one of its tickets, Integra's facilitator submits the signed Payment, and the USDC is delivered to the payee's address; the ledger shows the InvoiceID, which anyone holding the agreement can check against H. - Pay later: the amount the payment request asks is the anchor, 0.000001 USDC, not the price. What is owed, when it is due and how it is to be paid are in the agreement's `deferred` slot: read them there, and hold your budget against what is owed. - An agreement can be paid once, within 15 minutes of its issue. ## The test checkout `https://hollin-garden.integraledger.com/test/buy/` and the tool `test_buy`. A checkout for testing your agent. The hash it advertises has one character changed. An agent that checks signs nothing. Nothing is sold here. ## An agent that signs its requests This shop reads Web Bot Auth signatures (RFC 9421, tag web-bot-auth, the key named by Signature-Agent) and Visa's Trusted Agent Protocol signatures (tags agent-browser-auth and agent-payer-auth, Visa's key store), and never requires one. There is nothing to register: sign the request and name your key directory in Signature-Agent. What was verified is shown on the purchase's proof page. It is not part of the agreement. An unsigned request is served the same. The algorithms: `ed25519`, `ecdsa-p256-sha256`, `ecdsa-p384-sha384`, `rsa-pss-sha512` and `rsa-v1_5-sha256`. ## After - Each purchase has a proof page at `https://hollin-garden.integraledger.com/proof/`, and its record at `https://hollin-garden.integraledger.com/proof/.json`. ## Documents - [Terms and conditions of sale](https://hollin-garden.integraledger.com/terms.md): each offer's terms, with the SHA-256 of their RFC 8785 form. - [Legal context](https://hollin-garden.integraledger.com/.well-known/legal-context.json): where the terms are. Its `atrHash` is the terms' hash: the SHA-256 of /terms.md, not an agreement's. - [UCP profile](https://hollin-garden.integraledger.com/.well-known/ucp): the services over REST, MCP and A2A, the capabilities, the payment handler, and the app's signing key in `keys[]`. - [DID document](https://hollin-garden.integraledger.com/.well-known/did.json): the shop's `did:web:hollin-garden.integraledger.com`, whose verification method is the same key. - [Key directory](https://hollin-garden.integraledger.com/.well-known/http-message-signatures-directory): the same key, as a Web Bot Auth key directory. - [OpenAPI](https://hollin-garden.integraledger.com/openapi.json): the doors over HTTP, and what each asks to be paid. - [ARD and AI Catalog manifest](https://hollin-garden.integraledger.com/.well-known/ard.json), the same at https://hollin-garden.integraledger.com/.well-known/ai-catalog.json: one entry each for the MCP server card, the A2A card, the OpenAPI document, the skills index and this file. - [MCP server card](https://hollin-garden.integraledger.com/mcp/server-card): the MCP server's name, version and address, before you connect. - [A2A card](https://hollin-garden.integraledger.com/.well-known/agent-card.json): the A2A agent, its skills and its extensions. - [Agent Skills index](https://hollin-garden.integraledger.com/.well-known/agent-skills/index.json): one skill, [buy-from-hollin-kitchen-garden](https://hollin-garden.integraledger.com/.well-known/agent-skills/buy-from-hollin-kitchen-garden/SKILL.md), how to buy from this shop; `npx skills add https://hollin-garden.integraledger.com` installs it. - [API catalog](https://hollin-garden.integraledger.com/.well-known/api-catalog): RFC 9727's linkset of the HTTP doors, MCP and A2A, each with what describes it. - [Connect your agent](https://hollin-garden.integraledger.com/agents): the same doors, for a person. - Each offer's page, at `https://hollin-garden.integraledger.com/products/`, carries its product as schema.org JSON-LD, named by that address.