{"openapi":"3.1.0","info":{"title":"AgentPay Gateway","description":"Buyer-side trust layer for x402 agents. verified_route ranks providers on paid delivery evidence and sybil-collapsed payer counts; pre_trade_check returns an ok/caution/avoid verdict before a trade; session_create opens a spend cap the gateway enforces for the paying wallet on Stacks and Base, with chain-verified receipts on a public ledger. USDC on Base and Stellar, sBTC or STX on Stacks (any Stacks x402 client).","contact":{"name":"AgentPay","url":"https://agentpay.tools/","email":"romudille@gmail.com"},"version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","description":"Content-negotiated root.\n\nBrowsers (Accept: text/html) get the landing page. Agents and API clients\nget the JSON manifest. HEAD requests run GET and drop the body, so both\ncontent types respond with 200 — keeps the Bazaar \"quality score\" check\nhappy regardless of which Accept the indexer sends.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]},"head":{"summary":"Root","description":"Content-negotiated root.\n\nBrowsers (Accept: text/html) get the landing page. Agents and API clients\nget the JSON manifest. HEAD requests run GET and drop the body, so both\ncontent types respond with 200 — keeps the Bazaar \"quality score\" check\nhappy regardless of which Accept the indexer sends.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/favicon.svg":{"get":{"summary":"Favicon","description":"SVG favicon — dark background, teal A mark.","operationId":"favicon_favicon_svg_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/og.png":{"get":{"summary":"Og Image","description":"Open Graph card image for link previews.","operationId":"og_image_og_png_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/favicon.ico":{"get":{"summary":"Favicon Ico","description":"ICO favicon — same dark-bg + teal-A mark, for directories that probe .ico.","operationId":"favicon_ico_favicon_ico_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/health":{"get":{"summary":"Health","description":"Liveness, and the platform healthcheck target.\n\nExempt from the global default limit. The limiter keys on\nrequest.client.host, which behind a platform proxy is one bucket for every\ncaller, so an unrelated burst of traffic would 429 the healthcheck and get a\nhealthy process restarted. A limit whose failure mode is worse than the\ntraffic it throttles protects nothing — and this route reads no database and\ndoes no work. Undecorated public reads keep the default.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/stats":{"get":{"summary":"Stats","description":"Gateway statistics.\n\nRecent activity is published as shape only — which tool, what it cost,\nwhether it worked. The in-memory log also holds the buyer's wallet and the\nsettlement hash, and those stay internal: an unauthenticated feed of\naddress-to-tool pairs is a customer list, and the same redaction rule\nalready governs the public ledger.","operationId":"stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/plan/estimate":{"post":{"summary":"Estimate Plan","description":"Price a plan of tool calls without executing or paying for anything.\n\nUnknown tools don't fail the request — they come back with\nexists=false so the agent can re-plan around them. External x402 URLs\nare annotated (and priced when possible) from the Prober's telemetry.","operationId":"estimate_plan_v1_plan_estimate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/tools":{"get":{"summary":"List Tools","description":"List all available tools with pricing (HTML for browsers, JSON default).","operationId":"list_tools_tools_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/tools/{tool_name}":{"get":{"summary":"Get Tool","description":"Get details for a specific tool. Supports legacy aliases.\n\nBrowsers (Accept: text/html) get a server-rendered, indexable page;\nagents keep the JSON contract.","operationId":"get_tool_tools__tool_name__get","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]},"head":{"summary":"Get Tool","description":"Get details for a specific tool. Supports legacy aliases.\n\nBrowsers (Accept: text/html) get a server-rendered, indexable page;\nagents keep the JSON contract.","operationId":"get_tool_tools__tool_name__get","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/tools/{tool_name}/call":{"head":{"summary":"Head Tool","description":"HEAD pre-flight for x402 discovery — answers 402, mirroring the GET probe.\n\nProbers scoring \"does the resource return 402?\" treat any other status as\na failure, so HEAD returns the same 402 challenge as GET\n/tools/{name}/call (status + PAYMENT-REQUIRED header incl.\nextensions.bazaar, no pending row) with an empty body per HEAD semantics.\nThe X-Price-USDC/X-Pay-To pre-flight headers are kept for cost-check\ncallers.","operationId":"head_tool_tools__tool_name__call_head","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]},"get":{"summary":"Call Tool Get","description":"x402 discovery crawlers probe resources with GET — answer with the\nsame 402 challenge POST issues, so the validation crawl can read the\nPAYMENT-REQUIRED header (incl. extensions.bazaar). Without this the\ncrawl gets a 405 and the listing never leaves 'processing'.","operationId":"call_tool_get_tools__tool_name__call_get","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]},"post":{"summary":"Call Tool","description":"Main endpoint — call a paid MCP tool.\n\nSupports two payment paths:\n  Stellar — X-Payment: tx_hash=<hash>,from=<addr>,id=<payment_id>\n  Base    — PAYMENT-SIGNATURE: <base64(PaymentPayload JSON)>\n\nFlow:\n  1. Neither header → _issue_402 (advertise both options) — the body is\n     parsed leniently first: a bare/malformed POST still gets the 402,\n     never a 422.\n  2. X-Payment → _settle_stellar, then _execute_and_log\n  3. PAYMENT-SIGNATURE + $0 tool → _settle_free_v2 (no on-chain settle)\n  4. PAYMENT-SIGNATURE → _settle_base_path, then _execute_and_log\n  (2–4 validate the body strictly before settling, so a malformed paid\n  call 422s without burning the payment.)","operationId":"call_tool_tools__tool_name__call_post","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}},{"name":"x-payment","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Payment"}},{"name":"x-agent-address","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Address"}},{"name":"payment-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"description":"Body of POST /tools/{name}/call.\n\nCanonical shape nests tool arguments under \"parameters\", but some\nclients send them at the top level ({\"symbol\": \"SOL\"} instead of\n{\"parameters\": {\"symbol\": \"SOL\"}}). Pydantic used to silently discard\nunknown keys, so those calls ran on tool defaults with no error. The\nvalidator below folds unrecognized top-level keys into `parameters`\nwhenever `parameters` itself is empty, so both shapes work; nested\ncallers are byte-for-byte unaffected.","properties":{"parameters":{"default":{},"title":"Parameters","type":"object"},"agent_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Address"}},"title":"ToolCallRequest","type":"object"}}}},"security":[]}},"/tools/register":{"post":{"summary":"Register Tool","description":"Register a new MCP tool in the marketplace.\n\nRegistration is gated because a tool carries a developer_address (the\nrevenue-split recipient) and an endpoint the gateway will call:\n  - 404 when TOOL_REGISTER_SECRET is unset (registration off — there is\n    no third-party developer flow yet)\n  - 401 unless X-Register-Secret matches (constant-time compare)\n  - 422 unless name/price/addresses/endpoint validate; endpoints must be\n    https and resolve only to public addresses","operationId":"register_tool_tools_register_post","parameters":[{"name":"x-register-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Register-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterToolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/session/create":{"get":{"summary":"Session Create Probe","operationId":"session_create_probe_v1_session_create_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Session Create Probe","operationId":"session_create_probe_v1_session_create_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Session","description":"Open a budget-capped agent session for $0.01 USDC.\n\nSupports two payment paths:\n  Stellar — X-Payment: tx_hash=<hash>,from=<addr>,id=<payment_id>\n  Base    — PAYMENT-SIGNATURE: <base64(PaymentPayload JSON)>\n\nOn verified payment returns:\n  session_id       — unique UUID for this session\n  max_spend        — budget cap from request body\n  agent_address    — paying agent's address\n  gateway_url      — root of agentpay.tools\n  tools_endpoint   — where to call tools\n  created_at       — ISO 8601 timestamp\n  receipt          — tx_hash + network + amount","operationId":"create_session_v1_session_create_post","parameters":[{"name":"x-payment","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Payment"}},{"name":"x-agent-address","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Address"}},{"name":"payment-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"agent_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Address"},"max_spend":{"default":"0.10","title":"Max Spend","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"}},"title":"SessionCreateRequest","type":"object"}}}}}},"/v1/session/{session_id}":{"get":{"summary":"Get Session","description":"Server-side ledger for a session: cap, spent, remaining, receipts.","operationId":"get_session_v1_session__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/discovery/arbitrum":{"get":{"summary":"Discovery Arbitrum","description":"Curated x402 discovery for the Arbitrum stack.\n\nReturns ranked, junk-filtered candidates (and a single recommendation) for\n`need` under `budget`, scoped to `chain`. This is the agent-facing surface;\nthe public leaderboard reads the same endpoint.","operationId":"discovery_arbitrum_discovery_arbitrum_get","parameters":[{"name":"need","in":"query","required":false,"schema":{"type":"string","description":"What the agent needs, e.g. 'funding rates'","default":"","title":"Need"},"description":"What the agent needs, e.g. 'funding rates'"},{"name":"budget","in":"query","required":false,"schema":{"type":"number","minimum":0.0,"description":"Max USDC the agent will pay","default":0.01,"title":"Budget"},"description":"Max USDC the agent will pay"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"arbitrum-stack | arbitrum | arbitrum-sepolia | robinhood","default":"arbitrum-stack","title":"Chain"},"description":"arbitrum-stack | arbitrum | arbitrum-sepolia | robinhood"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/discovery/arbitrum/verify":{"post":{"summary":"Radar Verify","description":"Verify a RadarSplit settlement on-chain and consume it (one-shot).","operationId":"radar_verify_discovery_arbitrum_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadarVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/radar":{"get":{"summary":"Radar Leaderboard","description":"Public leaderboard for the Arbitrum x402 Radar (reads /discovery/arbitrum).","operationId":"radar_leaderboard_radar_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/.well-known/agentpay.json":{"get":{"summary":"Well Known Agentpay","description":"AgentPay manifest — discoverable by x402-aware agents.","operationId":"well_known_agentpay__well_known_agentpay_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/agent.json":{"get":{"summary":"Well Known Agent","description":"A2A protocol card — agent-to-agent discovery.","operationId":"well_known_agent__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/l402-services":{"get":{"summary":"Well Known L402 Services","description":"402index.io discovery document — lists all paid endpoints with pricing and request schemas.","operationId":"well_known_l402_services__well_known_l402_services_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/x402":{"get":{"summary":"Well Known X402","description":"x402 protocol discovery manifest.\nScanners and agents probing /.well-known/x402 find supported networks,\nassets, pricing range, and facilitator info here.","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/402index-verify.txt":{"get":{"summary":"Well Known 402Index Verify","description":"Domain-verification file for 402index.io.\n\nServes the SHA-256 hash from INDEX402_VERIFY_HASH as plain text. Returns\n404 when the env var is empty so the endpoint is harmless until claimed.","operationId":"well_known_402index_verify__well_known_402index_verify_txt_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/.well-known/x402-trust.txt":{"get":{"summary":"Well Known X402 Trust","description":"Domain-proof file for the x402-trust.com provider claim.\n\nOne line, `x402-trust-verification=v1:<public key>`, re-checked by them\non a schedule; the verified badge lapses if the file is missing for a\nweek. Putting `x402-trust-remove` in the same file delists the whole\nhost, so the content is fixed here and not composed from request input.","operationId":"well_known_x402_trust__well_known_x402_trust_txt_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/indexnow.txt":{"get":{"summary":"Indexnow Key","description":"IndexNow key file (indexnow.org) — instant URL submission to Bing,\nSeznam, Naver, Yandex. The key content must match the INDEXNOW_KEY env\nvar; submit URLs with keyLocation={GATEWAY_URL}/indexnow.txt, e.g.:\n\n    curl \"https://api.indexnow.org/indexnow?url=<page>&key=<key>&keyLocation=<GATEWAY_URL>/indexnow.txt\"\n\n404 when unconfigured (same pattern as 402index-verify).","operationId":"indexnow_key_indexnow_txt_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/robots.txt":{"get":{"summary":"Robots","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/.well-known/api-catalog":{"get":{"summary":"Api Catalog","description":"RFC 9727 API catalog (linkset+json).","operationId":"api_catalog__well_known_api_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/auth.md":{"get":{"summary":"Auth Md","description":"Agent registration/authentication guide (auth.md convention).","operationId":"auth_md_auth_md_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/.well-known/mcp/server-card.json":{"get":{"summary":"Mcp Server Card","description":"MCP Server Card (SEP-1649, schema still stabilizing) for the AgentPay\nMCP server: the remote Streamable-HTTP endpoint (keyless) and the local\nnpm stdio server (wallet mode). `transport` stays for older readers.","operationId":"mcp_server_card__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/sitemap.xml":{"get":{"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/guides":{"get":{"summary":"Guides Index","operationId":"guides_index_guides_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/guides/{slug}":{"get":{"summary":"Guide Page","operationId":"guide_page_guides__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/connect":{"get":{"summary":"Connect Index","operationId":"connect_index_connect_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/connect/{harness}":{"get":{"summary":"Connect Page","operationId":"connect_page_connect__harness__get","parameters":[{"name":"harness","in":"path","required":true,"schema":{"type":"string","title":"Harness"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/privacy":{"get":{"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/faucet":{"get":{"summary":"Faucet Json","description":"Generate a funded testnet wallet — returns JSON.","operationId":"faucet_json_faucet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/faucet/ui":{"get":{"summary":"Faucet Ui","description":"Browser-friendly faucet page.","operationId":"faucet_ui_faucet_ui_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[]}},"/v1/agent/register":{"post":{"summary":"Register Agent","description":"Mint a fresh wallet + session token. Free, no payment.\n\nReturns the wallet (the agent keeps its own secret), a session_token, the\nlist of free tools it can call immediately, and pointers to the next two\ncalls. Designed so an agent goes from zero to a free tool call without any\nhuman step.","operationId":"register_agent_v1_agent_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/ledger.json":{"get":{"summary":"Ledger Json","description":"Machine-readable flagship run history.","operationId":"ledger_json_ledger_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/flagship/run":{"post":{"summary":"Flagship Ingest","description":"Ingest a flagship run summary (plan, regime, verdicts, receipt, note).\n\nSecret-gated (X-Flagship-Secret must match FLAGSHIP_INGEST_SECRET). The\ngateway holds the Supabase creds and does the write so the agent stays a\ncredential-free HTTP customer. 404 when the secret is unset (feature off).","operationId":"flagship_ingest_v1_flagship_run_post","parameters":[{"name":"x-flagship-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Flagship-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/ledger":{"get":{"summary":"Ledger Page","description":"Public flagship receipt ledger — self-contained HTML.","operationId":"ledger_page_ledger_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/mcp":{"get":{"summary":"Mcp Proxy","operationId":"mcp_proxy_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]},"post":{"summary":"Mcp Proxy","operationId":"mcp_proxy_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]},"delete":{"summary":"Mcp Proxy","operationId":"mcp_proxy_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/scores.json":{"get":{"summary":"Scores Json","description":"Public delivery scores — the Prober's findings (AGE-20 stage 1).\n\nOne row per probed x402 service: delivery rate/factor over the 30d\nwindow, p50 latency, rail labels (MPP/USDG), flags, last-known price,\nand the human why line verified_route shows. The raw probe evidence\nstays private (tx hash + response snapshots back every negative flag);\nthese scores are the public asset. No-store: reflect fresh sweeps.","operationId":"scores_json_scores_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/probes":{"get":{"summary":"Probes Page","description":"Public delivery-scores leaderboard — the human surface for /scores.json.\n\nThe full table is built client-side from /scores.json, which crawlers\nwithout JS see as an empty shell. So the #board div is seeded SERVER-side\nwith a plain link list to every /s/ page — that's the crawl path that\nmakes the 52 per-service SEO pages discoverable by internal link, not\njust sitemap. The JS overwrites it with the rich table on load.","operationId":"probes_page_probes_get","responses":{"200":{"description":"Successful Response"}},"security":[]}},"/s/{slug}":{"get":{"summary":"Service Page","description":"Per-service public page (AGE-39) — the SEO surface for one probed\nx402 service. SERVER-rendered on purpose: /probes builds its table\nclient-side, which crawlers without JS see as an empty shell (the exact\ntrap that kept competitors' pages ranking while ours didn't). Everything\na search engine needs — title, description, canonical, the delivery\nevidence itself — is in the HTML we return here.","operationId":"service_page_s__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/prober/run":{"post":{"summary":"Prober Ingest","description":"Ingest one prober sweep: {\"probes\": [...], \"run\": {...}?}.\n\nReturns what was stored plus the rebuilt window scores, so the runner's\nlogs show the authoritative (history-joined) numbers, not just its own\nrun. Best-effort storage: 200 when fully stored, 202 when accepted but\nnot (fully) stored — the prober never fails its run over storage.","operationId":"prober_ingest_v1_prober_run_post","parameters":[{"name":"x-flagship-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Flagship-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}}},"components":{"schemas":{"AgentRegisterRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"network":{"type":"string","title":"Network","default":"stellar"},"max_spend":{"type":"string","title":"Max Spend","default":"0.10"}},"type":"object","title":"AgentRegisterRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PlanEstimateRequest":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/PlanStep"},"type":"array","maxItems":100,"title":"Steps"},"budget":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget"}},"type":"object","required":["steps"],"title":"PlanEstimateRequest"},"PlanStep":{"properties":{"tool":{"type":"string","title":"Tool"},"params":{"type":"object","title":"Params"}},"type":"object","required":["tool"],"title":"PlanStep"},"RadarVerifyRequest":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"},"payment_id":{"type":"string","title":"Payment Id"},"payer":{"type":"string","title":"Payer"},"developer":{"type":"string","title":"Developer"},"amount_usdc":{"type":"string","title":"Amount Usdc"},"chain":{"type":"string","title":"Chain","default":"arbitrum-sepolia"}},"type":"object","required":["tx_hash","payment_id","payer","developer","amount_usdc"],"title":"RadarVerifyRequest"},"RegisterToolRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"endpoint":{"type":"string","title":"Endpoint"},"price_usdc":{"type":"string","title":"Price Usdc"},"developer_address":{"type":"string","title":"Developer Address"},"parameters":{"type":"object","title":"Parameters"},"category":{"type":"string","title":"Category","default":"data"}},"type":"object","required":["name","description","endpoint","price_usdc","developer_address","parameters"],"title":"RegisterToolRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}