{"openapi":"3.1.0","info":{"title":"checkout402 API","description":"Hosted checkouts that machines can pay (x402). 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.","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/checkout402, 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"}}}}}}},"/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. Stub until the facilitator modules land\n(Roadmap Stage 1). Shape is stable so monitoring can wire to it now.","operationId":"health_facilitator_health_facilitator_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Facilitator Health Facilitator Get"}}}}}}},"/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":"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 --\ncheckout402 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 c402: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 `c402 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"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PayBody"},{"type":"null"}],"title":"Body"}}}},"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"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PayBody"},{"type":"null"}],"title":"Body"}}}},"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-Checkout402-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 checkout402 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"}}}}}}},"/v1/schedules":{"get":{"tags":["schedules"],"summary":"List Schedules","description":"Every series behind this account's checkouts, newest first.","operationId":"list_schedules_v1_schedules_get","parameters":[{"name":"checkout_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Schedules V1 Schedules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/schedules/{schedule_id}":{"get":{"tags":["schedules"],"summary":"Get Schedule","operationId":"get_schedule_v1_schedules__schedule_id__get","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Schedule V1 Schedules  Schedule Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/schedules/{schedule_id}/cancel":{"post":{"tags":["schedules"],"summary":"Seller Cancel","description":"Stop the series: no further period will be submitted, and the held\nsignatures are dropped. What already settled stays settled.","operationId":"seller_cancel_v1_schedules__schedule_id__cancel_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SellerCancel"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seller Cancel V1 Schedules  Schedule Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schedule/{schedule_id}":{"get":{"tags":["schedules"],"summary":"Buyer Schedule","description":"The series as its buyer sees it: what settled, what is coming, and\nexactly how to stop the rest — softly (sign one message) or on-chain\n(sign one `CancelAuthorization` per held period; we submit them).","operationId":"buyer_schedule_schedule__schedule_id__get","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Buyer Schedule Schedule  Schedule Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schedule/{schedule_id}/cancel":{"post":{"tags":["schedules"],"summary":"Buyer Cancel","operationId":"buyer_cancel_schedule__schedule_id__cancel_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BuyerCancel"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Buyer Cancel Schedule  Schedule Id  Cancel Post"}}}},"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.","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"}}}}}}},"/.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"}}}}}}},"/pay402":{"get":{"tags":["pay402"],"summary":"Pay402 Page","operationId":"pay402_page_pay402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/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 addresses, 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.","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"}}}}}}},"/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/{chain}":{"post":{"tags":["spending"],"summary":"Create Wallet","description":"Generate a wallet. Returns its key ONCE.\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.","operationId":"create_wallet_v1_spending_wallets__chain__post","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Wallet V1 Spending Wallets  Chain  Post"}}}},"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 — reveal first, then revoke.","operationId":"revoke_wallet_v1_spending_wallets__chain__delete","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Wallet V1 Spending Wallets  Chain  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/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__chain__balance_get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Balance V1 Spending Wallets  Chain  Balance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/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 person's per-purchase and daily limits are the\nceiling, and an agent's own number only ever lowers it. A rehearsal URL\n(a checkout's /test face) is payable from an empty wallet.","operationId":"pay_v1_spending_wallets__chain__pay_post","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"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  Chain  Pay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/limits":{"get":{"tags":["spending"],"summary":"Read Limits","description":"The person's limits and what is left of today. Agents may read.","operationId":"read_limits_v1_spending_wallets__chain__limits_get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Limits V1 Spending Wallets  Chain  Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["spending"],"summary":"Write Limits","description":"Set the per-purchase and per-day limits. Human-only: the limits exist\nto bound the agent, so the agent cannot be the one moving them.","operationId":"write_limits_v1_spending_wallets__chain__limits_put","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"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 Write Limits V1 Spending Wallets  Chain  Limits Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/funding":{"get":{"tags":["spending"],"summary":"Funding","description":"Everything a wallet app needs to send USDC here, pre-filled: the\npayment-request URI (for a QR or a link), the address, the token, the\namount in both units, and per-app links where the app documents one.","operationId":"funding_v1_spending_wallets__chain__funding_get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"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  Chain  Funding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/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__chain__funding_svg_get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"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/{chain}/reveal":{"post":{"tags":["spending"],"summary":"Reveal Key","description":"The private key, to a signed-in human. THE ONLY WAY MONEY LEAVES.\n\nThere is no transfer-out endpoint and none may be added (AGENTS.md 2a):\na holder who wants their funds elsewhere reveals the key and moves them\nthemselves. That is what keeps this a wallet we operate rather than a\nbalance we owe.","operationId":"reveal_key_v1_spending_wallets__chain__reveal_post","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reveal Key V1 Spending Wallets  Chain  Reveal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/spending-wallets/{chain}/events":{"get":{"tags":["spending"],"summary":"List Events","description":"What has happened to this wallet: created, spent, revealed, flagged.","operationId":"list_events_v1_spending_wallets__chain__events_get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Events V1 Spending Wallets  Chain  Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"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":{"BuyerCancel":{"properties":{"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature"},"payer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer"},"authorizations":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Authorizations"}},"type":"object","title":"BuyerCancel"},"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},"schedule_interval_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Interval Days"},"schedule_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Periods"},"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"},"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},"schedule_interval_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Interval Days"},"schedule_periods":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Periods"},"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"},"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"},"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)."},"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"},"PayBody":{"properties":{"schedule":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Schedule"}},"additionalProperties":true,"type":"object","title":"PayBody","description":"The OPTIONAL body of /pay. The payment itself travels in the header as\nalways; the body exists for a series, whose held periods would not fit\nin a header (twelve signed payloads is well past the usual 8 KB line)."},"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."},"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"},"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"},"SellerCancel":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"SellerCancel"},"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"},"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"},"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"}}}}