{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"mcp.uneed.best API — compiled by Unbrowse","version":"2026.09.22.1","summary":"Call mcp.uneed.best's own capabilities over HTTP, without a browser.","description":"The first-party capabilities of mcp.uneed.best, compiled from the site's own requests. Each tool is one POST with its inputs as a JSON body; the answer is the run, with the site's result when it is verified. Only verified results bill. The same tools are an MCP server at https://unbrowse.ai/api/v1/sites/mcp.uneed.best/mcp. Unofficial: not made or endorsed by mcp.uneed.best.","contact":{"name":"Unbrowse","url":"https://unbrowse.ai"}},"externalDocs":{"description":"Calling an indexed website","url":"https://unbrowse.ai/docs/site-apis"},"servers":[{"url":"https://unbrowse.ai","description":"Unbrowse"}],"security":[{"bearer":[]}],"tags":[{"name":"mcp.uneed.best","description":"Tools compiled from mcp.uneed.best"}],"paths":{"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_products_for_sale":{"post":{"operationId":"mcp_uneed_best__mcp_list_products_for_sale","summary":"Products for sale","description":"Use this when the user wants to buy a SaaS, micro SaaS or side project, or asks which businesses are for sale. Lists products their makers put up for acquisition on uneed.best, newest listing first, with asking price and trailing twelve-month revenue and profit when the maker disclosed them. Optionally filter by category, maximum price or minimum revenue, and include recently sold ones for comparables. Use get_product on a slug for the full profile; buyers contact the seller from the product page on uneed.best. The site's own MCP tool list_products_for_sale (https://mcp.uneed.best/mcp). Inputs: include_sold (optional) e.g. false; limit (optional) e.g. 20. Returns listings. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"include_sold":{"type":"boolean","description":"Also return recently sold products (price and listing date only, no financials) as comparables","examples":[false],"default":false},"limit":{"type":"integer","description":"limit","examples":[20],"default":20},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":[],"additionalProperties":false},"example":{"include_sold":"{\"include_sold\":false,\"limit\":20}","limit":20}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"listings":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"uneed_url":{"type":"string"},"url":{"type":"string"},"logo":{"type":"string"},"category":{"type":"string"},"pricing":{"type":"string"},"on_sale":{"type":"boolean"},"sold":{"type":"boolean"},"sale_price":{"type":["integer","null"]},"sale_listed_at":{"type":"string"},"ttm_revenue":{"type":"integer"},"ttm_profit":{"type":["integer","null"]},"revenue_multiple":{"type":["null","integer","number"]}},"required":["name","slug","description","uneed_url","url","logo","category","pricing","on_sale","sold","sale_price","sale_listed_at","ttm_revenue","ttm_profit","revenue_multiple"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_products_for_sale' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"include_sold\":\"{\\\"include_sold\\\":false,\\\"limit\\\":20}\",\"limit\":20}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_list_products_for_sale\", {\n  include_sold: \"{\\\"include_sold\\\":false,\\\"limit\\\":20}\",\n  limit: 20,\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_products_for_sale\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"include_sold\": \"{\\\"include_sold\\\":false,\\\"limit\\\":20}\",\n        \"limit\": 20,\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_list_products_for_sale","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_trending":{"post":{"operationId":"mcp_uneed_best__mcp_get_trending","summary":"Community rankings","description":"Use this when the user asks what is trending, popular or winning on uneed.best. Returns the community-voted rankings for a period: 'daily' | 'weekly' | 'monthly' | 'yearly'. Rankings cover products LAUNCHED in the period, ordered purely by summed community vote value — paid placement is not a factor; weeks are ISO weeks (Monday-Sunday) anchored to America/Los_Angeles, the launch timezone. Pass date (YYYY-MM-DD) to get the period containing that date (e.g. a past week's winners); omit it for the current period. Each entry's `rank` is its position in the leaderboard. The site's own MCP tool get_trending (https://mcp.uneed.best/mcp). Inputs: period e.g. \"daily\"; limit (optional) e.g. 20. Returns period, date, ranking. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"period":{"type":"string","description":"period","examples":["daily"]},"limit":{"type":"integer","description":"limit","examples":[20],"default":20},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":["period"],"additionalProperties":false},"example":{"period":"{\"period\":\"daily\",\"limit\":20}","limit":20}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"period":{"type":"string"},"date":{"type":"string"},"ranking":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"uneed_url":{"type":"string"},"logo":{"type":"string"},"category":{"type":"string"},"pricing":{"type":"string"},"rate":{"type":"number"},"premium":{"type":"boolean"},"launch_date":{"type":"string"},"vote_count":{"type":"integer"},"vote_value_sum":{"type":"integer"}},"required":["rank","name","slug","description","url","uneed_url","logo","category","pricing","rate","premium","launch_date","vote_count","vote_value_sum"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_trending' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"period\":\"{\\\"period\\\":\\\"daily\\\",\\\"limit\\\":20}\",\"limit\":20}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_get_trending\", {\n  period: \"{\\\"period\\\":\\\"daily\\\",\\\"limit\\\":20}\",\n  limit: 20,\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_trending\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"period\": \"{\\\"period\\\":\\\"daily\\\",\\\"limit\\\":20}\",\n        \"limit\": 20,\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_get_trending","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_recent_launches":{"post":{"operationId":"mcp_uneed_best__mcp_get_recent_launches","summary":"Recent launches","description":"Use this when the user asks what is new or what launched recently. Lists the most recent product launches on uneed.best, newest first, optionally filtered by category (slug or name, see list_categories) and/or tag slug. Ordered strictly by launch date — paid placement is not a factor. Combine with get_trending to know which of them the community voted up. The site's own MCP tool get_recent_launches (https://mcp.uneed.best/mcp). Inputs: limit (optional) e.g. 20. Returns launches. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","description":"limit","examples":[20],"default":20},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":[],"additionalProperties":false},"example":{"limit":"{\"limit\":20}"}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"launches":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"rich_description":{"type":"string"},"url":{"type":"string"},"uneed_url":{"type":"string"},"logo":{"type":"string"},"images":{"type":"null"},"category":{"type":"string"},"pricing":{"type":"string"},"rate":{"type":"integer"},"premium":{"type":"boolean"},"launch_date":{"type":"string"},"created_at":{"type":"string"},"twitter":{"type":["null","string"]},"bluesky":{"type":["null","string"]},"linkedin":{"type":["null","string"]},"github":{"type":["null","string"]},"instagram":{"type":["null","string"]},"facebook":{"type":["null","string"]},"youtube":{"type":["null","string"]},"open_source":{"type":"boolean"},"repo_url":{"type":"null"},"tiktok":{"type":"null"},"domain_rating":{"type":"null"},"on_sale":{"type":"boolean"},"sold":{"type":"boolean"},"sale_price":{"type":"null"},"sale_listed_at":{"type":"null"},"ttm_revenue":{"type":"null"},"ttm_profit":{"type":"null"}},"required":["name","slug","description","rich_description","url","uneed_url","logo","images","category","pricing","rate","premium","launch_date","created_at","twitter","bluesky","linkedin","github","instagram","facebook","youtube","open_source","repo_url","tiktok","domain_rating","on_sale","sold","sale_price","sale_listed_at","ttm_revenue","ttm_profit"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_recent_launches' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"limit\":\"{\\\"limit\\\":20}\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_get_recent_launches\", {\n  limit: \"{\\\"limit\\\":20}\",\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_get_recent_launches\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"limit\": \"{\\\"limit\\\":20}\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_get_recent_launches","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_search_products":{"post":{"operationId":"mcp_uneed_best__mcp_search_products","summary":"Search products","description":"Use this when the user is looking for a digital tool or product by need, keyword or name. Searches uneed.best's directory of thousands of tools (SaaS, AI, dev, design, marketing...) with full-text and typo-tolerant matching over names, descriptions and tags. Results are ordered by relevance and popularity only — paid placement never affects the order here. `premium: true` on a result means that product pays for featured placement on the Uneed website; surface it as a disclosure, not as a quality signal. Use a result's slug with get_product for the full profile, deals and community stats. The site's own MCP tool search_products (https://mcp.uneed.best/mcp). Inputs: query e.g. \"email marketing\"; limit (optional) e.g. 10. Returns query, results. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"Search terms, e.g. \"email marketing\" or a product name","examples":["email marketing"]},"limit":{"type":"integer","description":"limit","examples":[10],"default":10},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":["query"],"additionalProperties":false},"example":{"query":"{\"query\":\"email marketing\",\"limit\":10}","limit":10}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"uneed_url":{"type":"string"},"logo":{"type":"string"},"category":{"type":"string"},"premium":{"type":"boolean"}},"required":["name","slug","description","url","uneed_url","logo","category","premium"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_search_products' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"query\":\"{\\\"query\\\":\\\"email marketing\\\",\\\"limit\\\":10}\",\"limit\":10}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_search_products\", {\n  query: \"{\\\"query\\\":\\\"email marketing\\\",\\\"limit\\\":10}\",\n  limit: 10,\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_search_products\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"query\": \"{\\\"query\\\":\\\"email marketing\\\",\\\"limit\\\":10}\",\n        \"limit\": 10,\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_search_products","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_deals":{"post":{"operationId":"mcp_uneed_best__mcp_list_deals","summary":"Active deals","description":"Use this when the user asks about discounts, promo codes or deals on digital products. Lists the active offers published by makers on uneed.best, each attached to the product it applies to (name, slug, URL, category). Optionally filter by category. Use get_product on a deal's slug for the full product profile. The site's own MCP tool list_deals (https://mcp.uneed.best/mcp). No inputs. Returns deals. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"deals":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"discount":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string"},"uneed_url":{"type":"string"},"logo":{"type":"string"},"category":{"type":"string"}},"required":["code","discount","name","slug","url","uneed_url","logo","category"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_deals' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_list_deals\", {});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_deals\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={},\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_list_deals","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_categories":{"post":{"operationId":"mcp_uneed_best__mcp_list_categories","summary":"List categories","description":"Use this when you need the valid category values before filtering, or when the user asks what Uneed covers. Lists uneed.best's product categories with their slug, description and number of listed products. Feed the slug or name to the get_recent_launches and list_deals filters. The site's own MCP tool list_categories (https://mcp.uneed.best/mcp). No inputs. Returns categories. Read-only on mcp.uneed.best.","tags":["mcp.uneed.best"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"tool_count":{"type":"integer"}},"required":["name","slug","description","tool_count"]}}},"required":[]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_categories' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"mcp.uneed.best\", \"mcp_uneed_best__mcp_list_categories\", {});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/mcp.uneed.best/call/mcp_uneed_best__mcp_list_categories\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={},\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.mcp_uneed_best.mcp_list_categories","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An Unbrowse API key (ub_live_…, from https://unbrowse.ai/app/keys) or an OAuth access token."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Makes a retry safe: a repeat with the same key returns the same run instead of starting another."},"Deadline":{"name":"x-unbrowse-deadline-ms","in":"header","required":false,"schema":{"type":"integer","minimum":5000,"maximum":300000,"default":60000},"description":"Answer within this many ms; past it 504 run_timeout (the run keeps going). Same as deadlineMs in the body."},"EndUser":{"name":"X-Unbrowse-End-User","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"With an org key: run as this end user, in their own workspace with their own logins."}},"schemas":{"Run":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable, e.g. not_found, unknown_argument, quota_exceeded, run_timeout"},"message":{"type":"string","description":"What happened and what to do, in plain words"}},"additionalProperties":true}},"additionalProperties":true},"RunTimeout":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","runId","poll"],"properties":{"code":{"type":"string","const":"run_timeout"},"message":{"type":"string"},"runId":{"type":"string"},"deadlineMs":{"type":"integer"},"poll":{"type":"string","description":"GET this to read the run's answer when it lands"}},"additionalProperties":true}},"additionalProperties":true}}}}