{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"alternativeto.net API — compiled by Unbrowse","version":"2026.09.28","summary":"Call alternativeto.net's own capabilities over HTTP, without a browser.","description":"The first-party capabilities of alternativeto.net, 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/alternativeto.net/mcp. Unofficial: not made or endorsed by alternativeto.net.","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":"alternativeto.net","description":"Tools compiled from alternativeto.net"}],"paths":{"/api/v1/sites/alternativeto.net/call/alternativeto_net__get_browse_search":{"post":{"operationId":"alternativeto_net__get_browse_search","summary":"Search software on AlternativeTo","description":"Search software on AlternativeTo. Compiled from alternativeto.net's own requests and shared by an Unbrowse user. Inputs: query. Returns the page's title, readable text and links. Read-only on alternativeto.net.","tags":["alternativeto.net"],"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":"query (typed during “fill Search”)"},"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}}}},"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":{"title":{"type":"string"},"text":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"href":{"type":"string"}},"required":["text","href"]}}},"required":["title","text","links"]},"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/alternativeto.net/call/alternativeto_net__get_browse_search' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"query\":\"<query>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"alternativeto.net\", \"alternativeto_net__get_browse_search\", {\n  query: \"<query>\",\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/alternativeto.net/call/alternativeto_net__get_browse_search\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"query\": \"<query>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.alternativeto_net.get_browse_search","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.28"}},"/api/v1/sites/alternativeto.net/call/alternativeto_net__post_indexes_queries_2":{"post":{"operationId":"alternativeto_net__post_indexes_queries_2","summary":"Search alternativeto","description":"Search alternativeto. Compiled from alternativeto.net's own requests and shared by an Unbrowse user. Inputs: query. Returns results. Read-only on alternativeto.net.","tags":["alternativeto.net"],"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":"query (typed during “fill Search”)"},"x_algolia_agent":{"type":"string","description":"Optional: the site's own x_algolia_agent parameter (post_indexes_queries_2). Left out, \"Algolia for JavaScript (5.59.0); Lite (5.59.0); Browser\" is sent, as recorded.","default":"Algolia for JavaScript (5.59.0); Lite (5.59.0); Browser"},"x_algolia_application_id":{"type":"string","description":"Optional: the site's own x_algolia_application_id parameter (post_indexes_queries_2). Left out, \"ZIDPNS2VB0\" is sent, as recorded.","default":"ZIDPNS2VB0"},"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}}}},"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":{"results":{"type":"array","items":{"type":"object","properties":{"hits":{"type":"array","items":{"type":"object","properties":{"alternatives":{"type":"integer"},"nameAliases":{"type":"string"},"creator":{"type":"string"},"likes":{"type":"integer"},"altRank":{"type":"number"},"description":{"type":"string"},"tagLine":{"type":"string"},"tags":{"type":"array"},"isDiscontinued":{"type":"boolean"},"tagLineShort":{"type":"string"},"isDelisted":{"type":"boolean"},"modifiedDate":{"type":"string"},"itemRecentViewCount":{"type":"integer"},"licenseCost":{"type":"string"},"licenseModel":{"type":"string"},"platforms":{"type":"array","items":{"type":"object"}},"id":{"type":"string"},"adSenseBlocked":{"type":"boolean"},"icon":{"type":"object"},"screenshots":{"type":"array","items":{"type":"object"}},"name":{"type":"string"},"urlName":{"type":"string"},"objectID":{"type":"string"},"_highlightResult":{"type":"object"},"isPartnerActive":{"type":"boolean"}},"required":["alternatives","creator","likes","altRank","description","tagLine","tags","isDiscontinued","isDelisted","modifiedDate","itemRecentViewCount","licenseCost","licenseModel","platforms","id","adSenseBlocked","icon","screenshots","name","urlName","objectID","_highlightResult"]}},"nbHits":{"type":"integer"},"page":{"type":"integer"},"nbPages":{"type":"integer"},"hitsPerPage":{"type":"integer"},"exhaustiveNbHits":{"type":"boolean"},"exhaustiveTypo":{"type":"boolean"},"exhaustive":{"type":"object","properties":{"nbHits":{"type":"boolean"},"typo":{"type":"boolean"}},"required":["nbHits","typo"]},"query":{"type":"string"},"params":{"type":"string"},"index":{"type":"string"},"processingTimeMS":{"type":"integer"},"processingTimingsMS":{"type":"object","properties":{"_request":{"type":"object","properties":{"roundTrip":{"type":"integer"}},"required":["roundTrip"]},"fetch":{"type":"object","properties":{"total":{"type":"integer"}},"required":["total"]},"getIdx":{"type":"object","properties":{"load":{"type":"object"},"total":{"type":"integer"}},"required":["load","total"]},"total":{"type":"integer"}},"required":["_request","fetch","getIdx","total"]},"serverTimeMS":{"type":"integer"}},"required":["hits","nbHits","page","nbPages","hitsPerPage","exhaustiveNbHits","exhaustiveTypo","exhaustive","query","params","index","processingTimeMS","processingTimingsMS","serverTimeMS"]}}},"required":["results"]},"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/alternativeto.net/call/alternativeto_net__post_indexes_queries_2' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"query\":\"<query>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"alternativeto.net\", \"alternativeto_net__post_indexes_queries_2\", {\n  query: \"<query>\",\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/alternativeto.net/call/alternativeto_net__post_indexes_queries_2\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"query\": \"<query>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.alternativeto_net.post_indexes_queries_2","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.28"}},"/api/v1/sites/alternativeto.net/call/alternativeto_net__get_items_available_filters":{"post":{"operationId":"alternativeto_net__get_items_available_filters","summary":"Browse apps by category","description":"Browse apps by category. Compiled from alternativeto.net's own requests and shared by an Unbrowse user. No inputs. Returns platformsFilters, featureFilters, licenseFilters, originFilters. Read-only on alternativeto.net.","tags":["alternativeto.net"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","description":"Optional: the site's own category parameter (get_items_available_filters). Left out, \"security\" is sent, as recorded.","default":"security"},"excludeMetatags":{"type":"string","description":"Optional: the site's own excludeMetatags parameter (get_items_available_filters). Left out, \"nsfw-warning,legal-warning,block-as-alternative\" is sent, as recorded.","default":"nsfw-warning,legal-warning,block-as-alternative"},"uriAsBase64":{"type":"string","description":"Optional: the site's own uriAsBase64 parameter (get_items_available_filters). Left out, \"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ==\" is sent, as recorded.","default":"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ=="},"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":{"category":"security","excludeMetatags":"nsfw-warning,legal-warning,block-as-alternative","uriAsBase64":"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ=="}}}},"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":{"platformsFilters":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"urlName":{"type":"string"},"text":{"type":"string"}},"required":["count","urlName","text"]}},"featureFilters":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"urlName":{"type":"string"},"text":{"type":"string"},"type":{"type":"string"}},"required":["count","urlName","text","type"]}},"licenseFilters":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"urlName":{"type":"string"},"text":{"type":"string"},"children":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"urlName":{"type":"string"},"text":{"type":"string"},"children":{"type":"array","items":{"type":"object"}}},"required":["count","urlName","text"]}}},"required":["count","urlName","text"]}},"originFilters":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"urlName":{"type":"string"},"text":{"type":"string"}},"required":["count","urlName","text"]}}},"required":["platformsFilters","featureFilters","licenseFilters","originFilters"]},"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/alternativeto.net/call/alternativeto_net__get_items_available_filters' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"category\":\"security\",\"excludeMetatags\":\"nsfw-warning,legal-warning,block-as-alternative\",\"uriAsBase64\":\"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ==\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"alternativeto.net\", \"alternativeto_net__get_items_available_filters\", {\n  category: \"security\",\n  excludeMetatags: \"nsfw-warning,legal-warning,block-as-alternative\",\n  uriAsBase64: \"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ==\",\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/alternativeto.net/call/alternativeto_net__get_items_available_filters\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"category\": \"security\",\n        \"excludeMetatags\": \"nsfw-warning,legal-warning,block-as-alternative\",\n        \"uriAsBase64\": \"aHR0cHM6Ly9hbHRlcm5hdGl2ZXRvLm5ldC9icm93c2UvYWxsLz9jYXRlZ29yeT1zZWN1cml0eQ==\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.alternativeto_net.get_items_available_filters","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.28"}},"/api/v1/sites/alternativeto.net/call/alternativeto_net__read_page":{"post":{"operationId":"alternativeto_net__read_page","summary":"Read a alternativeto.net software page","description":"Read a alternativeto.net software page. Compiled from alternativeto.net's own requests and shared by an Unbrowse user. Inputs: software. Returns the page's title, readable text and links. Read-only on alternativeto.net.","tags":["alternativeto.net"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"software":{"type":"string","description":"software — the part of the alternativeto.net address that changes"},"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":["software"],"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":{"title":{"type":"string"},"text":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"href":{"type":"string"}},"required":["text","href"]}}},"required":["title","text","links"]},"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/alternativeto.net/call/alternativeto_net__read_page' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"software\":\"<software>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"alternativeto.net\", \"alternativeto_net__read_page\", {\n  software: \"<software>\",\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/alternativeto.net/call/alternativeto_net__read_page\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"software\": \"<software>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.alternativeto_net.read_page","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/alternativeto.net/call/alternativeto_net__render_page":{"post":{"operationId":"alternativeto_net__render_page","summary":"Search apps and software","description":"Search apps and software. Compiled from alternativeto.net's own requests and shared by an Unbrowse user. Inputs: query. Returns the page's title, readable text and links. Read-only on alternativeto.net.","tags":["alternativeto.net"],"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":"query — what to search for on alternativeto.net"},"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}}}},"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":{"title":{"type":"string"},"text":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"href":{"type":"string"}},"required":["text","href"]}},"data":{"type":"object","properties":{"0":{"type":"object","properties":{"P":{"type":"null"},"c":{"type":"array","items":{"type":"string"}},"q":{"type":"string"},"i":{"type":"boolean"},"f":{"type":"array","items":{"type":"array","items":{"type":["array","boolean"]}}},"m":{"type":"string"},"G":{"type":"array","items":{"type":["string","array"]}},"S":{"type":"boolean"},"h":{"type":"null"},"r":{"type":"string"},"s":{"type":"string"},"a":{"type":"string"},"l":{"type":"string"},"p":{"type":"string"},"d":{"type":"string"},"b":{"type":"string"}},"required":["P","c","q","i","f","m","G","S","h","r","s","a","l","p","d","b"]},"5":{"type":"array","items":{"type":"array","items":{"type":["string","null","object"]}}},"10":{"type":"array","items":{"type":["string","null","object"]}},"20":{"type":"array","items":{"type":["string","null","object"]}},"21":{"type":"array","items":{"type":["string","null","object"]}},"22":{"type":"array","items":{"type":["string","null","object"]}},"23":{"type":"array","items":{"type":["string","null","object"]}},"24":{"type":"array","items":{"type":["string","null","object"]}},"25":{"type":"array","items":{"type":["string","null","object"]}},"26":{"type":"array","items":{"type":["string","null","object"]}},"29":{"type":"array","items":{"type":"array","items":{"type":["string","null","object"]}}},"32":{"type":"array","items":{"type":["string","object"]}},"34":{"type":"array","items":{"type":["string","object"]}},"35":{"type":"array","items":{"type":["string","object"]}},"42":{"type":"array","items":{"type":["string","object"]}},"44":{"type":"array","items":{"type":["string","object"]}},"45":{"type":"array","items":{"type":["string","object"]}},"47":{"type":"array","items":{"type":["string","object"]}},"48":{"type":"array","items":{"type":["string","object"]}},"49":{"type":"array","items":{"type":["string","object"]}},"51":{"type":"array","items":{"type":["string","null","object"]}},"53":{"type":"array","items":{"type":["string","null","object"]}},"54":{"type":"array","items":{"type":["string","null","object"]}},"56":{"type":"array","items":{"type":["string","null","object"]}},"58":{"type":"array","items":{"type":["string","null","object"]}},"59":{"type":"array","items":{"type":["string","null","object"]}},"b":{"type":"array","items":{"type":"array","items":{"type":["string","object"]}}},"d":{"type":"array","items":{"type":"array","items":{"type":["string","object"]}}},"1f":{"type":"array","items":{"type":["string","null","object"]}},"2c":{"type":"array","items":{"type":["string","null","object"]}},"3d":{"type":"array","items":{"type":["string","null","object"]}},"3e":{"type":"array","items":{"type":["string","object"]}},"4a":{"type":"array","items":{"type":["string","object"]}},"4b":{"type":"array","items":{"type":["string","object"]}},"4c":{"type":"array","items":{"type":["string","null","object"]}},"4d":{"type":"array","items":{"type":["string","null","object"]}},"4f":{"type":"array","items":{"type":["string","null","object"]}},"5a":{"type":"array","items":{"type":["string","null","object"]}},"5c":{"type":"array","items":{"type":["string","null","object"]}},"5d":{"type":"array","items":{"type":["string","null","object"]}}},"required":["0","5","10","20","21","22","23","24","25","26","29","32","34","35","42","44","45","47","48","49","51","53","54","56","58","59","b","d","1f","2c","3d","3e","4a","4b","4c","4d","4f","5a","5c","5d"]}},"required":["title","text","links","data"]},"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/alternativeto.net/call/alternativeto_net__render_page' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"query\":\"<query>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"alternativeto.net\", \"alternativeto_net__render_page\", {\n  query: \"<query>\",\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/alternativeto.net/call/alternativeto_net__render_page\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"query\": \"<query>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.alternativeto_net.render_page","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}}}}