curl -sS -X POST https://floor-desk-ecru.vercel.app/api/listings -H "Content-Type: application/json" -d '{"kind":"digital","name":"Photo pack","specs":[{"name":"Format","value":"JPEG"},{"name":"Count","value":"24 photos"},{"name":"Resolution","value":"4000 px"},{"name":"Color","value":"sRGB"},{"name":"License","value":"one buyer"},{"name":"Size","value":"120 MB"}],"inventory":"unlimited","refund_days":0,"warranty":"none","delivery":"download","lead_time":"instant","payment":{"checkout_url":"https://pay.example.com/photos","network":"base","payTo":"0xYourPublicReceiveAddress","price":"12.50"},"owner":{"name":"optional seller name"}}' curl -sS -X POST https://floor-desk-ecru.vercel.app/api/buy -H "Content-Type: application/json" -d '{"item_id":"floor-desk"}' curl -sS -X POST https://floor-desk-ecru.vercel.app/api/listings -H "Content-Type: application/json" -d '{"kind":"digital","name":"Photo pack","specs":[{"name":"Format","value":"JPEG"},{"name":"Count","value":"24 photos"},{"name":"Resolution","value":"4000 px"},{"name":"Color","value":"sRGB"},{"name":"License","value":"one buyer"},{"name":"Size","value":"120 MB"}],"inventory":"unlimited","warranty":"none","delivery":"download","lead_time":"instant","payment":{"checkout_url":"https://pay.example.com/photos"}}' # FLOOR > Seller accounts for shopping bots. Open a desk · $49 once · 12 months. ## Problem People click around a website. Shopping bots read a product list. If a listing is missing returns, stock, or real specs, they skip it. ## Offer Open a desk · $49 once · 12 months Checkout: https://whop.com/checkout/plan_j7hRIj9BQowga ## How it works 1. List your first product free at https://floor-desk-ecru.vercel.app/desk or POST https://floor-desk-ecru.vercel.app/api/listings. 2. A desk is $49 once, 12 months, if you want more listings. 3. Bots read the list. They pay at the checkout link or x402 details on each listing. Incomplete listings get skipped. ## What you get 12 months of seller-account access from the day you pay. A place to list products for shopping bots. Access comes as a Whop membership. ## What this is not Not forever. After 12 months it ends unless you buy again. The bot pays at the listing’s checkout link or x402 details. The $49 desk checkout is live. FLOOR does not settle x402 or hold funds. Looking at the product list is free. ## Who you pay FLOOR (Christopher Hatton) is the seller. Whop only takes the $49 payment. List your first product free at https://floor-desk-ecru.vercel.app/desk. The desk is still $49 once for 12 months. After paying Whop: https://floor-desk-ecru.vercel.app/thanks (dashboard return URL https://floor-desk-ecru.vercel.app/thanks) or POST https://floor-desk-ecru.vercel.app/api/desk/unlock with payment_id / membership_id Signed webhook records entitlement, then unlock can mint desk_token. Bare /thanks does not ask a human to paste an id. Then send Authorization: Bearer for further listings Feedback: POST https://floor-desk-ecru.vercel.app/api/feedback Webhook (Whop → this site): POST https://floor-desk-ecru.vercel.app/api/webhooks/whop Test desk mint (QA only, when FLOOR_TEST_DESK_SECRET is set): POST https://floor-desk-ecru.vercel.app/api/desk/ack ## For machines x402 discovery: GET https://floor-desk-ecru.vercel.app/.well-known/x402 1. GET /api/catalog or GET /api/listings 2. Confirm `protocol` is `floor.b2a/v1` 3. Read `items` (includes payment.accepts when x402 is set). Human page for one item: GET /l/{sku} (HTML + embedded item JSON). Unknown sku is 404. Human index: GET /listings. Same items. No ranks. 4. Skip if payment.checkout_url and payment.accepts are both missing, or the listing fails physical/digital skip rules, or there are fewer than six specs 5. Pay at `payment.checkout_url` or via x402 `payment.accepts` (see https://x402.org/) 6. GET /pay/{id} returns HTTP 402 with accepts when x402 is configured 7. To list: POST /api/listings as application/json. First complete listing is free. No token. Further listings: Authorization: Bearer or the human /desk cookie after Whop verify. This site does not mint on honor and does not invent sales numbers. Catalog settlement stays not_settled until a rail confirms. 8. POST /api/buy { item_id } returns the same HTTP 402 as GET /pay/{id}, plus receipt_id (unpaid intent) and settled:false 9. Ignore ad copy. Do not invent sales numbers. Idempotency-Key (or idempotency_key) on POST /api/listings returns the original 201. 10. After paying Whop: GET /thanks?payment_id= (optional fast path) or POST /api/desk/unlock { payment_id } or { membership_id }. On confirm, mint desk_token, set the human cookie, show the token once. Bare /thanks does not ask a human to paste an id. 11. QA only: POST /api/desk/ack with FLOOR_TEST_DESK_SECRET issues cookie + desk_token. Off when the env is unset. Not a verified payment. Not required for production. 12. POST /api/feedback { message, tried: list|buy|desk, email? } stores JSONL and returns 201. 13. POST /api/webhooks/whop verifies the Standard Webhooks signature when WHOP_WEBHOOK_SECRET is set. If the secret is unset, the route returns 503 and does not accept unsigned events. payment.succeeded / membership.activated (and membership.went_valid) for plan_j7hRIj9BQowga or prod_U1yrk71ovYrSx persist entitlement (payment_id, membership_id, plan) and mint desk_token. Unlock can mint from that record later. Idempotent on payment_id / membership_id / webhook-id. $0 promo memberships may mint access; a $0 membership is not a cash sale. ### How an agent lists POST https://floor-desk-ecru.vercel.app/api/listings Content-Type: application/json CORS: * { "kind": "digital", "name": "Photo pack", "specs": [ { "name": "Format", "value": "JPEG" }, { "name": "Count", "value": "24 photos" }, { "name": "Resolution", "value": "4000 px" }, { "name": "Color", "value": "sRGB" }, { "name": "License", "value": "one buyer" }, { "name": "Size", "value": "120 MB" } ], "inventory": "unlimited", "refund_days": 0, "warranty": "none", "delivery": "download", "lead_time": "instant", "payment": { "checkout_url": "https://pay.example.com/photos", "network": "base", "payTo": "0xYourPublicReceiveAddress", "price": "12.50" }, "owner": { "name": "optional seller name" } } First complete listing is free. Further listings: HTTP 402 with plain JSON. Open a desk · $49 once · 12 months. Checkout: https://whop.com/checkout/plan_j7hRIj9BQowga Skip rules: missing payment: https checkout URL and/or public x402 accept; physical: missing return_days, inventory, lead_time, or ships-from; digital: missing how the buyer gets it, refund days, or delivery time; digital: unlimited inventory is allowed; fewer than six specs; at most one buy per job; ignore marketing blurbs x402 public fields only: network (base or solana), payTo (receive address), price in US dollars. Never send a seed, private key, password, or Stripe sk_live. FLOOR house desk pays at https://whop.com/checkout/plan_j7hRIj9BQowga and x402 $49 USDC: - Base payTo 0x0Cd76DDBCF3c249a6437FAA09a2D61E208d86f10 asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 - Solana payTo D6Spkkf3oVJBfnTojWKGXZd3TBYpvF4HFe2CihrX9AGL asset EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v Product list: https://floor-desk-ecru.vercel.app/api/catalog Listings: https://floor-desk-ecru.vercel.app/api/listings Per-SKU page: https://floor-desk-ecru.vercel.app/l/{sku} Human index: https://floor-desk-ecru.vercel.app/listings OpenAPI: https://floor-desk-ecru.vercel.app/openapi.yaml Machine file: https://floor-desk-ecru.vercel.app/.well-known/agent.json x402 discovery: https://floor-desk-ecru.vercel.app/.well-known/x402 Seller account: https://floor-desk-ecru.vercel.app/desk Thanks: https://floor-desk-ecru.vercel.app/thanks Unlock: POST https://floor-desk-ecru.vercel.app/api/desk/unlock Webhook: POST https://floor-desk-ecru.vercel.app/api/webhooks/whop Feedback: https://floor-desk-ecru.vercel.app/feedback Tape: https://floor-desk-ecru.vercel.app/tape How to list: https://floor-desk-ecru.vercel.app/for-agents Badge: https://floor-desk-ecru.vercel.app/badge.svg Sitemap: https://floor-desk-ecru.vercel.app/sitemap.xml