# The Quillfield Hotel > A forty-room hotel on the harbour at Whitby, on the North Yorkshire coast. 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`), Solana devnet (`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`), XRPL Testnet (`xrpl:1`), Algorand testnet (`algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe`), 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`), Morph Hoodi (`eip155:2910`), Cronos testnet (`eip155:338`) and Pharos Atlantic (`eip155:688689`). - Base Sepolia (`eip155:84532`, the default): evm network; USDC `0x036CbD53842c5426634e7929541eC2318f3dCF7e`; the escrow, so a hold too; the shop's seller account `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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.11173958`; 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 `GBNLGWYYSWD2MCXES2JJ7NMVWS57K2KLRBEMQERE2BFAM3OXEP7PU26E`; UCP's declaration `lcp_x402_stellar_testnet`. - Solana devnet (`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`): svm network; USDC `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`; no escrow, so no hold; the shop's seller account `EzKhBkqQQyNHrpU1Zz91PrGf1tRD7BSYMFec9THiPLss`; UCP's declaration `lcp_x402_solana_devnet`. - XRPL Testnet (`xrpl:1`): xrpl network; USDC `5553444300000000000000000000000000000000`; no escrow, so no hold; the shop's seller account `r3gmUZL9n6D5DAr62rcaAxYqUD6uRbWvs`; UCP's declaration `lcp_x402_xrpl_testnet`. - Algorand testnet (`algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe`): avm network; USDC `10458941`; no escrow, so no hold; the shop's seller account `S55ZYLZEICBSJCXJJQJEP7ICMHZKHNVYLYH2CSPLEC4QNI3EAKAYU76KQE`; UCP's declaration `lcp_x402_algorand_testnet`. - Ethereum Sepolia (`eip155:11155111`): evm network; USDC `0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238`; no escrow, so no hold; the shop's seller account `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; UCP's declaration `lcp_x402_sonic_testnet`. - Morph Hoodi (`eip155:2910`): evm network; USDC `0x7433b41C6c5e1d58D4Da99483609520255ab661B`; no escrow, so no hold; the shop's seller account `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; UCP's declaration `lcp_x402_morph_hoodi`. - Cronos testnet (`eip155:338`): evm network; USDC `0xEb33dc5fac03833e132593659e1dE7256aB59794`; no escrow, so no hold; the shop's seller account `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; 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 `0xa00768eB29AC9DA2bAd0e66a8b63FBCd705aBDb3`; UCP's declaration `lcp_x402_pharos_atlantic`. ## The doors - **x402 over HTTP:** `https://quillfield-hotel.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://quillfield-hotel.integraledger.com/mcp, its network in `network`, with the payment in `params._meta["x402/payment"]`. - **UCP's checkout over REST:** `https://quillfield-hotel.integraledger.com/checkout-sessions` (UCP 2026-08-25), as the profile at https://quillfield-hotel.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://quillfield-hotel.integraledger.com/mcp, paid through the same handler. Your platform's profile goes in `meta["ucp-agent"]`. - **A2A:** the agent card at `https://quillfield-hotel.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://quillfield-hotel.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. - **The kit's own tools** at https://quillfield-hotel.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 - [One night, double room](https://quillfield-hotel.integraledger.com/products/double-room): A double room for one night, for two, with breakfast. Check in from three in the afternoon, and out by eleven the next morning. $95.00, paid as 0.0095 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 1200 minutes, confirmed with a reference and an .ics file. Slots start at 15:00 (Europe/London) on mon, tue, wed, thu, fri, sat, sun, up to 90 days ahead; the catalogue lists the free ones. A slot takes 30 bookings, each held for one buyer only. Asks for: name. Offer id `double-room`; buy at https://quillfield-hotel.integraledger.com/buy/double-room, its network in the body's `network`, paid by x402, on a network with the escrow; test checkout https://quillfield-hotel.integraledger.com/test/buy/double-room. In a UCP checkout: the line's item is a slot variant, `double-room:`, as the catalogue lists the free slots; it asks for name at `$.buyer.first_name`, slot at `$.line_items[0].item.id`. - [One night, single room](https://quillfield-hotel.integraledger.com/products/single-room): A single room for one night, with breakfast. Check in from three in the afternoon, and out by eleven the next morning. $75.00, paid as 0.0075 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 1200 minutes, confirmed with a reference and an .ics file. Slots start at 15:00 (Europe/London) on mon, tue, wed, thu, fri, sat, sun, up to 90 days ahead; the catalogue lists the free ones. A slot takes 10 bookings, each held for one buyer only. Asks for: name. Offer id `single-room`; buy at https://quillfield-hotel.integraledger.com/buy/single-room, its network in the body's `network`, paid by x402, on a network with the escrow; test checkout https://quillfield-hotel.integraledger.com/test/buy/single-room. In a UCP checkout: the line's item is a slot variant, `single-room:`, as the catalogue lists the free slots; it asks for name at `$.buyer.first_name`, slot at `$.line_items[0].item.id`. ## Buy over HTTP, with x402 - `POST https://quillfield-hotel.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://quillfield-hotel.integraledger.com/.well-known/did.json; the paid answer's `PAYMENT-RESPONSE` carries the signed receipt. - `POST https://quillfield-hotel.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://quillfield-hotel.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://quillfield-hotel.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, each with the amount in USDC base units, the token, the network and the payee). ## Buy over MCP, with x402 and the kit's own tools - Endpoint: https://quillfield-hotel.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://quillfield-hotel.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://quillfield-hotel.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://quillfield-hotel.integraledger.com/.well-known/ucp (UCP 2026-08-25): the service `dev.ucp.shopping` over `rest` (endpoint https://quillfield-hotel.integraledger.com), `mcp` (https://quillfield-hotel.integraledger.com/mcp) and `a2a` (the A2A card, https://quillfield-hotel.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_solana_devnet` (`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`, token `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`, schemes `exact`); `lcp_x402_xrpl_testnet` (`xrpl:1`, token `5553444300000000000000000000000000000000`, schemes `exact`); `lcp_x402_algorand_testnet` (`algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe`, token `10458941`, 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_morph_hoodi` (`eip155:2910`, token `0x7433b41C6c5e1d58D4Da99483609520255ab661B`, schemes `exact`); `lcp_x402_cronos_testnet` (`eip155:338`, token `0xEb33dc5fac03833e132593659e1dE7256aB59794`, schemes `exact`); `lcp_x402_pharos_atlantic` (`eip155:688689`, token `0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B`, 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://quillfield-hotel.integraledger.com/checkout-sessions` opens a checkout; `GET` and `PUT https://quillfield-hotel.integraledger.com/checkout-sessions/` read and update it; `POST https://quillfield-hotel.integraledger.com/checkout-sessions//complete` pays it; `POST https://quillfield-hotel.integraledger.com/checkout-sessions//cancel` cancels it; `GET https://quillfield-hotel.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. - 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://quillfield-hotel.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, Morph Hoodi, Cronos testnet and Pharos Atlantic: 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 Solana devnet: On Solana (x402 `exact`), for an offer paid when bought and for pay later's anchoring payment, H is the one Memo instruction of the transaction the buyer signs, written `lcp:sha256:` followed by H (the option's `extra.memo`): the facilitator's account completes it as its fee payer, its instruction data on chain carries the memo, and the USDC lands in the payee's associated token account. - 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. - On Algorand testnet: On Algorand (x402 `exact`), for an offer paid when bought and for pay later's anchoring payment, H is the note of the asset transfer the buyer signs, written `lcp:sha256:` followed by H: the transfer moves the USDC to the payee's account, grouped after the facilitator's payment of nothing to itself, which pays both fees, and the note is on chain in the confirmed transaction. - An agreement can be paid once, within 15 minutes of its issue. ## The test checkout `https://quillfield-hotel.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://quillfield-hotel.integraledger.com/proof/`, and its record at `https://quillfield-hotel.integraledger.com/proof/.json`. ## Documents - [Terms and conditions of sale](https://quillfield-hotel.integraledger.com/terms.md): each offer's terms, with the SHA-256 of their RFC 8785 form. - [Legal context](https://quillfield-hotel.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://quillfield-hotel.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://quillfield-hotel.integraledger.com/.well-known/did.json): the shop's `did:web:quillfield-hotel.integraledger.com`, whose verification method is the same key. - [Key directory](https://quillfield-hotel.integraledger.com/.well-known/http-message-signatures-directory): the same key, as a Web Bot Auth key directory. - [OpenAPI](https://quillfield-hotel.integraledger.com/openapi.json): the doors over HTTP, and what each asks to be paid. - [ARD and AI Catalog manifest](https://quillfield-hotel.integraledger.com/.well-known/ard.json), the same at https://quillfield-hotel.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://quillfield-hotel.integraledger.com/mcp/server-card): the MCP server's name, version and address, before you connect. - [A2A card](https://quillfield-hotel.integraledger.com/.well-known/agent-card.json): the A2A agent, its skills and its extensions. - [Agent Skills index](https://quillfield-hotel.integraledger.com/.well-known/agent-skills/index.json): one skill, [buy-from-the-quillfield-hotel](https://quillfield-hotel.integraledger.com/.well-known/agent-skills/buy-from-the-quillfield-hotel/SKILL.md), how to buy from this shop; `npx skills add https://quillfield-hotel.integraledger.com` installs it. - [API catalog](https://quillfield-hotel.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://quillfield-hotel.integraledger.com/agents): the same doors, for a person. - Each offer's page, at `https://quillfield-hotel.integraledger.com/products/`, carries its product as schema.org JSON-LD, named by that address.