{"openapi":"3.1.0","info":{"title":"agent-tools.cloud — x402 service directory + MCP discovery","description":"Free directory and discovery layer for x402 paid APIs and MCP services. Agents can search the indexed ecosystem, ask for intent-level recommendations, retrieve service cards with payment/call/quality metadata, browse categories, scan any MCP server for malware / prompt-injection before connecting, submit services for review, or connect via the ungated MCP discovery server at /mcp-discovery. The previously hosted paid Qwen relay and crypto verticals were retired on 2026-05-25; this host no longer serves paid endpoints.","version":"0.3.0","x-guidance":"Use POST /api/v1/ask for intent-level recommendations grounded in indexed directory candidates. Use GET /api/v1/search?q=&category=&chain= for faceted retrieval, then GET /api/v1/services/{slug} for the agent-readable service card before paying or calling an external service. GET /api/v1/categories and /api/v1/stats expose facets and health. POST /mcp-discovery/ is an ungated MCP streamable-http server with search, ask_services, get, list_categories, stats, scan_mcp_safety (malware / prompt-injection check for any MCP endpoint) and register. agent-tools.cloud itself is discovery-only; paid relay routes were retired. Every indexed resource (x402 service, MCP server, A2A agent) carries a liveness `health_status`: `ok` = answered a live probe and is callable; `degraded` = reachable but needs caller auth/credentials or paywalled (401/402/403); `down` = unreachable/5xx; `unknown` = not yet probed. Filter any search with health= and read health_status/http_status/latency_ms per result; results rank ok > degraded > unknown > down."},"paths":{"/health":{"get":{"summary":"Healthz","operationId":"healthz_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Healthz Health Get"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/.well-known/x402":{"get":{"summary":"Well Known X402","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Well Known X402  Well Known X402 Get"}}}}}}},"/.well-known/mcp.json":{"get":{"tags":["discovery"],"summary":"Well Known Mcp","description":"Lightweight MCP discovery doc — points clients to stdio + streamable-http.","operationId":"well_known_mcp__well_known_mcp_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Well Known Mcp  Well Known Mcp Json Get"}}}}}}},"/.well-known/agent.json":{"get":{"tags":["discovery"],"summary":"Well Known Agent Card","description":"A2A Agent Card for agent-tools.cloud itself.","operationId":"well_known_agent_card__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Well Known Agent Card  Well Known Agent Json Get"}}}}}}},"/.well-known/agent-card.json":{"get":{"tags":["discovery"],"summary":"Well Known Agent Card","description":"A2A Agent Card for agent-tools.cloud itself.","operationId":"well_known_agent_card__well_known_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Well Known Agent Card  Well Known Agent Card Json Get"}}}}}}},"/a2a":{"post":{"tags":["a2a"],"summary":"A2A Jsonrpc","description":"Minimal A2A JSON-RPC endpoint (message/send).","operationId":"a2a_jsonrpc_a2a_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/search":{"get":{"tags":["directory"],"summary":"Api Search","description":"Agent-friendly search across the x402 service directory.","operationId":"api_search_api_v1_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text query.","title":"Q"},"description":"Free-text query."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. \"base\", \"solana\"","title":"Chain"},"description":"e.g. \"base\", \"solana\""},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"health","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`.","title":"Health"},"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(default|relevance|quality|newest|name)$","description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name.","default":"default","title":"Sort"},"description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/services/{slug}":{"get":{"tags":["directory"],"summary":"Api Service","operationId":"api_service_api_v1_services__slug__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"}}}}}}},"/api/v1/ask":{"post":{"tags":["directory"],"summary":"Api Ask","description":"Ask for the best x402/MCP services for an intent.\n\nThe endpoint retrieves directory candidates first, then asks the configured\nLLM to rank only those candidates. If the LLM is unavailable, it returns a\ndeterministic directory-ranked fallback.","operationId":"api_ask_api_v1_ask_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["directory"],"summary":"Api Ask Get","operationId":"api_ask_get_api_v1_ask_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":800,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"max_price_usd","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Price Usd"}},{"name":"require_healthy","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Require Healthy"}},{"name":"use_llm","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Use Llm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/categories":{"get":{"tags":["directory"],"summary":"Api Categories","operationId":"api_categories_api_v1_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/a2a/search":{"get":{"tags":["a2a"],"summary":"Api A2A Search","operationId":"api_a2a_search_api_v1_a2a_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Q"}},{"name":"health","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`.","title":"Health"},"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`."},{"name":"x402_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"X402 Only"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(default|relevance|quality|newest|name)$","description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name.","default":"default","title":"Sort"},"description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/a2a/agents/{slug}":{"get":{"tags":["a2a"],"summary":"Api A2A Agent","operationId":"api_a2a_agent_api_v1_a2a_agents__slug__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"}}}}}}},"/api/v1/a2a/stats":{"get":{"tags":["a2a"],"summary":"Api A2A Stats","operationId":"api_a2a_stats_api_v1_a2a_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/mcp/search":{"get":{"tags":["mcp"],"summary":"Api Mcp Search","description":"Search MCP servers.\n\nUnions the standalone MCP directory (PulseMCP / official registry import)\nwith x402 services that also expose an mcp_url.","operationId":"api_mcp_search_api_v1_mcp_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Q"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"health","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`.","title":"Health"},"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(default|relevance|quality|newest|name)$","description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name.","default":"default","title":"Sort"},"description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/stats":{"get":{"tags":["mcp"],"summary":"Api Mcp Stats","operationId":"api_mcp_stats_api_v1_mcp_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/mcp/servers/{slug}":{"get":{"tags":["mcp"],"summary":"Api Mcp Server","operationId":"api_mcp_server_api_v1_mcp_servers__slug__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"}}}}}}},"/api/v1/resources/search":{"get":{"tags":["directory"],"summary":"Api Resources Search","description":"Unified search across x402 services, MCP servers and A2A agents.","operationId":"api_resources_search_api_v1_resources_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Q"}},{"name":"protocol","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(x402|mcp|a2a)$"},{"type":"null"}],"title":"Protocol"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"health","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`.","title":"Health"},"description":"Filter by liveness from the most recent probe. One of: `ok` — the endpoint answered a live probe. For MCP, a successful `initialize` handshake counts as ok, and so does an intentional 401/402/403 auth challenge (BYO API key / OAuth / paid access), because the remote server is reachable and credential-gated rather than broken; `degraded` — reachable but the probe could not fully complete for a non-auth reason, such as a protocol/method mismatch or other 4xx reply to the MCP probe; `down` — unreachable, timed out, or returned 5xx; `unknown` — not probed yet. Omit to include every status. Results are always ranked ok > degraded > unknown > down. The same value is returned per result as `health_status`, alongside `http_status` and `latency_ms`."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(default|relevance|quality|newest|name)$","description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name.","default":"default","title":"Sort"},"description":"Result order: default (existing health-and-demand ranking), relevance (text relevance; falls back to default without q), quality, newest, or name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export":{"get":{"tags":["directory"],"summary":"Api Export","description":"Keyset-paginated bulk export of the public catalogue.\n\nRanked search caps `offset`; use this to walk the whole catalogue cheaply.\nPass the returned `next_after_id` back as `after_id` until `count` is 0.","operationId":"api_export_api_v1_export_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","pattern":"^(x402|mcp|a2a)$","default":"mcp","title":"Kind"}},{"name":"after_id","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Return rows with id greater than this.","default":0,"title":"After Id"},"description":"Return rows with id greater than this."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/broker/recommend":{"get":{"tags":["directory"],"summary":"Api Broker Recommend","description":"Discovery + scoring broker: rank payable x402 endpoints for an intent.\n\nDoes not settle payments; returns call_hint + pay_hint per recommendation.","operationId":"api_broker_recommend_api_v1_broker_recommend_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":800,"title":"Q"}},{"name":"max_price_usd","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Price Usd"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"require_healthy","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Require Healthy"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats":{"get":{"tags":["directory"],"summary":"Api Stats","operationId":"api_stats_api_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/submit":{"post":{"tags":["directory"],"summary":"Submit a service for listing","description":"Submit a new x402 service. This endpoint only *creates* listings; re-submitting a URL that is already listed returns `already_listed` and changes nothing.\n\nTo correct an existing listing, verify control of its domain and edit it: in a browser at <https://agent-tools.cloud/account>, or from code with `POST /api/v1/keys` -> `POST /api/v1/claims` -> `PATCH /api/v1/listings/{kind}/{slug}` (https://agent-tools.cloud/docs/claim).","operationId":"api_submit_api_v1_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys":{"post":{"tags":["ownership"],"summary":"Api Mint Key","description":"Mint an API key. No credentials needed, because a key alone grants nothing.\n\nEvery edit still goes through a verified claim on the host that serves the\nlisting, so an unclaimed key can do exactly two things: read its own empty\naccount, and open a claim.","operationId":"api_mint_key_api_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/KeyRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims":{"post":{"tags":["ownership"],"summary":"Api Open Claim","description":"Open a claim on a host. Returns the token to publish there.","operationId":"api_open_claim_api_v1_claims_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/{claim_id}/verify":{"post":{"tags":["ownership"],"summary":"Api Verify Claim","description":"Check that the token is live on the host, and hand over the listings.","operationId":"api_verify_claim_api_v1_claims__claim_id__verify_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/{kind}/{slug}":{"get":{"tags":["ownership"],"summary":"Api Get Listing","description":"Read a listing you own, in the shape PATCH expects back.","operationId":"api_get_listing_api_v1_listings__kind___slug__get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"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"}}}}}},"patch":{"tags":["ownership"],"summary":"Api Patch Listing","description":"Edit a listing you own. Send only the fields you want to change.\n\nPATCH rather than PUT because the crawler keeps writing the columns you do\nnot own; a full replacement would silently revert them.","operationId":"api_patch_listing_api_v1_listings__kind___slug__patch","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/submit":{"post":{"tags":["mcp"],"summary":"Api Submit Mcp","description":"Index a single MCP server by its streamable-http endpoint URL.\n\nOnce a listing's owner has verified control of the domain it serves, this\nendpoint returns 409 `owner_verified` instead of changing it, and the\nresponse carries the URL to edit it through. Listings with no verified\nowner are unaffected.","operationId":"api_submit_mcp_api_v1_mcp_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSubmissionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/a2a/submit":{"post":{"tags":["a2a"],"summary":"Api Submit A2A","description":"Index an A2A agent by fetching its well-known Agent Card.\n\nOnce a listing's owner has verified control of the domain it serves, this\nendpoint returns 409 `owner_verified` instead of changing it, and the\nresponse carries the URL to edit it through. Listings with no verified\nowner are unaffected.","operationId":"api_submit_a2a_api_v1_a2a_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A2ASubmissionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/agent-tools.json":{"get":{"tags":["discovery"],"summary":"Well Known","operationId":"well_known__well_known_agent_tools_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"A2ASubmissionPayload":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"contact":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Contact"}},"type":"object","required":["url","contact"],"title":"A2ASubmissionPayload"},"AskPayload":{"properties":{"query":{"type":"string","maxLength":800,"minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Limit","default":5},"candidate_limit":{"type":"integer","maximum":50.0,"minimum":5.0,"title":"Candidate Limit","default":30},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"max_price_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Price Usd"},"require_healthy":{"type":"boolean","title":"Require Healthy","default":true},"min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Min Confidence"},"has_mcp":{"type":"boolean","title":"Has Mcp","default":false},"use_llm":{"type":"boolean","title":"Use Llm","default":true}},"type":"object","required":["query"],"title":"AskPayload"},"ClaimRequest":{"properties":{"host":{"type":"string","maxLength":253,"minLength":3,"title":"Host"},"method":{"type":"string","title":"Method","default":"wellknown_file"},"contact":{"anyOf":[{"type":"string","maxLength":200,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"},{"type":"null"}],"title":"Contact"}},"type":"object","required":["host"],"title":"ClaimRequest"},"ClaimVerifyRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":8,"title":"Token"}},"type":"object","required":["token"],"title":"ClaimVerifyRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"KeyRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Name"}},"type":"object","title":"KeyRequest"},"McpSubmissionPayload":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"transport":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Transport"},"contact":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Contact"}},"type":"object","required":["url","contact"],"title":"McpSubmissionPayload"},"SubmissionPayload":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"chains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Chains"},"price_usdc":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Usdc"},"contact":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Contact"}},"type":"object","required":["name","url","contact"],"title":"SubmissionPayload"},"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"}}}}