Sean-Claude Van Damme's General Store • Oak City
The Trade Counter
Try it now, no account
Why a marketplace would
- Your customer gets a receipt that is not your word or ours. Every item mints an ed25519-signed certificate that verifies against a published key, offline, forever. A marketplace reselling opinions has to be trusted; one reselling checkable artifacts does not.
- No x402 in your customer's path, and none required of you. One signed POST. No wallet, no facilitator, no chain, no gas. You already know how to sign a webhook; that is the whole integration.
- The prices are a rule, not a negotiation. Trade price is retail plus a published uplift, divided by one minus your share, rounded up to the cent. Printed per item at /api/trade/contract. What you charge above it is your business.
- Delivery first, always. The goods are produced before anything is booked. A failed delivery leaves no line on your statement, so you never owe for something your customer did not get.
- You can be integrated before you have talked to anyone. A sandbox account with a published secret, a check desk that names which of the four signature checks failed, and a catalog feed with every item's copy, specimen and price at your share. Write to the keeper already working.
- Everything you would want to audit is already public. Your account's terms, the shelf you may order from, your receivable, the refusal codes by name, the reference signer, and every correction this store has ever had to make.
How it works
- The sandbox, first. Before any conversation, sign against the sandbox account with the secret printed on this page. Real signatures, real goods, marked test, booked nowhere. POST /api/trade/sandbox/check tells you which of the four checks your signer fails and why, without delivering anything. Check it yourself: The sandbox's secret, dialect and daily cap are on its account row at /api/trade/contract; its deliveries appear on /api/trade/ledger as test, never billed.
- The account. The keeper opens an account by hand: your platform, your signing dialect, the items you may order, a daily cap, a credit ceiling. You issue us one signing secret (and a provider key if your scheme sends one). We hold them as Worker secrets; nothing of ours is ever asked of you. Check it yourself: Your account's row — items, share, cap, ceiling, mode — is printed at /api/trade/contract the moment it exists, and its receivable is on /api/trade/ledger.
- The sale, on your side. Your customer buys the item from you at your price, in your currency, on your terms. We are not in that transaction and never see it. Check it yourself: Nothing to check with us — which is the point. Our trade price per item is public; what you charge above it is yours.
- The instruction. Your backend POSTs one JSON body to /api/trade/{account}/{item_id}, signed HMAC-SHA256 over timestamp, nonce and the exact bytes of the body. We check the signature, the five-minute window, and that the nonce has never been seen — on a store that answers the same from every edge. Check it yourself: The reference signer is published in this repository (src/lib/trade-auth.ts, signTradeRequest); sign a body with it and compare bytes with your own before any account is live.
- The delivery. The goods are made exactly as the front door makes them — the probe runs, the record is written, the certificate is minted — and come back in one JSON object inside thirty seconds. A delivery that fails books nothing: no statement line, no receivable. Check it yourself: The certificate says settled_via: trade_account, names your account and the trade price, and binds the sha256 of your signed instruction. It carries no chain fields, because no chain was involved, and it verifies free forever at /api/verify/{cert_id}.
- The statement. Each delivery on a live account adds one line to your statement: item, trade price, your share, our net. Outstanding net is the receivable, published per account. You pay on your cadence; the keeper records each payout by hand and the two sides are reconciled against each other. Check it yourself: /api/trade/ledger prints every account's delivered count, billed and outstanding figures, with the truncation flag any bounded read here carries. Your own rows, both sides, are yours to read at GET /api/trade/{account}/statement, signed like any order.
The shelf at the counter
| Item | Retail | Trade price | Store nets | Fields |
|---|---|---|---|---|
| Certificate of Patronage | $20 | $25.27 | $24.00 | order_ref, agent_name, purpose |
| Context Anchor | $1 | $1.27 | $1.20 | summary, order_ref, agent_name, purpose |
| A Bitcoin Anchor | $1 | $1.27 | $1.20 | digest, label, order_ref, agent_name, purpose |
| The Calling Card | $0.99 | $1.26 | $1.19 | url, order_ref, agent_name, purpose |
| The Shop Window | $3 | $3.79 | $3.60 | url, order_ref, agent_name, purpose |
| The Once-Over | $5 | $6.32 | $6.00 | url, order_ref, agent_name, purpose |
| The Refresh | $1 | $1.27 | $1.20 | url, order_ref, agent_name, purpose |
| The Good Buyer | $0.99 | $1.26 | $1.19 | url, max_usd, no_spend_controls, order_ref, agent_name, purpose |
| The Company an Address Keeps | $5 | $6.32 | $6.00 | address, order_ref, agent_name, purpose |
The call
Every refusal, by name
404 unknown_account— No trade account by that name. Check the path segment against your account row at /api/trade/contract.503 counter_closed— The counter cannot take orders right now: the account is not provisioned on this side, or the replay store is unreachable. Do not retry in a loop; the condition is ours to fix and the keeper is paged. Retry after a minute.413 body_too_large— The body is over one mebibyte. Send only the item's fields; the terms document lists them.401 missing_headers— A required signing header is absent. Send every header your dialect names, on every call.401 bad_provider_key— The provider key does not match the one on the account. Check which key you issued us; a rotated key needs the keeper's hand on this side.401 bad_timestamp— The timestamp is not an integer in the unit your dialect states. Unix seconds or milliseconds as your account row says, digits only.401 stale_timestamp— The timestamp is outside the window, past or future. Sign at send time with a synchronised clock; do not reuse a signed request.401 bad_nonce— The nonce is not the shape your dialect requires. Thirty-two hex characters, fresh per request.401 bad_signature— The HMAC does not verify against the secret in service or the previous one. Sign the exact bytes you send, in the order timestamp.nonce.body, and compare with the reference signer before assuming the secret is wrong.409 replayed— This nonce (or this exact instruction) has already been presented. Nothing was delivered on this call. If you are retrying a timed-out order, send order_ref and a FRESH nonce: the same order_ref returns the original delivery.404 not_at_the_counter— The item is not on your account, or not traded at the counter at all. Order from the items on your account row; ask the keeper to add one.400 bad_request— The body is not a JSON object, or the item's required field is missing or malformed. The terms document names each item's fields; the error names the one at fault.400 target_refused— The URL is not one we will probe: private, loopback, non-https, or our own hostname. Send a public https door. We do not sell audits of ourselves.429 credit_ceiling_reached— Your live account's unpaid net has reached its credit ceiling. Settle the statement; the ceiling is printed on your account row and the outstanding figure on /api/trade/ledger. The keeper can raise it.429 cap_reached— Your account has ordered its daily cap. The cap is the blast-radius bound on a leaked secret, not a rate limit; it resets at UTC midnight and the keeper can raise it.
What the receipt says
Accounts open
- The sandbox — test mode, partner share 5%, opened 2026-09-03, 9 items on the account.
- Hal — test mode, partner share 5%, opened 2026-09-03, 9 items on the account.
Questions people ask
What this is not
What you can do with this
Back to the front of the store. Agents: /llms.txt, /skill.md, or /menu.json.