{"openapi":"3.1.0","info":{"title":"mechawallet API","description":"A wallet your agent spends from, on any x402 resource. The balance is the budget. JSON API only.","version":"0.0.0"},"paths":{"/v1/sellers/{slug}/offers":{"get":{"tags":["discovery","discovery"],"summary":"Seller Offers","description":"A seller's machine-readable catalogue.\n\nFetchable from ANY origin, deliberately: this is the seller's public\nshop window — the same facts their profile page shows — and the\nstorefront embed reads it from the seller's own website with a plain\nbrowser fetch. Nothing here is credentialed and the answer is identical\nfor every caller, so `*` gives away exactly what a curl already gets.","operationId":"seller_offers_v1_sellers__slug__offers_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seller Offers V1 Sellers  Slug  Offers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sellers/{slug}/embed":{"get":{"tags":["discovery","discovery"],"summary":"Seller Embed","description":"A block the seller pastes onto their OWN website.\n\nThe catalogue living only here makes it a marketplace listing. What a\nseller actually needs is for *their* domain — the one an agent already has\na reason to visit — to say what it sells and how to buy it.\n\nReturns three things, because they answer different questions:\n\n  jsonld   schema.org ItemList. No JavaScript, so crawlers and agents that\n           fetch rather than render still read it.\n  html     the same JSON-LD plus a plain <ul> of links. Paste-and-done, and\n           it degrades to text.\n  well_known  a tiny file for {their-domain}/.well-known/mechawallet, so an\n           agent that probes the convention finds the catalogue without\n           parsing any page at all.","operationId":"seller_embed_v1_sellers__slug__embed_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/directory":{"get":{"tags":["discovery","discovery"],"summary":"Directory","description":"What an agent can buy right now: our live checkouts and reviewed\nthird-party x402 endpoints, with verified prices. Public, from any origin,\ncacheable; identical for every caller.","operationId":"directory_v1_directory_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"max_price_usd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Max Price Usd"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Directory V1 Directory Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/directory/providers":{"get":{"tags":["discovery","discovery"],"summary":"Directory Providers","description":"The catalogue by provider: who offers what, how many endpoints, from\nhow much, how many stand verified. Public and cacheable.","operationId":"directory_providers_v1_directory_providers_get","parameters":[{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Directory Providers V1 Directory Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/directory/totals":{"get":{"tags":["discovery"],"summary":"Directory Totals","description":"The directory's size, for the homepage's numbers: how many endpoints\nare listed, how many stand verified today, how many are checkouts of\nours. No auth; cheap; the same rows /explore counts.","operationId":"directory_totals_v1_directory_totals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Directory Totals V1 Directory Totals Get"}}}}}}},"/v1/inspect":{"post":{"tags":["discovery","discovery"],"summary":"Inspect Route","description":"Inspect a URL before paying it: 402 and price, our listing, the\norigin's llms.txt and OpenAPI. Any credential; nothing is paid.","operationId":"inspect_route_v1_inspect_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Inspect Route V1 Inspect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/directory/{entry_id}/reviews":{"get":{"tags":["discovery","discovery"],"summary":"Directory Reviews","description":"The reviews on one directory row, newest first. Public; every review\ncame from an account that paid the endpoint.","operationId":"directory_reviews_v1_directory__entry_id__reviews_get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Directory Reviews V1 Directory  Entry Id  Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["discovery","discovery"],"summary":"Review Directory Row","description":"Leave or replace this account's review. Needs a receipt: a paid call\nto that URL from one of the account's wallets. Any of the account's\ncredentials may post, a wallet key included.","operationId":"review_directory_row_v1_directory__entry_id__reviews_post","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Review Directory Row V1 Directory  Entry Id  Reviews Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/profiles/{slug}":{"get":{"tags":["profiles"],"summary":"Profile Json","description":"The account's public page as data: the active wallet per chain, the\nburned ones (unless the holder hid them), the live offers. Never a\nbalance, a limit or a purchase.","operationId":"profile_json_v1_profiles__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Profile Json V1 Profiles  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payers/{address}":{"get":{"tags":["profiles"],"summary":"Payer","description":"Is this payer one of our wallets, and who stands behind it? 404 for\nany address that is not ours, so the answer doubles as a check.","operationId":"payer_v1_payers__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Payer V1 Payers  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Liveness by default — instant, no DB. Render's checker polls this every\nfew seconds, and each default-mode ping used to cost a cross-region DB\nround-trip. Pass `?deep=1` for the DB-inclusive check (monitors, humans).\nNever raises — reports component state.","operationId":"health_health_get","parameters":[{"name":"deep","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Deep"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Health Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/facilitator":{"get":{"tags":["health"],"summary":"Health Facilitator","description":"Per-chain facilitator health: can our relayers still pay gas?\n\n`status` is ok, low or unknown over the configured chains, so an uptime\nmonitor can alert on anything but ok. Readings come from the float watch\nthread; `?fresh=1` reads the chains now. Public addresses and balances\nonly. Never raises.","operationId":"health_facilitator_health_facilitator_get","parameters":[{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Fresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Health Facilitator Health Facilitator Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts":{"post":{"tags":["checkouts"],"summary":"Create Checkout","operationId":"create_checkout_v1_checkouts_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["checkouts"],"summary":"List Checkouts","operationId":"list_checkouts_v1_checkouts_get","parameters":[{"name":"include_voided","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Voided"}},{"name":"include_funding","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Funding"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Checkouts V1 Checkouts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/escrow-checkouts":{"post":{"tags":["checkouts"],"summary":"Create Escrow Checkout","description":"Create an ESCROW checkout (docs/ESCROW_V1_1.md).\n\nEverything `POST /v1/checkouts` accepts, plus the terms of the hold — a\nnamed `escrow_preset` (instant | standard | shipping) or explicit windows,\nand optionally your own `escrow_arbiter_*`. It returns an `esc_` id served\nat `/e/{id}`.\n\nWhat changes for the buyer: their money is held by an on-chain escrow\ninstead of landing on the seller's wallet, it releases automatically after\nthe settle window unless they pause it, and only two outcomes are ever\npossible — the seller is paid, or the buyer is refunded. What changes for\nthe seller: nothing to sign, and the protocol fee is 1% + $0.02, which\nREPLACES the standard 0.5% + $0.01 rather than adding to it.\n\nDeliberately the SAME handler as a plain create, so the two products can\nnever drift on validation, idempotency, platform fees or auth.","operationId":"create_escrow_checkout_v1_escrow_checkouts_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EscrowCheckoutCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/wallets":{"get":{"tags":["checkouts"],"summary":"Get Payout Wallets","description":"The account's standing payout wallets, plus what each is carrying.\n\n`open_checkouts` is the count still frozen onto that address. A seller\nabout to change a wallet needs it, because those checkouts keep paying the\nold one — the safe behaviour, and the surprising one.","operationId":"get_payout_wallets_v1_account_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Payout Wallets V1 Account Wallets Get"}}}}}},"put":{"tags":["checkouts"],"summary":"Set Payout Wallets","description":"Set where this account gets paid, per chain.\n\nAddresses only — this endpoint has no field for a private key and the\naccount has nowhere to put one (AGENTS.md rule 2). Generating a wallet\nhappens entirely in the seller's browser; all that ever arrives here is the\npublic address.\n\nExisting checkouts are NOT re-pointed. Each one froze its addresses at\ncreate, so changing this affects only what you make next. That is the whole\nreason these are stored as defaults rather than resolved at settle time.","operationId":"set_payout_wallets_v1_account_wallets_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutWalletsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Payout Wallets V1 Account Wallets Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/wallets/preview":{"post":{"tags":["checkouts"],"summary":"Preview Payout Wallets","description":"What a PUT would do, without doing it.\n\nMoney destinations should not change on a single unconfirmed click, and a\nconfirmation that cannot say what is about to happen is just a speed bump.","operationId":"preview_payout_wallets_v1_account_wallets_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutWalletsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Payout Wallets V1 Account Wallets Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/wallets/history":{"get":{"tags":["checkouts"],"summary":"Payout Wallet History","description":"Every change to this account's payout wallets, newest first.","operationId":"payout_wallet_history_v1_account_wallets_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Payout Wallet History V1 Account Wallets History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/events":{"get":{"tags":["checkouts"],"summary":"Account Events","description":"This account's activity log, newest first — the general answer to\n\"what happened on my account?\", not just the payout-wallet slice.\n\nOwner-scoped by construction: the query is bound to the authenticated\nprovider, so there is no id to guess and nothing cross-tenant to leak.\n`action` is a prefix filter (\"checkout.\" selects the whole domain);\n`before` is an event id or ISO timestamp cursor for paging.\n\nThe rows deliberately EXCLUDE `client_ip_hash`/`user_agent_hash`: those\nexist for operator-side incident work (SQL), and even hashed request\nfingerprints are not something the API should hand back out.","operationId":"account_events_v1_account_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Account Events V1 Account Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/platform":{"get":{"tags":["checkouts"],"summary":"Get Platform","description":"The account's B2B2X platform settings: the mode, and the standing fee.\n\n`platform_account` is the separation the rest of the API branches on —\nwith it on, creates default to `inherit_account_payouts=false` (the\naccount's wallets never leak onto a sub-seller's checkout) and the\nstanding fee fills in on those creates. `max_bps` is the product cap,\nreturned so a UI can say it before the API refuses it.","operationId":"get_platform_v1_account_platform_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Platform V1 Account Platform Get"}}}}}},"put":{"tags":["checkouts"],"summary":"Set Platform","description":"Become (or stop being) a platform, and state the standing fee.\n\nOne request does the whole B2B2X setup: `{\"platform_account\": true,\n\"platform_fee_bps\": 200, \"platform_fee_to\": \"…\"}`. The fee is basis\npoints (0–2000) taken FROM the sub-seller's price — the buyer's total\nnever changes — plus the wallet that receives the cut; both or neither,\n0 clears it, and it requires the mode. Disabling the mode clears the fee.\n\nLike payout wallets these are DEFAULTS COPIED AT CREATE: existing\ncheckouts keep the fee they froze, and every filled-in value still passes\nthe same per-checkout validation as an explicitly sent one — a standing\nfee can never make an unsettleable checkout that an explicit fee couldn't.","operationId":"set_platform_v1_account_platform_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Platform V1 Account Platform Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/escrow":{"get":{"tags":["checkouts"],"summary":"Get Escrow Settings","description":"This account's standing escrow settings, and what they mean.","operationId":"get_escrow_settings_v1_account_escrow_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Escrow Settings V1 Account Escrow Get"}}}}}},"put":{"tags":["checkouts"],"summary":"Set Escrow Settings","description":"Set this account's standing escrow settings.\n\nLike payout wallets and the platform fee, these are DEFAULTS COPIED AT\nCREATE, never a pointer followed later: checkouts that already exist keep\nthe terms they froze, because those terms are inside signatures buyers have\nalready given.\n\nNaming your own arbiter is the B2B2X move — it is what makes you, not us,\nthe one who decides your marketplace's disputes.","operationId":"set_escrow_settings_v1_account_escrow_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EscrowSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Escrow Settings V1 Account Escrow Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/escrow/readiness":{"get":{"tags":["checkouts"],"summary":"Escrow Readiness","description":"Can this account's arbiter rule today? The check-balance button.\n\nPer configured chain: gas balance and how many rulings it affords on\nEVM (a ruling is a signed transaction; no ETH means no ruling no matter\nwho holds the key), and the plain statement that Solana rulings ride\nour relayer's gas. `readiness: null` means no arbiter is named --\nmechawallet adjudicates, nothing to fund. Briefly cached; a balance\nsays nothing about custody, and the response says so too.","operationId":"escrow_readiness_v1_account_escrow_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Escrow Readiness V1 Account Escrow Readiness Get"}}}}}}},"/v1/account/embed":{"get":{"tags":["checkouts"],"summary":"Get Embed Settings","description":"Which sites may put this account's checkouts in a frame.","operationId":"get_embed_settings_v1_account_embed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Embed Settings V1 Account Embed Get"}}}}}},"put":{"tags":["checkouts"],"summary":"Set Embed Settings","description":"Name the sites allowed to embed this account's checkouts.\n\nSend the WHOLE list — it replaces what is there, so removing a site is\nsending the list without it. An empty list means nobody, which is where\nevery account starts.\n\nFull scope, like the payout wallets, and for the same reason: whoever\ncontrols this controls where a page carrying a signing button may appear.","operationId":"set_embed_settings_v1_account_embed_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Embed Settings V1 Account Embed Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/check":{"get":{"tags":["checkouts"],"summary":"Embed Check","description":"Why is my embed blank? — answered by machine, for embed.js.\n\nThe frame-security default fails CLOSED and SILENT: an unlisted origin gets\na refused frame, which a browser renders as nothing at all. Correct, and a\nterrible developer experience — \"blank box\" has three unrelated causes\n(wrong id, unlisted origin, no in-page pay) and nothing on screen says\nwhich. embed.js calls this when a mounted frame never says mw:ready, and\nturns the answer into a console message with the exact fix, plus a buy link\nwhere the frame cannot work at all.\n\nPublic and unauthenticated, with open CORS — it must be readable from the\nseller's own site, which is exactly the origin our locked-down global CORS\npolicy excludes. Safe to open because it answers only what trying it would\nreveal anyway: whether a public checkout exists, whether THIS origin may\nframe it (testable by framing it), and whether the page carries the pay\nscript (visible in its HTML).","operationId":"embed_check_embed_check_get","parameters":[{"name":"checkout_id","in":"query","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"origin","in":"query","required":true,"schema":{"type":"string","title":"Origin"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Embed Check Embed Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/platform/quote":{"get":{"tags":["checkouts"],"summary":"Platform Quote","description":"What one B2B2X sale pays everyone — BEFORE any checkout exists.\n\nA platform operator pricing their cut needs the split, and the split has\ntwo rules people reliably guess wrong until a number shows them:\n\n  * the platform cut comes OUT of the seller's price (floored, in the\n    seller's favor), so seller_receives + platform_cut == price exactly;\n  * the protocol fee is charged ON TOP, to the buyer — it never reduces\n    the operator's cut or the seller's take.\n\nPublic and unauthenticated: everything here is derivable from the fee\npolicy every 402 already prints, and an operator should be able to price\na platform before they have an account. Computed by the SAME modules\nsettlement uses (`compute_fee` + `split_platform_fee`), so this can\nnever drift from what a real payment pays — it is a preview of\narithmetic, not a promise of terms.","operationId":"platform_quote_v1_platform_quote_get","parameters":[{"name":"price_usd","in":"query","required":true,"schema":{"type":"string","title":"Price Usd"}},{"name":"platform_fee_bps","in":"query","required":true,"schema":{"type":"integer","title":"Platform Fee Bps"}},{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Platform Quote V1 Platform Quote Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/receipts/{payment_id}/fulfilled":{"post":{"tags":["checkouts"],"summary":"Mark Fulfilled","description":"Close out a webhook sale: say whether the buyer actually got it.\n\nWebhook fulfilment happens off-platform, so we cannot observe it. Before\nthis existed we recorded \"delivered\" at the moment we notified the seller,\nwhich meant the buyer's receipt asserted something nobody had checked, and\nevery delivery metric counted our own outbound HTTP request as a delivery.\n\nNow the sale sits at `pending` until the seller says otherwise. The buyer\nsees that on their receipt, which is a true statement — paid, not yet\nfulfilled — rather than a comfortable false one.","operationId":"mark_fulfilled_v1_receipts__payment_id__fulfilled_post","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FulfilmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark Fulfilled V1 Receipts  Payment Id  Fulfilled Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/receipts/awaiting-fulfilment":{"get":{"tags":["checkouts"],"summary":"Awaiting Fulfilment","description":"Sales this seller has been paid for and not yet closed out.\n\nThe work queue webhook mode implies. Without it a seller has to remember\nwhich notifications they acted on, and a buyer who was forgotten has no\nway to be noticed.\n\nTest and live are a switch, never a mix: rehearsal purchases share the\ncheckout id now, and a simulated webhook purchase must not sit in the\nREAL work queue — but a seller rehearsing their fulfilment flow still\nneeds to see it, so `?test_mode=true` shows the rehearsal queue.","operationId":"awaiting_fulfilment_v1_receipts_awaiting_fulfilment_get","parameters":[{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Awaiting Fulfilment V1 Receipts Awaiting Fulfilment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/usage":{"get":{"tags":["checkouts"],"summary":"Package Usage","description":"What a BUYER has used of the package they bought, using only their key.\n\nA buyer has no account here — the package key is the whole identity, which\nis the point of the design. That also means they had no way to answer\n\"how many calls have I actually used, and did that failed one cost me?\"\nexcept by spending another call and reading the counter. A quota you can\nonly inspect by consuming it is a quota you have to take on trust.\n\nScoped to the key's own payment: it shows that buyer's calls, never the\nseller's other customers.","operationId":"package_usage_c__checkout_id__usage_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Package Usage C  Checkout Id  Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/receipts/{payment_id}/usage":{"get":{"tags":["checkouts"],"summary":"Receipt Usage","description":"The same log, for the seller who sold it.\n\nAnswers what the overwritten summary column could not: which call failed,\nwhen, and whether the buyer was charged for it.","operationId":"receipt_usage_v1_receipts__payment_id__usage_get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Receipt Usage V1 Receipts  Payment Id  Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/receipts/export":{"get":{"tags":["checkouts"],"summary":"Export Receipts","description":"Every settled payment, as a file.\n\nExists because \"what did I earn and where did it go\" is a question asked by\nan accountant, not by an API client, and the answer has to leave the\nproduct. `pay_to` is a column on purpose: it is the only record of which\nwallet actually received each payment, and after a wallet change it is the\nonly way to reconcile two destinations in one period.\n\nSame rule as analytics: test and live are a SWITCH, never a mix. The\naccountant's default is real money; `?test_mode=true` exports rehearsals\n— rows that share checkout ids with real sales but moved nothing.\n\nNo pagination. A partial export that looks complete is worse than no\nexport — it would be filed, and the missing rows found at year end.","operationId":"export_receipts_v1_receipts_export_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"csv","title":"Format"}},{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/receipts":{"get":{"tags":["checkouts"],"summary":"List Receipts","description":"Settled payments, newest first — the seller's ledger.\n\nMCP has had `list_receipts` since it shipped; REST and the CLI never did,\nso the surface an agent uses could answer \"who paid me\" and the surface a\nhuman uses could not. Analytics gives totals; this gives the rows behind\nthem, which is what you need when a specific buyer asks about a specific\ncharge.\n\n`checkout_id` narrows to one product's sales. A platform holding many\ncheckouts for many sub-sellers (gitbuyer: one checkout per repo) answers\n\"what did THIS seller earn\" with this filter instead of paging the whole\naccount ledger — the account is still the boundary; the filter never\nreaches another seller's rows.\n\nTest and live are a switch, never a mix — rehearsal payments share\ncheckout ids with real sales now, and a ledger that interleaved them\nwould answer \"who paid me\" with people who did not.","operationId":"list_receipts_v1_receipts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}},{"name":"checkout_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Id"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Platform"}},{"name":"sold_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sold By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Receipts V1 Receipts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics":{"get":{"tags":["checkouts"],"summary":"Seller Analytics","description":"What you earned, from how many buyers, and what failed to deliver.","operationId":"seller_analytics_v1_analytics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seller Analytics V1 Analytics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/report":{"get":{"tags":["checkouts"],"summary":"Seller Analytics Report","description":"Trends, per-checkout breakdown and the payment ledger over one window.\n\nSeparate from `/v1/analytics` rather than replacing it: that endpoint's\nshape is consumed by `mw stats` and by the `get_analytics` MCP tool, and\nquietly re-cutting the keys under them is how a caller starts reading a\nfiltered figure as a total.\n\nEvery filter is optional and they compose. `days` is kept as the shorthand\nthe other endpoint already uses, so the two agree about what \"last 30 days\"\nmeans; an explicit `since` wins if both are given.","operationId":"seller_analytics_report_v1_analytics_report_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"checkout_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Id"}},{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"}},{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}},{"name":"interval","in":"query","required":false,"schema":{"type":"string","default":"day","title":"Interval"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seller Analytics Report V1 Analytics Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/test":{"get":{"tags":["checkouts"],"summary":"Checkout Test Page","description":"The rehearsal face: same product, same origin, simulated settlement —\nforever. This path can never be armed, which is what makes it the URL a\nscript may safely keep.","operationId":"checkout_test_page_c__checkout_id__test_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}":{"get":{"tags":["checkouts"],"summary":"Checkout Page","operationId":"checkout_page_c__checkout_id__get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/test":{"get":{"tags":["checkouts"],"summary":"Escrow Checkout Test Page","description":"The escrow rehearsal face: the whole held lifecycle, simulated, forever.\nThis path can never be armed.","operationId":"escrow_checkout_test_page_e__checkout_id__test_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}":{"get":{"tags":["checkouts"],"summary":"Escrow Checkout Page","operationId":"escrow_checkout_page_e__checkout_id__get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/test/pay":{"post":{"tags":["checkouts"],"summary":"Pay Escrow Checkout Test","operationId":"pay_escrow_checkout_test_e__checkout_id__test_pay_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/pay":{"post":{"tags":["checkouts"],"summary":"Pay Escrow Checkout","operationId":"pay_escrow_checkout_e__checkout_id__pay_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/test/pay":{"post":{"tags":["checkouts"],"summary":"Pay Checkout Test","operationId":"pay_checkout_test_c__checkout_id__test_pay_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/pay":{"post":{"tags":["checkouts"],"summary":"Pay Checkout","operationId":"pay_checkout_c__checkout_id__pay_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/rehearsal-checkout":{"get":{"tags":["checkouts"],"summary":"Rehearsal Checkout","description":"A checkout whose /test face any agent can pay for free, forever.\n\nThe spending rail's onboarding ends with \"ask your agent to buy this\",\nand the thing to buy must exist for an account that sells nothing. It is\nowned by the demo seller, never expires, and is reused by everyone: the\ntest face never consumes a sale, so one row serves every rehearsal.","operationId":"rehearsal_checkout_v1_rehearsal_checkout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rehearsal Checkout V1 Rehearsal Checkout Get"}}}}}}},"/v1/webhooks":{"get":{"tags":["checkouts"],"summary":"List Webhooks","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Webhooks V1 Webhooks Get"}}}}}},"post":{"tags":["checkouts"],"summary":"Create Webhook","operationId":"create_webhook_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Webhook V1 Webhooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/verification-key":{"get":{"tags":["checkouts"],"summary":"Webhook Verification Key","description":"The PUBLIC key that verifies every webhook delivery — the keyless path.\n\nA receiver that checks `X-Mechawallet-Ed25519` against this key needs no\nconfigured secret at all: fetch this once at boot (it is public, cache it,\npin it if you like), verify `\"{t}.{raw_body}\"` on each delivery, reject a\nstale `t`. Deploying a service that consumes mechawallet events then\nrequires exactly one credential — the API key — and nothing else.\n\nThe key can rotate with the deployment's own secret rotation, so refetch\non verification failure before treating a delivery as forged.","operationId":"webhook_verification_key_v1_webhooks_verification_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Webhook Verification Key V1 Webhooks Verification Key Get"}}}}}}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["checkouts"],"summary":"Delete Webhook","description":"Remove a receiver. Deliveries stop immediately; the sales themselves\nare untouched (receipts are the ledger — the webhook is only the bell).\n\nPending/failed delivery rows for the endpoint go with it: they reference\nthe endpoint and exist to drive its retries, which there is no longer\nanything to retry against.","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/r/by-tx/{tx_hash}":{"get":{"tags":["checkouts"],"summary":"Receipt By Tx","description":"Recover a lost receipt from its transaction hash. View-only.\n\nThe buyer's wallet is throwaway by design, so the durable trail back\nto a purchase is: exchange withdrawal history (names the wallet) ->\nblock explorer (names the tx) -> this redirect (names the receipt).\nEvery link is permanent and the buyer keeps nothing.\n\nSafe to expose because the hash is already public on-chain along with\npayer, payee and amount: resolving it to the receipt VIEW reveals\nnothing a chain observer could not infer. The goods stay behind the\nreceipt id itself, which this endpoint never mints.","operationId":"receipt_by_tx_r_by_tx__tx_hash__get","parameters":[{"name":"tx_hash","in":"path","required":true,"schema":{"type":"string","title":"Tx Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/r/{payment_id}/download":{"get":{"tags":["checkouts"],"summary":"Receipt Download","description":"One receipt as a file the buyer or seller can keep.\n\nPublic, like the receipt page itself — the id is the capability, and a\nbuyer with no account has to be able to keep proof of what they paid for.\n\nSelf-contained HTML rather than a PDF: it prints to PDF from any browser,\nneeds no dependency in the image, and stays readable if it is opened in\nten years. Nothing is fetched at open time — a receipt that renders blank\noffline is not a record.","operationId":"receipt_download_r__payment_id__download_get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/r/{payment_id}":{"get":{"tags":["checkouts"],"summary":"Receipt","operationId":"receipt_r__payment_id__get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}":{"delete":{"tags":["checkouts"],"summary":"Void Checkout","description":"Retire a checkout so nothing further can be bought through it.\n\nDELETE is the verb a caller reaches for, but the row survives: receipts\npoint at it and a buyer keeps their proof of purchase. See\n`svc.void_checkout` for why that is not negotiable.","operationId":"void_checkout_v1_checkouts__checkout_id__delete","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Void Checkout V1 Checkouts  Checkout Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["checkouts"],"summary":"Patch Checkout Offer","description":"Update offer-card fields on an existing checkout (same object, no catalogue).","operationId":"patch_checkout_offer_v1_checkouts__checkout_id__patch","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOfferPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Checkout Offer V1 Checkouts  Checkout Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}/restore":{"post":{"tags":["checkouts"],"summary":"Restore Checkout","description":"Un-retire a checkout. The row was never destroyed, so this is a status\nchange and nothing more.","operationId":"restore_checkout_v1_checkouts__checkout_id__restore_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Checkout V1 Checkouts  Checkout Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}/go-live":{"post":{"tags":["checkouts"],"summary":"Go Live","description":"Arm this checkout for real money — in place, same id, same URL.\n\nThe rehearsal does not move: it is the same checkout's /test face, which\ncan never be armed. That is the answer to the old fear about links in\nscripts and READMEs — the address you rehearse at and the address that\ntakes money now differ by a path segment that says which is which,\ninstead of by two opaque ids.\n\nIdempotent: arming an armed checkout returns it unchanged. (On a LEGACY\ntwin id this resolves to the pair's live half, exactly as before.)","operationId":"go_live_v1_checkouts__checkout_id__go_live_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Go Live V1 Checkouts  Checkout Id  Go Live Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/test/prepare":{"post":{"tags":["checkouts"],"summary":"Prepare Payment Test","operationId":"prepare_payment_test_c__checkout_id__test_prepare_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prepare Payment Test C  Checkout Id  Test Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/{checkout_id}/prepare":{"post":{"tags":["checkouts"],"summary":"Prepare Payment","operationId":"prepare_payment_c__checkout_id__prepare_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prepare Payment C  Checkout Id  Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/test/prepare":{"post":{"tags":["checkouts"],"summary":"Prepare Escrow Payment Test","operationId":"prepare_escrow_payment_test_e__checkout_id__test_prepare_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prepare Escrow Payment Test E  Checkout Id  Test Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/prepare":{"post":{"tags":["checkouts"],"summary":"Prepare Escrow Payment","operationId":"prepare_escrow_payment_e__checkout_id__prepare_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prepare Escrow Payment E  Checkout Id  Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}/payouts":{"post":{"tags":["checkouts"],"summary":"Add Checkout Payout","description":"Add a payout rail to an existing checkout — same id, same URL.\n\nThe one config change that must never rotate a checkout: the price is\nuntouched, existing addresses are untouched, only the set of payable\nchains widens. Additive only; a family that already has an address is a\n409. The test face is derived from this same row, so the rehearsal gains\nthe rail with no extra step.","operationId":"add_checkout_payout_v1_checkouts__checkout_id__payouts_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutPayoutAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Checkout Payout V1 Checkouts  Checkout Id  Payouts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}/extend":{"post":{"tags":["checkouts"],"summary":"Extend Checkout","description":"Move or clear a checkout's deadline in place — same id, same URL.\n\nAn expired checkout revives here: expiry is derived from `expires_at` on\nread, so clearing the deadline un-derives it and the link a seller\nalready shared starts selling again, byte-identical. Void and paid\nrefuse — their state is not a deadline problem.","operationId":"extend_checkout_v1_checkouts__checkout_id__extend_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutExtend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Extend Checkout V1 Checkouts  Checkout Id  Extend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/escrows":{"get":{"summary":"List Escrows","description":"Your escrows. For a platform, this is the dispute queue.\n\nScoped to checkouts this account owns, which for a platform account means\nthe ones it created for its sub-sellers — the same boundary every other\nlisting here uses.\n\nDefault (no `status`) returns the LIVE ones — held and on_hold — because a\nqueue of finished escrows is a report, not a workqueue.","operationId":"list_escrows_v1_escrows_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"held | on_hold | released | refunded. Omit for all live ones.","title":"Status"},"description":"held | on_hold | released | refunded. Omit for all live ones."},{"name":"escalated","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"only escrows whose buyer asked for a refund","title":"Escalated"},"description":"only escrows whose buyer asked for a refund"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Escrows V1 Escrows Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/escrows/{payment_id}":{"get":{"summary":"Get Escrow","description":"One escrow in full, including what may be done to it right now.","operationId":"get_escrow_v1_escrows__payment_id__get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Escrow V1 Escrows  Payment Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/escrows/{payment_id}/resolve":{"post":{"summary":"Resolve Escrow","description":"Prepare the arbiter's decision as an unsigned transaction.\n\nWe do NOT submit this. The escrow authorises by `msg.sender`, so the\ntransaction has to come from the arbiter's own wallet — which is exactly\nwhat makes \"the platform arbitrates its own marketplace\" true rather than a\npromise. Sign the returned `transaction` with the arbiter key named in\n`from_` and broadcast it.\n\nThe only two values `to_seller` can express are the two exits the buyer's\ndeposit already committed to. There is no third option, here or on-chain.","operationId":"resolve_escrow_v1_escrows__payment_id__resolve_post","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}},{"name":"to_seller","in":"query","required":true,"schema":{"type":"boolean","description":"true releases to the seller, false refunds the buyer","title":"To Seller"},"description":"true releases to the seller, false refunds the buyer"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resolve Escrow V1 Escrows  Payment Id  Resolve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/actions/{action}":{"post":{"summary":"Prepare Buyer Action","description":"Prepare a buyer's (or seller's) escrow action as an unsigned transaction.\n\nDeliberately ACCOUNTLESS. A buyer paid from a wallet and never made an\naccount; requiring one to pause their own escrow would make the protection\nunreachable for exactly the people it is for. There is nothing to\nauthenticate here anyway: this endpoint reveals nothing secret and produces\na transaction that only the right wallet can successfully sign — the\ncontract, not us, decides who may act.","operationId":"prepare_buyer_action_e__checkout_id__actions__action__post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}},{"name":"payment_id","in":"query","required":true,"schema":{"type":"string","description":"the escrow payment to act on","title":"Payment Id"},"description":"the escrow payment to act on"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prepare Buyer Action E  Checkout Id  Actions  Action  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/escrows/{payment_id}/resolve/submit":{"post":{"summary":"Submit Resolution","description":"Broadcast a platform arbiter's SIGNED Solana ruling, on our gas.\n\nThe Solana half of `/resolve`: the platform signed the prepared transaction\nwith their own arbiter key, and hands it back here for the fee co-signature\nand broadcast. Their arbiter wallet never needs SOL — a marketplace should\nnot have to run a funded hot wallet on a second chain just to judge its own\ndisputes. (Base needs no such endpoint: there the arbiter broadcasts the\nsigned transaction itself and pays sub-cent gas.)\n\n`to_seller` is required again here and checked against the transaction —\nstating the route twice means a mixed-up client fails loudly instead of\npaying the wrong party.","operationId":"submit_resolution_v1_escrows__payment_id__resolve_submit_post","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}},{"name":"to_seller","in":"query","required":true,"schema":{"type":"boolean","title":"To Seller"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedAction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Resolution V1 Escrows  Payment Id  Resolve Submit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/actions/{action}/submit":{"post":{"summary":"Submit Buyer Action","description":"Broadcast a buyer's (or seller's) SIGNED Solana action, on our gas.\n\nAccountless for the same reason the prepare endpoint is: the wallet is the\nauthority, and the verification inside refuses any transaction whose signer\nis not the recorded party — so this endpoint can pay fees only for the\npeople the escrow already belongs to.","operationId":"submit_buyer_action_e__checkout_id__actions__action__submit_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}},{"name":"payment_id","in":"query","required":true,"schema":{"type":"string","title":"Payment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedAction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Buyer Action E  Checkout Id  Actions  Action  Submit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/{checkout_id}/status":{"get":{"summary":"Escrow Status","description":"The buyer's own view of their escrow: where it is, what happens next, and\nwhat they can do about it. Accountless, for the same reason as above.","operationId":"escrow_status_e__checkout_id__status_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"payment_id","in":"query","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Escrow Status E  Checkout Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x/{checkout_id}/prepare":{"post":{"tags":["gate"],"summary":"Gate Prepare","description":"The typed data to sign, for this face.\n\nDelegates to the one implementation the /c/ and /e/ faces use: money\nhas a single code path in this service and gated content adds none.\nThe face matters only because the signed `resource` names it.","operationId":"gate_prepare_x__checkout_id__prepare_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x/{checkout_id}/pay":{"post":{"tags":["gate"],"summary":"Gate Pay","description":"Pay for this content, then receive it — with a grant attached.\n\nThe grant is what stops the SECOND page charging again: it rides back\nin the response so a browser can hand it to the parent page and an\nagent can present it as a header on its next fetch.","operationId":"gate_pay_x__checkout_id__pay_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/content/{checkout_id}":{"get":{"tags":["gate"],"summary":"Read Content","description":"The article as the SELLER wrote it — the read half of the mini CMS.\n\nWithout this, the dashboard could create an article and never show it\nback: the body is deliberately absent from every public surface (it is\nthe paid goods), so the one place it can be read is an authenticated\nendpoint scoped to its owner.\n\nReturns the FULL declaration on purpose. A PATCH to `content` replaces\nthe whole declaration, so an editor that fetched only the teaser and\nsent only the teaser back would silently wipe the author, the tags and\nthe canonical URL. Handing back everything makes read-modify-write the\nobvious implementation.","operationId":"read_content_v1_content__checkout_id__get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Content V1 Content  Checkout Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/content/{checkout_id}/grants":{"post":{"tags":["gate"],"summary":"Issue Grant","description":"Let a reader the SELLER has already authenticated read without paying.\n\nTHE CASE THIS EXISTS FOR. A publisher who already has subscribers should\nnot charge them twice, and until now there was no way to say so: the wall\nis rendered from the seller's page, but the article lives here, so a\nsubscriber could not be served by the seller at all. They had a paywall\ntheir own members hit.\n\nThe seller decides who is entitled -- we never see their user table. They\nmint a pass for that reader and hand it to their page (or to that\nreader's agent), and the gate opens with no payment and no checkout shown.\n\nThis is deliberately a SELLER credential doing it. The pass it returns is\na bearer token for free access to their own paid content, so the only\nparty who may create one is the party whose revenue it costs.","operationId":"issue_grant_v1_content__checkout_id__grants_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Issue Grant V1 Content  Checkout Id  Grants Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/grants":{"post":{"tags":["gate"],"summary":"Issue Site Grant","description":"A pass for everything this account gates — minted at LOGIN, not at\nrender.\n\nThe per-content endpoint makes you name an article, which is the wrong\nhook for the thing publishers actually need. A newspaper knows a reader\nis a subscriber when they SIGN IN, and at that moment there is no article\nyet; asking for one would force a pass to be minted per page, turning a\nsession into an API call per page view.\n\nSo: one call when the session starts, the pass cached beside it, and\nevery article that session renders carries it. A seller-scoped pass opens\neverything this account gates, which is what a subscription means.","operationId":"issue_site_grant_v1_grants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteGrantRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Issue Site Grant V1 Grants Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x/{checkout_id}/snippet":{"get":{"tags":["gate"],"summary":"Gate Snippet","description":"The block the seller pastes where the body used to be.\n\nPublic and unauthenticated because everything in it is public by\ndesign: the teaser, the price, the JSON-LD, and a URL that answers\n402. Handing it back from the API means the dashboard, the MCP tool\nand `curl` all produce the same snippet.","operationId":"gate_snippet_x__checkout_id__snippet_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gate Snippet X  Checkout Id  Snippet Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"get":{"tags":["keys"],"summary":"List Keys","operationId":"list_keys_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Keys V1 Keys Get"}}}}}},"post":{"tags":["keys"],"summary":"Create Key","operationId":"create_key_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Key V1 Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Revoke Key","operationId":"revoke_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkouts/{checkout_id}/reports":{"post":{"tags":["reports"],"summary":"Create Report","description":"File a problem against a checkout. No account, no session, one call.\n\nThis is the ONLY recourse a failed buyer has, so it is the endpoint least\nentitled to be fussy. It takes a category, optionally a receipt, optionally\na sentence — and it answers with what happens next, because a buyer who\ncannot see that anything happened will assume nothing did.","operationId":"create_report_v1_checkouts__checkout_id__reports_post","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Report V1 Checkouts  Checkout Id  Reports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["reports"],"summary":"List Checkout Reports","description":"The same queue, narrowed to one product — \"is this checkout the problem?\".\n\nEach row carries the `PackageDelivery` rows for the reported payment, so the\nclaim and our own record of the delivery arrive together. A seller should\nnever have to go and look up whether the call they are being told about\nactually failed.","operationId":"list_checkout_reports_v1_checkouts__checkout_id__reports_get","parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","title":"Checkout Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Checkout Reports V1 Checkouts  Checkout Id  Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports":{"get":{"tags":["reports"],"summary":"List Reports","description":"Every open problem across this seller's checkouts, newest first.\n\nThe queue. `open_count` is called out because a report that nobody looked at\nis the only state that is actually bad — the rest are answers.\n`?test_mode=true` switches to complaints about rehearsal payments.","operationId":"list_reports_v1_reports_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"test_mode","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Test Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Reports V1 Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{report_id}":{"patch":{"tags":["reports"],"summary":"Update Report","description":"Acknowledge, resolve or dismiss — with a note that stays on the record.\n\nThere is no DELETE beside this, on purpose. `void_checkout` already\nestablishes the rule for the buyer's side of a transaction: a receipt\nsurvives the seller retiring the product, because it is the buyer's proof\nand not the seller's to withdraw. A complaint is the same object seen from\nthe other end. Dismissing one is a position a seller takes in writing, which\nis worth more than deletion to a seller who is in the right and is the only\nthing that makes the queue trustworthy when they are not.","operationId":"update_report_v1_reports__report_id__patch","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Report V1 Reports  Report Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/tools":{"post":{"tags":["mcp"],"summary":"List Mcp Tools","description":"`tools/list` against the seller's server, as the buyer's call would see it.","operationId":"list_mcp_tools_v1_mcp_tools_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Mcp Tools V1 Mcp Tools Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/origin-keys":{"get":{"tags":["origin-keys"],"summary":"List Origin Keys","operationId":"list_origin_keys_v1_origin_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Origin Keys V1 Origin Keys Get"}}}}}},"post":{"tags":["origin-keys"],"summary":"Create Origin Key","description":"Store an upstream credential once, reference it from many checkouts.","operationId":"create_origin_key_v1_origin_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Origin Key V1 Origin Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/origin-keys/{secret_id}":{"patch":{"tags":["origin-keys"],"summary":"Rotate Origin Key","description":"Replace the value. Every checkout referencing this key uses the new one\nfrom its next forward — no per-checkout edit.","operationId":"rotate_origin_key_v1_origin_keys__secret_id__patch","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","title":"Secret Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginKeyRotate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Origin Key V1 Origin Keys  Secret Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["origin-keys"],"summary":"Revoke Origin Key","operationId":"revoke_origin_key_v1_origin_keys__secret_id__delete","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","title":"Secret Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Origin Key V1 Origin Keys  Secret Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"tags":["mcp"],"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/magic-link/request":{"post":{"tags":["auth"],"summary":"Request Magic Link","operationId":"request_magic_link_auth_magic_link_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Request Magic Link Auth Magic Link Request Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify":{"post":{"tags":["auth"],"summary":"Verify","operationId":"verify_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Auth Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/session/cookie":{"post":{"tags":["auth"],"summary":"Adopt Session Cookie","description":"Mint the session cookie for a caller who already holds a SESSION token.\n\nThe frontend authenticates with a bearer, so a seller can be signed in for\nweeks without this origin ever having set a cookie. `/oauth/authorize` is a\ntop-level navigation and can carry no header, so it reads the cookie and\nonly the cookie — meaning \"Connect to Claude\" failed for exactly the people\nwho were already signed in.\n\nNot a privilege escalation *for a session bearer*: that bearer IS the\nsession value, so this hands back a cookie for a session the caller already\nproved they hold.\n\nIt WAS one for an automation key, and this docstring previously said\notherwise. The endpoint depended on `current_provider`, which resolves an\nAPI key before either session form and discards its scope, so a `read_only`\nkey could trade itself for a cookie — and `current_auth` reads a cookie as\n`scope=\"full\"`. That turned the weakest credential the product mints into\nthe strongest in one request, and satisfied rather than bypassed every scope\ncheck on the endpoints downstream. `current_session_holder` refuses keys.","operationId":"adopt_session_cookie_auth_session_cookie_post","responses":{"204":{"description":"Successful Response"}}}},"/auth/wallet/challenge":{"post":{"tags":["auth"],"summary":"Wallet Challenge","description":"Agent-native bootstrap, step 1: get a single-use message to sign.","operationId":"wallet_challenge_auth_wallet_challenge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletChallengeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Wallet Challenge Auth Wallet Challenge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/wallet/verify":{"post":{"tags":["auth"],"summary":"Wallet Verify","description":"Agent-native bootstrap, step 2: trade the signed challenge for an account\n+ the FIRST automation key (shown once). The signing wallet is registered as\na verified default payout wallet. Re-signing later mints a fresh key — this\nis also key recovery for wallet-only accounts.","operationId":"wallet_verify_auth_wallet_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wallet Verify Auth Wallet Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"The signed-in provider's own profile — the whole record, not a stub.\n\n`/auth/me` IS the profile resource, so it returns everything PATCH can\nchange. Returning three fields meant a CLI had no way to show a profile\nbefore editing it. With `X-Mechawallet-Account` it is the organization's\nprofile, with the member's role.","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Me Auth Me Get"}}}}}},"patch":{"tags":["auth"],"summary":"Update Me","description":"Patch your own profile. Only provided fields change.\n\nEmpty string clears a text/URL field; omitted leaves it alone. `verified` is\nabsent by design — it's a manual review, never self-serve.","operationId":"update_me_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Me Auth Me Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me/avatar":{"post":{"tags":["auth"],"summary":"Upload Avatar","description":"Store a profile picture as bytes; it is served at /u/{slug}/avatar.\nA person's act, like the rest of the profile.","operationId":"upload_avatar_auth_me_avatar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Avatar Auth Me Avatar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Delete Avatar","operationId":"delete_avatar_auth_me_avatar_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Delete Avatar Auth Me Avatar Delete"}}}}}}},"/v1/orgs":{"get":{"tags":["organizations"],"summary":"My Orgs","operationId":"my_orgs_v1_orgs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Orgs V1 Orgs Get"}}}}}},"post":{"tags":["organizations"],"summary":"Create Org","description":"Found an organization. You own it; invite others after. Its handle\nnames its public page and is what `X-Mechawallet-Account` takes.","operationId":"create_org_v1_orgs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrg"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Org V1 Orgs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org}":{"get":{"tags":["organizations"],"summary":"Read Org","operationId":"read_org_v1_orgs__org__get","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Org V1 Orgs  Org  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org}/invitations":{"post":{"tags":["organizations"],"summary":"Invite","operationId":"invite_v1_orgs__org__invitations_post","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invite V1 Orgs  Org  Invitations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["organizations"],"summary":"Invitations","operationId":"invitations_v1_orgs__org__invitations_get","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invitations V1 Orgs  Org  Invitations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org}/invitations/{invitation_id}":{"delete":{"tags":["organizations"],"summary":"Withdraw","operationId":"withdraw_v1_orgs__org__invitations__invitation_id__delete","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw V1 Orgs  Org  Invitations  Invitation Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/accept":{"post":{"tags":["organizations"],"summary":"Accept","operationId":"accept_v1_orgs_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Accept"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Accept V1 Orgs Accept Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org}/members/{member_id}":{"patch":{"tags":["organizations"],"summary":"Set Role","operationId":"set_role_v1_orgs__org__members__member_id__patch","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRole"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Role V1 Orgs  Org  Members  Member Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Remove Member","operationId":"remove_member_v1_orgs__org__members__member_id__delete","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Member V1 Orgs  Org  Members  Member Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org}/transfer":{"post":{"tags":["organizations"],"summary":"Transfer","description":"Hand the organization to a member. You stay as a manager.","operationId":"transfer_v1_orgs__org__transfer_post","parameters":[{"name":"org","in":"path","required":true,"schema":{"type":"string","title":"Org"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transfer V1 Orgs  Org  Transfer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/claim":{"post":{"tags":["organizations"],"summary":"Claim Agent Account","description":"A person accepts the claim an agent sent them: they become the owner\nof the account the agent opened, and the not-storage line is recorded\nas read. Their own account is untouched.","operationId":"claim_agent_account_v1_orgs_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__orgs__ClaimBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Claim Agent Account V1 Orgs Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/threads":{"post":{"tags":["support"],"summary":"Open Thread","operationId":"open_thread_v1_support_threads_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenThread"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Open Thread V1 Support Threads Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["support"],"summary":"List Threads","operationId":"list_threads_v1_support_threads_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Threads V1 Support Threads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/threads/{thread}":{"get":{"tags":["support"],"summary":"Get Thread","operationId":"get_thread_v1_support_threads__thread__get","parameters":[{"name":"thread","in":"path","required":true,"schema":{"type":"string","title":"Thread"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Thread V1 Support Threads  Thread  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/threads/{thread}/messages":{"post":{"tags":["support"],"summary":"Write","operationId":"write_v1_support_threads__thread__messages_post","parameters":[{"name":"thread","in":"path","required":true,"schema":{"type":"string","title":"Thread"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reply"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Write V1 Support Threads  Thread  Messages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/threads/{thread}/close":{"post":{"tags":["support"],"summary":"Close Thread","operationId":"close_thread_v1_support_threads__thread__close_post","parameters":[{"name":"thread","in":"path","required":true,"schema":{"type":"string","title":"Thread"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close Thread V1 Support Threads  Thread  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"tags":["oauth"],"summary":"Protected Resource","operationId":"protected_resource__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["oauth"],"summary":"Protected Resource","operationId":"protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp":{"get":{"tags":["oauth"],"summary":"Authorization Server","operationId":"authorization_server__well_known_oauth_authorization_server_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["oauth"],"summary":"Authorization Server","operationId":"authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"tags":["oauth"],"summary":"Register","operationId":"register_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"tags":["oauth"],"summary":"Authorize","operationId":"authorize_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/consent":{"post":{"tags":["oauth"],"summary":"Consent","operationId":"consent_oauth_consent_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"tags":["oauth"],"summary":"Token","operationId":"token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/x402/base/supported":{"get":{"tags":["facilitator:base"],"summary":"Base Supported","operationId":"base_supported_x402_base_supported_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Base Supported X402 Base Supported Get"}}}}}}},"/x402/base/verify":{"post":{"tags":["facilitator:base"],"summary":"Base Verify","operationId":"base_verify_x402_base_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Base Verify X402 Base Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x402/base/settle":{"post":{"tags":["facilitator:base"],"summary":"Base Settle","operationId":"base_settle_x402_base_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Base Settle X402 Base Settle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/guarantees":{"get":{"tags":["guarantees"],"summary":"Guarantees Page","operationId":"guarantees_page_guarantees_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/x402/stellar/supported":{"get":{"tags":["facilitator:stellar"],"summary":"Stellar Supported","operationId":"stellar_supported_x402_stellar_supported_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stellar Supported X402 Stellar Supported Get"}}}}}}},"/x402/stellar/verify":{"post":{"tags":["facilitator:stellar"],"summary":"Stellar Verify","operationId":"stellar_verify_x402_stellar_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stellar Verify X402 Stellar Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x402/stellar/settle":{"post":{"tags":["facilitator:stellar"],"summary":"Stellar Settle","operationId":"stellar_settle_x402_stellar_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stellar Settle X402 Stellar Settle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x402/solana/supported":{"get":{"tags":["facilitator:solana"],"summary":"Solana Supported","operationId":"solana_supported_x402_solana_supported_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Solana Supported X402 Solana Supported Get"}}}}}}},"/x402/solana/verify":{"post":{"tags":["facilitator:solana"],"summary":"Solana Verify","operationId":"solana_verify_x402_solana_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Solana Verify X402 Solana Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/x402/solana/settle":{"post":{"tags":["facilitator:solana"],"summary":"Solana Settle","operationId":"solana_settle_x402_solana_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilitatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Solana Settle X402 Solana Settle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/health":{"get":{"tags":["spending"],"summary":"Health","description":"Is the rail able to work here? Public, no auth, never raises.\n\nThree things have to be true before a wallet can be created, and two of\nthem are deployment configuration nobody can see from a dashboard: the\nschema answers, the encryption key loads, and the generators import. Each\nis reported by name, so a failing Create can be diagnosed from outside\nwithout a credential or a log. Nothing here touches a secret or a wallet.","operationId":"health_v1_spending_wallets_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health V1 Spending Wallets Health Get"}}}}}}},"/v1/spending-wallets":{"get":{"tags":["spending"],"summary":"List Wallets","description":"The wallets and the branches, without touching the chain.\n\nNo balance here on purpose: reading it costs an RPC round trip per wallet,\nand this is the call a dashboard makes on every page load. The balance has\nits own endpoint and its own button. A wallet or branch key sees only\nwhat it is bound to.","operationId":"list_wallets_v1_spending_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Wallets V1 Spending Wallets Get"}}}}}},"post":{"tags":["spending"],"summary":"Create Wallet","description":"Generate a wallet. Returns its key and phrase, and the wallet's facts.\n\nHuman-only: minting a custodial wallet is an account-shaping act, and an\nagent that could mint one could mint somewhere to move money to (agents\nopen wallets over MCP with `spending_open_wallet`, which never sees the\nsecret). Step zero rides on this call: `{\"acknowledge\": true}` records\nthat the person read what a spending wallet is (a burner, not storage)\nand the wallet opens at once. Without it, and without an earlier\nacknowledgement, nothing is created.","operationId":"create_wallet_v1_spending_wallets_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CreateBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Wallet V1 Spending Wallets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/archive":{"get":{"tags":["spending"],"summary":"List Archive","description":"Burned and revoked wallets, and burned branches: the history stays.\nAccount credentials only: a bound key has no archive to read.","operationId":"list_archive_v1_spending_wallets_archive_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Archive V1 Spending Wallets Archive Get"}}}}}}},"/v1/spending-wallets/costs":{"get":{"tags":["spending"],"summary":"Account Costs","description":"The price list and this account's service history: every fee charged\n(opening fees, payment fees, funding and transfer cents) and collected,\nwith monthly totals. The same rows as the dashboard's Costs section.","operationId":"account_costs_v1_spending_wallets_costs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Costs V1 Spending Wallets Costs Get"}}}}}}},"/v1/spending-wallets/costs.csv":{"get":{"tags":["spending"],"summary":"Account Costs Csv","operationId":"account_costs_csv_v1_spending_wallets_costs_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/spending-wallets/statements":{"get":{"tags":["spending"],"summary":"Statements Index","description":"Every month with activity, newest first, with its totals and the\nstatement's number and address.","operationId":"statements_index_v1_spending_wallets_statements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Statements Index V1 Spending Wallets Statements Get"}}}}}}},"/v1/spending-wallets/statements/{month}.csv":{"get":{"tags":["spending"],"summary":"Statement Csv","operationId":"statement_csv_v1_spending_wallets_statements__month__csv_get","parameters":[{"name":"month","in":"path","required":true,"schema":{"type":"string","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/statements/{month}/print":{"get":{"tags":["spending"],"summary":"Statement Print","description":"The statement as a printable page: the same rows, a number, the\naccount, the period. Save it as a PDF from the browser.","operationId":"statement_print_v1_spending_wallets_statements__month__print_get","parameters":[{"name":"month","in":"path","required":true,"schema":{"type":"string","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/statements/{month}":{"get":{"tags":["spending"],"summary":"Statement Json","description":"One month, itemised: every payment, fee, funding, transfer and burn,\nwith wallet, detail and receipt, and the totals.","operationId":"statement_json_v1_spending_wallets_statements__month__get","parameters":[{"name":"month","in":"path","required":true,"schema":{"type":"string","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Statement Json V1 Spending Wallets Statements  Month  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/stats":{"get":{"tags":["spending"],"summary":"Account Stats","description":"What each wallet spent, in how many payments, its fees, when it last\npaid; the same per branch and for the account. From the event stream,\nso it agrees with the purchases list. A bound key sees its own.","operationId":"account_stats_v1_spending_wallets_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Stats V1 Spending Wallets Stats Get"}}}}}}},"/v1/spending-wallets/rehearsal":{"get":{"tags":["spending"],"summary":"Rehearsal Hint","description":"Where the rehearsal checkout lives is the receiving rail's business\n(`GET /v1/rehearsal-checkout`); this says so for anyone who asks here.","operationId":"rehearsal_hint_v1_spending_wallets_rehearsal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rehearsal Hint V1 Spending Wallets Rehearsal Get"}}}}}}},"/v1/spending-wallets/keys":{"post":{"tags":["spending"],"summary":"Mint Agent Key","description":"A live key for an agent, shown once. Human-only.\n\nKeys normally require a payout wallet, because a seller's key routes\nmoney somewhere. A person who only wants their agent to BUY has no payout\nwallet and no reason to get one, so this door skips that rule. The key\nis a receiving-rail credential (it is what `/mcp` and `/v1/...` accept);\nminting it here only changes which gate applies.","operationId":"mint_agent_key_v1_spending_wallets_keys_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mint Agent Key V1 Spending Wallets Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/profile":{"put":{"tags":["spending"],"summary":"Set Profile","description":"Whether the account's burned wallets show on its public page. A\nperson's setting, in a browser session; agents cannot reach it.","operationId":"set_profile_v1_spending_wallets_profile_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Profile V1 Spending Wallets Profile Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/burn-address":{"put":{"tags":["spending"],"summary":"Set Burn Address","description":"The account's default burn address for a chain: where a burned wallet\nsends what is left unless the wallet or its branch names another. A\nperson's setting, in a browser session; an agent never chooses where\nmoney goes.","operationId":"set_burn_address_v1_spending_wallets_burn_address_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurnAddressBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Burn Address V1 Spending Wallets Burn Address Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/signup":{"post":{"tags":["spending"],"summary":"Agent Signup","description":"An agent opens an account and a wallet for itself: no person, no\nemail. The answer is the wallet, its key and a funding link. Bounded\nuntil a person claims it (POST /claim, spending_claim).","operationId":"agent_signup_v1_spending_wallets_signup_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SignupBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Signup V1 Spending Wallets Signup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/claim":{"post":{"tags":["spending"],"summary":"Agent Claim","description":"The agent hands its account to a person by email; the person signs\nin with that address and becomes the owner.","operationId":"agent_claim_v1_spending_wallets_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__spending__router__ClaimBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Claim V1 Spending Wallets Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/acknowledge":{"post":{"tags":["spending"],"summary":"Acknowledge","description":"Step zero of onboarding: the person has read how spending wallets\nwork and accepted that one is a burner for an agent, not storage. Human\nonly, recorded once, required before a wallet can be created.","operationId":"acknowledge_v1_spending_wallets_acknowledge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Acknowledge V1 Spending Wallets Acknowledge Post"}}}}}}},"/v1/spending-wallets/{wallet}":{"get":{"tags":["spending"],"summary":"Read Wallet","description":"One wallet's facts, without touching the chain.","operationId":"read_wallet_v1_spending_wallets__wallet__get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Wallet V1 Spending Wallets  Wallet  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["spending"],"summary":"Patch Wallet","description":"Rename a wallet, or set its own burn address. Session-only: the burn\naddress decides where money goes.","operationId":"patch_wallet_v1_spending_wallets__wallet__patch","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Wallet V1 Spending Wallets  Wallet  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["spending"],"summary":"Revoke Wallet","description":"Archive it. NOT a way to move money: burn, or reveal first, then revoke.","operationId":"revoke_wallet_v1_spending_wallets__wallet__delete","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Wallet V1 Spending Wallets  Wallet  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/key/reveal":{"post":{"tags":["spending"],"summary":"Reveal Wallet Key","description":"The wallet's key, again, to a signed-in person. No questions asked\n(owner, 2026-09-05); recorded on the wallet's stream. Never a key's\nbusiness, never an agent's.","operationId":"reveal_wallet_key_v1_spending_wallets__wallet__key_reveal_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reveal Wallet Key V1 Spending Wallets  Wallet  Key Reveal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/key/rotate":{"post":{"tags":["spending"],"summary":"Rotate Wallet Key","description":"A new key; the old one stops working at once.","operationId":"rotate_wallet_key_v1_spending_wallets__wallet__key_rotate_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Wallet Key V1 Spending Wallets  Wallet  Key Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/key":{"delete":{"tags":["spending"],"summary":"Revoke Wallet Key","description":"Kill the wallet's key without minting another. Rotate mints again.","operationId":"revoke_wallet_key_v1_spending_wallets__wallet__key_delete","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Wallet Key V1 Spending Wallets  Wallet  Key Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/balance":{"get":{"tags":["spending"],"summary":"Read Balance","description":"The button. Reads the chain, and nags above the line.\n\nNothing polls this: there is no watcher and no cached balance, because with\nreveal-on-demand a holder can move their own funds at any moment and a\ncached number would go stale for reasons we invited.","operationId":"read_balance_v1_spending_wallets__wallet__balance_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Balance V1 Spending Wallets  Wallet  Balance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/pay":{"post":{"tags":["spending"],"summary":"Pay","description":"Pay an x402 challenge at `url`, from this wallet.\n\nWorks against ANY x402 endpoint, not only checkouts this service issued:\na wallet that can only buy from us is a store card.\n\n`max_usd` is optional: the wallet's balance is the budget, and the\ncaller's number only caps this one call. A rehearsal URL (a checkout's\n/test face) is payable from an empty wallet.","operationId":"pay_v1_spending_wallets__wallet__pay_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pay V1 Spending Wallets  Wallet  Pay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/rehearse":{"post":{"tags":["spending"],"summary":"Rehearse","description":"Try it free, from the dashboard: the wallet pays the shared rehearsal\ncheckout's /test face itself. Nothing settles and nothing is charged, so an\nempty wallet can do it; the receipt is recorded like any other so the card\ncan show the loop closing. Session only: it is the person's button.","operationId":"rehearse_v1_spending_wallets__wallet__rehearse_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rehearse V1 Spending Wallets  Wallet  Rehearse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/move":{"post":{"tags":["spending"],"summary":"Move Wallet","description":"Move a wallet into another of the account's branches. Nothing on\nchain moves; what changes is who pays from it (branch keys), the rules\nit inherits, its place in a ranked order, and where its change goes when\nclosed. `dry_run` answers those changes without moving, so a person can\nread them first; the move returns the same list. Session only.","operationId":"move_wallet_v1_spending_wallets__wallet__move_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Wallet V1 Spending Wallets  Wallet  Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/policy":{"get":{"tags":["spending"],"summary":"Read Policy","description":"The bounds on this wallet: its own policy, the branch's it inherits,\nand the effective one an agent is held to. Any of the account's\ncredentials may read it; only a person may change it.","operationId":"read_policy_v1_spending_wallets__wallet__policy_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Policy V1 Spending Wallets  Wallet  Policy Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["spending"],"summary":"Set Policy","description":"Set the wallet's own policy (the whole document; an empty body clears\nit). A person's guardrail, so a key can never loosen it: session only,\nmanager or owner for an organization's wallet.","operationId":"set_policy_v1_spending_wallets__wallet__policy_put","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Policy V1 Spending Wallets  Wallet  Policy Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/budget":{"get":{"tags":["spending"],"summary":"Read Budget","description":"The facts an agent reads before promising a purchase. There are no\nstanding limits: the wallet's balance is the budget, so this answers\nthe fee rule, the free payments left and the onboarding state. Agents\nmay read it; the balance itself is one call away at /balance.","operationId":"read_budget_v1_spending_wallets__wallet__budget_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Budget V1 Spending Wallets  Wallet  Budget Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/funding":{"get":{"tags":["spending"],"summary":"Funding","description":"Everything needed to send USDC to this wallet, pre-filled. `checkout`\nis the wallet's \"Send money to\" link for this amount (made on first\nask, reused after): a browser wallet pays it on the pay page, an agent\nwith pay_x402(url), and the sender pays the amount plus one cent. The\nrest is the plain way: the payment-request URI (for a QR or a link),\nthe address, the token, the amount, and per-app links.","operationId":"funding_v1_spending_wallets__wallet__funding_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}},{"name":"amount","in":"query","required":false,"schema":{"type":"string","default":"5","title":"Amount"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Funding V1 Spending Wallets  Wallet  Funding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/transfer":{"post":{"tags":["spending"],"summary":"Transfer","description":"Move money to another of your wallets on the same chain: pays the\ntarget's funding checkout from this wallet, for the one-cent settlement.\nRecorded as a transfer, never a purchase.","operationId":"transfer_v1_spending_wallets__wallet__transfer_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transfer V1 Spending Wallets  Wallet  Transfer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/funding.svg":{"get":{"tags":["spending"],"summary":"Funding Qr","description":"The same request as a QR, for a phone wallet scanning a laptop.","operationId":"funding_qr_v1_spending_wallets__wallet__funding_svg_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}},{"name":"amount","in":"query","required":false,"schema":{"type":"string","default":"5","title":"Amount"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/reveal":{"post":{"tags":["spending"],"summary":"Reveal Key","description":"The private key and the recovery phrase, to a signed-in human.\n\nThere is no transfer-out endpoint for a person's own address beyond the\nburn (AGENTS.md 2a): a holder who wants their funds elsewhere burns the\nwallet to a burn address, or reveals the key and moves them themselves.","operationId":"reveal_key_v1_spending_wallets__wallet__reveal_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reveal Key V1 Spending Wallets  Wallet  Reveal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/burn":{"post":{"tags":["spending"],"summary":"Burn Wallet","description":"Burn it: what is left goes to the burn address (or `to`, for this burn\nonly), the receipts stay, the wallet is closed. Session-only, like\nreveal: it moves money, and only to an address a person named.","operationId":"burn_wallet_v1_spending_wallets__wallet__burn_post","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BurnBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Burn Wallet V1 Spending Wallets  Wallet  Burn Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/stats":{"get":{"tags":["spending"],"summary":"Wallet Stats","description":"One wallet's numbers: spent, payments, fees, last paid, returned.","operationId":"wallet_stats_v1_spending_wallets__wallet__stats_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Stats V1 Spending Wallets  Wallet  Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/events.csv":{"get":{"tags":["spending"],"summary":"Events Csv","description":"The wallet's stream as a spreadsheet.","operationId":"events_csv_v1_spending_wallets__wallet__events_csv_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{wallet}/events":{"get":{"tags":["spending"],"summary":"List Events","description":"What has happened to this wallet: created, spent, revealed, flagged.","operationId":"list_events_v1_spending_wallets__wallet__events_get","parameters":[{"name":"wallet","in":"path","required":true,"schema":{"type":"string","title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Events V1 Spending Wallets  Wallet  Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches":{"get":{"tags":["spending"],"summary":"List Branches","description":"Main first, then the branches the account made, with their wallets.\nA bound key sees its own branch only.","operationId":"list_branches_v1_spending_branches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Branches V1 Spending Branches Get"}}}}}},"post":{"tags":["spending"],"summary":"Create Branch","operationId":"create_branch_v1_spending_branches_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBranch"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Branch V1 Spending Branches Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}":{"get":{"tags":["spending"],"summary":"Read Branch","operationId":"read_branch_v1_spending_branches__branch__get","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Branch V1 Spending Branches  Branch  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["spending"],"summary":"Patch Branch","description":"Rename, change the rule, set the RANKED order, or set the branch's\nburn address (validated per chain when the branch's wallets are all on\none chain; otherwise per wallet at burn time).","operationId":"patch_branch_v1_spending_branches__branch__patch","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBranch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Branch V1 Spending Branches  Branch  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/key/reveal":{"post":{"tags":["spending"],"summary":"Reveal Branch Key","operationId":"reveal_branch_key_v1_spending_branches__branch__key_reveal_post","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reveal Branch Key V1 Spending Branches  Branch  Key Reveal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/key/rotate":{"post":{"tags":["spending"],"summary":"Rotate Branch Key","operationId":"rotate_branch_key_v1_spending_branches__branch__key_rotate_post","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Branch Key V1 Spending Branches  Branch  Key Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/key":{"delete":{"tags":["spending"],"summary":"Revoke Branch Key","operationId":"revoke_branch_key_v1_spending_branches__branch__key_delete","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Branch Key V1 Spending Branches  Branch  Key Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/balance":{"get":{"tags":["spending"],"summary":"Branch Balance","description":"Every wallet's balance and the total, read from the chain.","operationId":"branch_balance_v1_spending_branches__branch__balance_get","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Branch Balance V1 Spending Branches  Branch  Balance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/stats":{"get":{"tags":["spending"],"summary":"Branch Stats","description":"The branch's wallets' numbers and their total.","operationId":"branch_stats_v1_spending_branches__branch__stats_get","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Branch Stats V1 Spending Branches  Branch  Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/events":{"get":{"tags":["spending"],"summary":"Branch Events","operationId":"branch_events_v1_spending_branches__branch__events_get","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Branch Events V1 Spending Branches  Branch  Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/pay":{"post":{"tags":["spending"],"summary":"Branch Pay","description":"Pay from whichever wallet the branch's rule picks. Main does not pay\nas a branch: name the wallet.","operationId":"branch_pay_v1_spending_branches__branch__pay_post","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Branch Pay V1 Spending Branches  Branch  Pay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-branches/{branch}/burn":{"post":{"tags":["spending"],"summary":"Branch Burn","description":"Burn every wallet in the branch, then the branch. Session-only.","operationId":"branch_burn_v1_spending_branches__branch__burn_post","parameters":[{"name":"branch","in":"path","required":true,"schema":{"type":"string","title":"Branch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Branch Burn V1 Spending Branches  Branch  Burn Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/costs":{"get":{"tags":["spending"],"summary":"Costs","description":"Every price the service charges, as numbers and as sentences, with\nthe date the list took effect. Fees come out of the wallet they concern;\nthere are no account credits.","operationId":"costs_v1_costs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Costs V1 Costs Get"}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Root","description":"The service root is the self-describing JSON map (how to buy, how to\nsell) in one request.\n\nNo HTML face here: the marketing landing page is a separate static\ndeployment on the brand domain (`scripts/build_site.py`), so this\nservice never renders marketing. The two-faces principle still holds\nwhere it earns its keep — on `/c/:id`, which must serve a human pay page\nand an agent 402 for the same checkout.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Accept":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Accept"},"AvatarBody":{"properties":{"data_url":{"type":"string","title":"Data Url"}},"type":"object","required":["data_url"],"title":"AvatarBody"},"BurnAddressBody":{"properties":{"chain":{"type":"string","title":"Chain"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},"type":"object","required":["chain"],"title":"BurnAddressBody"},"BurnBody":{"properties":{"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},"type":"object","title":"BurnBody"},"CheckoutCreate":{"properties":{"price_usd":{"type":"string","title":"Price Usd"},"title":{"type":"string","title":"Title"},"content":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Content"},"pay_to":{"type":"string","title":"Pay To","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"fulfillment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fulfillment"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Payload"},"origin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Url"},"origin_method":{"type":"string","title":"Origin Method","default":"GET"},"origin_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Type"},"origin_auth_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Value"},"origin_auth_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Header"},"origin_auth_secret_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Secret Id"},"payouts":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Payouts"},"inherit_account_payouts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inherit Account Payouts"},"platform_fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Platform Fee Bps"},"platform_fee_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Fee To"},"sold_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sold By"},"parties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parties"},"platform_fee_payouts":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Platform Fee Payouts"},"reusable":{"type":"boolean","title":"Reusable","default":false},"max_deliveries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Deliveries"},"package_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Package Ttl Days"},"calls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calls"},"delivery_timeout_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Timeout Ms"},"test_delivery_daily_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Delivery Daily Cap"},"mcp_tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool"},"test_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Test Mode"},"expires_in_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Minutes"},"wallet_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wallet Button"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Input Schema"},"output_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Output Schema"},"example_input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Input"},"example_output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Output"},"freshness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness"},"coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"constraints":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constraints"},"escrow_offer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Offer"}},"type":"object","required":["price_usd","title"],"title":"CheckoutCreate"},"CheckoutExtend":{"properties":{"expires_in_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Expires In Minutes"}},"additionalProperties":false,"type":"object","title":"CheckoutExtend"},"CheckoutOfferPatch":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Input Schema"},"output_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Output Schema"},"example_input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Input"},"example_output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Output"},"freshness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness"},"coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"constraints":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constraints"},"wallet_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wallet Button"},"content":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Content"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Payload"}},"additionalProperties":false,"type":"object","title":"CheckoutOfferPatch"},"CheckoutPayoutAdd":{"properties":{"chain_family":{"type":"string","title":"Chain Family"},"address":{"type":"string","title":"Address"}},"additionalProperties":false,"type":"object","required":["chain_family","address"],"title":"CheckoutPayoutAdd"},"CreateBody":{"properties":{"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"acknowledge":{"type":"boolean","title":"Acknowledge","default":false}},"type":"object","title":"CreateBody"},"CreateBranch":{"properties":{"name":{"type":"string","title":"Name"},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule"},"burn_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Burn Address"}},"type":"object","required":["name"],"title":"CreateBranch"},"CreateOrg":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","required":["name"],"title":"CreateOrg"},"EmbedSettingsUpdate":{"properties":{"embed_origins":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Embed Origins"}},"type":"object","title":"EmbedSettingsUpdate"},"EscrowCheckoutCreate":{"properties":{"price_usd":{"type":"string","title":"Price Usd"},"title":{"type":"string","title":"Title"},"content":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Content"},"pay_to":{"type":"string","title":"Pay To","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"fulfillment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fulfillment"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Payload"},"origin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Url"},"origin_method":{"type":"string","title":"Origin Method","default":"GET"},"origin_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Type"},"origin_auth_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Value"},"origin_auth_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Header"},"origin_auth_secret_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Secret Id"},"payouts":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Payouts"},"inherit_account_payouts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inherit Account Payouts"},"platform_fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Platform Fee Bps"},"platform_fee_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Fee To"},"sold_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sold By"},"parties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parties"},"platform_fee_payouts":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Platform Fee Payouts"},"reusable":{"type":"boolean","title":"Reusable","default":false},"max_deliveries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Deliveries"},"package_ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Package Ttl Days"},"calls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calls"},"delivery_timeout_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Timeout Ms"},"test_delivery_daily_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Test Delivery Daily Cap"},"mcp_tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool"},"test_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Test Mode"},"expires_in_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Minutes"},"wallet_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wallet Button"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Input Schema"},"output_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Output Schema"},"example_input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Input"},"example_output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Example Output"},"freshness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freshness"},"coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"constraints":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constraints"},"escrow_offer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Offer"},"escrow_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Preset"},"escrow_settle_window":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Escrow Settle Window"},"escrow_hold_window":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Escrow Hold Window"},"escrow_backstop_window":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Escrow Backstop Window"},"escrow_arbiter_evm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Arbiter Evm"},"escrow_arbiter_svm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Arbiter Svm"}},"type":"object","required":["price_usd","title"],"title":"EscrowCheckoutCreate","description":"An escrow checkout: same product surface, different promise.\n\nEverything a plain checkout takes, plus the terms of the hold. The windows\nand the arbiter are FROZEN onto the row at create because they end up inside\nthe buyer's signature — resolving them later would let a seller change a\ndeal a buyer already agreed to."},"EscrowSettingsUpdate":{"properties":{"escrow_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Policy"},"escrow_arbiter_evm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Arbiter Evm"},"escrow_arbiter_svm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Arbiter Svm"},"arbiter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arbiter"},"escrow_default_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Escrow Default Preset"}},"type":"object","title":"EscrowSettingsUpdate","description":"Standing escrow settings for the account — the top of the consent chain."},"FacilitatorRequest":{"properties":{"network":{"$ref":"#/components/schemas/Network"},"requirement":{"additionalProperties":true,"type":"object","title":"Requirement"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["network","requirement","payload"],"title":"FacilitatorRequest","description":"The 402 `requirement` the relay issued plus the buyer's signed `payload`."},"FulfilmentUpdate":{"properties":{"status":{"type":"string","title":"Status","default":"delivered"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","title":"FulfilmentUpdate"},"GrantRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"scope":{"type":"string","title":"Scope","default":"seller"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"},"uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Uses"}},"additionalProperties":false,"type":"object","required":["subject"],"title":"GrantRequest","description":"What a seller says when they let one of their own readers through."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Invite":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"spender"}},"type":"object","required":["email"],"title":"Invite"},"KeyCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"scope":{"type":"string","title":"Scope","default":"payments"},"mode":{"type":"string","title":"Mode","default":"test"},"platform_fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Platform Fee Bps"}},"type":"object","title":"KeyCreate"},"MagicLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"return_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return To"}},"type":"object","required":["email"],"title":"MagicLinkRequest"},"MoveBody":{"properties":{"branch":{"type":"string","title":"Branch"},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","required":["branch"],"title":"MoveBody"},"Network":{"type":"string","enum":["eip155:8453","eip155:84532","stellar:pubnet","stellar:testnet","solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","tron:0x2b6653dc","tron:0xcd8690dc"],"title":"Network","description":"CAIP-2 network IDs. Base + Stellar at launch; Solana added behind the\n`expose_solana` gate (hidden until its facilitator + smoketest land)."},"OpenThread":{"properties":{"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"}},"type":"object","required":["subject","body"],"title":"OpenThread"},"OriginKeyCreate":{"properties":{"auth_type":{"type":"string","title":"Auth Type"},"value":{"type":"string","title":"Value"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Name"}},"additionalProperties":false,"type":"object","required":["auth_type","value"],"title":"OriginKeyCreate"},"OriginKeyRotate":{"properties":{"value":{"type":"string","title":"Value"}},"additionalProperties":false,"type":"object","required":["value"],"title":"OriginKeyRotate"},"PatchBody":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"burn_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Burn Address"},"clear_burn_address":{"type":"boolean","title":"Clear Burn Address","default":false}},"type":"object","title":"PatchBody"},"PatchBranch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule"},"burn_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Burn Address"},"clear_burn_address":{"type":"boolean","title":"Clear Burn Address","default":false},"order":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order"},"policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Policy"}},"type":"object","title":"PatchBranch"},"PayoutWalletsUpdate":{"properties":{"wallets":{"additionalProperties":{"type":"string"},"type":"object","title":"Wallets"}},"type":"object","required":["wallets"],"title":"PayoutWalletsUpdate"},"PlatformUpdate":{"properties":{"platform_account":{"type":"boolean","title":"Platform Account","default":false},"platform_fee_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Platform Fee Bps"}},"type":"object","title":"PlatformUpdate","description":"The mode and the RATE — deliberately no wallet fields. A marketplace's\ncut lands in its payout wallets (PUT /v1/account/wallets), one wallet\nper chain, one wallet store per account."},"PolicyBody":{"properties":{"allow_hosts":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Allow Hosts"},"max_per_call_usd":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Max Per Call Usd"},"approve_over_usd":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Approve Over Usd"}},"type":"object","title":"PolicyBody"},"PrepareRequest":{"properties":{"payer":{"type":"string","title":"Payer"},"network":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"},"params":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","required":["payer"],"title":"PrepareRequest"},"ProfileBody":{"properties":{"archive_public":{"type":"boolean","title":"Archive Public"}},"type":"object","required":["archive_public"],"title":"ProfileBody"},"Reply":{"properties":{"body":{"type":"string","title":"Body"}},"type":"object","required":["body"],"title":"Reply"},"ReportCreate":{"properties":{"category":{"type":"string","title":"Category"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"receipt_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Id"},"package_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Key"},"delivery_seq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Seq"}},"additionalProperties":false,"type":"object","required":["category"],"title":"ReportCreate"},"ReportUpdate":{"properties":{"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","required":["status"],"title":"ReportUpdate"},"SetRole":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"SetRole"},"SignedAction":{"properties":{"transaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction"},"v":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"V"},"r":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"R"},"s":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S"},"deadline":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deadline"}},"type":"object","title":"SignedAction"},"SignupBody":{"properties":{"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","title":"SignupBody"},"SiteGrantRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"},"uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Uses"}},"additionalProperties":false,"type":"object","required":["subject"],"title":"SiteGrantRequest","description":"A pass for a reader, minted before anyone knows what they will read."},"ToolsRequest":{"properties":{"origin_url":{"type":"string","title":"Origin Url"},"origin_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Type"},"origin_auth_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Value"},"origin_auth_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Header"},"origin_auth_secret_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Auth Secret Id"}},"additionalProperties":false,"type":"object","required":["origin_url"],"title":"ToolsRequest"},"Transfer":{"properties":{"member_id":{"type":"string","title":"Member Id"}},"type":"object","required":["member_id"],"title":"Transfer"},"TransferBody":{"properties":{"to":{"type":"string","title":"To"},"amount_usd":{"type":"string","title":"Amount Usd"}},"type":"object","required":["to","amount_usd"],"title":"TransferBody"},"UpdateProfileRequest":{"properties":{"slug":{"anyOf":[{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,38}$"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"profile_type":{"anyOf":[{"type":"string","pattern":"^(individual|team|company)$"},{"type":"null"}],"title":"Profile Type"},"bio":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Bio"},"avatar_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Avatar Url"},"website_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Website Url"},"social_links":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Social Links"}},"type":"object","title":"UpdateProfileRequest","description":"Patch the provider's public profile (the share-worthy /u/<slug> page).\n\nOnly provided fields change. To CLEAR a text/URL field send an empty string;\n`null`/omitted leaves it unchanged. `social_links` is replaced wholesale when\nprovided (send `{}` to clear all). `verified` is NOT here — it's a manual team\nreview set only via the admin surface, never self-serve.\n\n`slug` is your public HANDLE (the `/u/<slug>` page + the `/r/<slug>/…` call\nURLs). Changing it is allowed but **breaks any call URLs buyers have already\nsaved** — claim a good handle early. Lowercase `[a-z0-9-]`, 2–39 chars; must be\nunique and not a reserved word."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyRequest"},"WalletChallengeRequest":{"properties":{"address":{"type":"string","maxLength":128,"minLength":4,"title":"Address"},"network":{"type":"string","maxLength":64,"minLength":3,"title":"Network"}},"type":"object","required":["address","network"],"title":"WalletChallengeRequest","description":"Ask for a wallet sign-in challenge (agent-native provider bootstrap)."},"WalletVerifyRequest":{"properties":{"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"},"signature":{"type":"string","maxLength":2048,"minLength":1,"title":"Signature"}},"type":"object","required":["message","signature"],"title":"WalletVerifyRequest","description":"Return a signed challenge. `signature`: 0x-hex (EVM) / hex (Stellar)."},"WebhookCreate":{"properties":{"url":{"type":"string","title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["url"],"title":"WebhookCreate"},"app__routers__orgs__ClaimBody":{"properties":{"token":{"type":"string","title":"Token"},"acknowledge":{"type":"boolean","title":"Acknowledge","default":true}},"type":"object","required":["token"],"title":"ClaimBody"},"app__spending__router__ClaimBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ClaimBody"}}}}