{"openapi":"3.1.0","info":{"title":"OpenApps API","version":"1.0.0","summary":"What is listed, ranked, featured and launched in the AI app stores (ChatGPT, Claude, Cursor), and the MCP servers they link to.","description":"Read-only and public. Every answer is { data, meta }; meta.basis says what each value is (observed, store_reported, derived, proxy). Links in rows point at https://theopenapps.com. x-openapps-cache: an answer stands until the next crawl, MCP probe or UTC day. Agents: https://theopenapps.com/v1/agent-context, MCP at https://theopenapps.com/mcp.","x-openapps-contract":"98184cef"},"servers":[{"url":"https://theopenapps.com"}],"security":[{},{"DeveloperKey":[]},{"OAuth":["catalog:read"]}],"tags":[{"name":"changes","description":"Typed events since a time: rank moves, chart and featuring entries and exits, launches, MCP toolset changes."},{"name":"movers","description":"What moved at a store's latest crawl: rank movers, featured-list entries and exits, metric changes."},{"name":"stores","description":"The tracked stores with their regions, charts and metrics."},{"name":"freshness","description":"How collection is going: health, crawls per store, the last day's ChatGPT sweeps."},{"name":"charts","description":"Store charts as crawled, with movement against earlier crawls, and ChatGPT charts across countries."},{"name":"featuring","description":"The hand-picked sections of each store's home page."},{"name":"leaderboards","description":"Apps ranked by a store-reported metric such as installs."},{"name":"new","description":"New releases by launch date."},{"name":"apps","description":"Apps, connectors and plugins: search, listings, ranks, metrics, MCP tools and listing versions."},{"name":"market","description":"Store sizes, launches per week and MCP ecosystem statistics."},{"name":"mcp","description":"The MCP servers store listings link to, and their toolsets as OpenApps' anonymous tools/list snapshots saw them."}],"paths":{"/v1/changes":{"get":{"operationId":"changes_list","tags":["changes"],"summary":"A store's changes since a time, newest first: rank moves, chart and featuring entries and exits, launches, new toolsets.","description":"Use for what moved, launched, got featured or changed tools, optionally for given apps, at most 30 days back. Chart events consider each list's top 50; rank_move goes to apps that moved against the others, not to apps shifted by an entry above them.","parameters":[{"name":"store","in":"query","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"region","in":"query","required":false,"description":"ChatGPT: lowercase country code (us, de…; the stores resource lists the crawled ones). Claude: global. Cursor: global, or directory for cursor.directory. Default: the store's main catalog.","schema":{"type":"string","pattern":"^([a-z]{2}|global|directory)$"}},{"name":"since","in":"query","required":false,"description":"Start of the window: ISO-8601, or relative to the newest crawl (-24h, -7d). Default -24h.","schema":{"default":"-24h","type":"string","maxLength":40},"example":"-7d"},{"name":"apps","in":"query","required":false,"description":"1 to 10 app refs '{store}:{plugin_id}', or OpenApps app URLs.","schema":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":300}},"example":["cursor:dir:mcp-linear-11"],"style":"form","explode":false},{"name":"types","in":"query","required":false,"description":"Event types to keep. Default: all.","schema":{"minItems":1,"type":"array","items":{"type":"string","enum":["rank_move","chart_enter","chart_exit","featuring_enter","featuring_exit","launch","toolset_change"]}},"example":["rank_move","chart_enter","toolset_change"],"style":"form","explode":false},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesList"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"changes","x-fern-sdk-method-name":"list","x-openapps-examples":[{"title":"ChatGPT US in the last day","path":"/v1/changes?store=chatgpt"},{"title":"Claude moves and toolset changes this week","path":"/v1/changes?store=claude&since=-7d&types=rank_move%2Cchart_enter%2Ctoolset_change"},{"title":"One Cursor app","path":"/v1/changes?store=cursor&apps=cursor%3Adir%3Amcp-linear-11&since=-3d"}],"x-openapps-basis":{"events[].type":"derived","events[].t":"observed","events[].before":"observed","events[].after":"observed","counts":"derived"},"x-openapps-cache":"crawl_or_probe","x-openapps-mcp":[{"name":"changes_list","title":"What changed in a store","kind":"projection"}]}},"/v1/movers/{store}":{"get":{"operationId":"movers_list","tags":["movers"],"summary":"What moved at a store's latest crawl: rank movers in its lead charts, featured-list entries and exits, metric changes.","description":"Use for a store's headlines now: who climbed, fell or entered its main charts, who joined or left a featured list, whose installs or scores changed. For a window of time, use changes_list.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoversList"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"movers","x-fern-sdk-method-name":"list","x-openapps-examples":[{"title":"ChatGPT","path":"/v1/movers/chatgpt"},{"title":"Claude","path":"/v1/movers/claude"},{"title":"Cursor","path":"/v1/movers/cursor"}],"x-openapps-basis":{"charts[].rows[].position":"observed","charts[].rows[].prev":"observed","charts[].rows[].is_new":"derived","featuring[].entered":"derived","metrics[].rows[].value":"store_reported","metrics[].rows[].change":"derived"},"x-openapps-cache":"crawl"}},"/v1/stores":{"get":{"operationId":"stores_get","tags":["stores"],"summary":"The app stores OpenApps tracks: apps per kind, regions with their latest crawl, charts and metrics.","description":"Use for which stores, regions, charts and metrics exist and how fresh each region is. Chart names here are what charts_get takes.","parameters":[{"name":"store","in":"query","required":false,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoresGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"stores","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"Every store","path":"/v1/stores"},{"title":"Claude only","path":"/v1/stores?store=claude"}],"x-openapps-basis":{"stores[].apps":"observed","stores[].regions[].last_run":"observed"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"stores_get","title":"Stores, regions and charts","kind":"projection"},{"name":"search","title":"Search OpenApps","kind":"composition"}]}},"/v1/freshness":{"get":{"operationId":"freshness_get","tags":["freshness"],"summary":"How collection is going: health status and issues, crawls per store, ChatGPT's 3-hour sweeps over the last day.","description":"Use to judge how fresh the data is or why a region is missing. Measured when asked, never cached. With region, adds that region's latest crawl job.","parameters":[{"name":"region","in":"query","required":false,"description":"ChatGPT: lowercase country code (us, de…; the stores resource lists the crawled ones). Claude: global. Cursor: global, or directory for cursor.directory. Default: the store's main catalog.","schema":{"type":"string","pattern":"^([a-z]{2}|global|directory)$"},"example":"de"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreshnessGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"freshness","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"Collection health","path":"/v1/freshness"},{"title":"Germany's latest crawl job","path":"/v1/freshness?region=de"}],"x-openapps-basis":{"status":"derived","issues":"derived","stores[].runs":"observed","slots[].ok":"observed"},"x-openapps-cache":"none"}},"/v1/charts/{store}/{chart}":{"get":{"operationId":"charts_get","tags":["charts"],"summary":"One store chart now or at a past time, with each app's movement since the previous crawl and the crawl ~24h earlier.","description":"Use for who ranks where in a store list and who moved, entered or dropped. Positions are 1-based. Not a history: one crawl, compared with two earlier ones.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"chart","in":"path","required":true,"description":"Chart name as the stores resource lists it, e.g. category:productivity (ChatGPT), popularity (Claude), directory:top (Cursor).","schema":{"type":"string","minLength":1,"maxLength":120},"example":"popularity"},{"name":"region","in":"query","required":false,"description":"ChatGPT: lowercase country code (us, de…; the stores resource lists the crawled ones). Claude: global. Cursor: global, or directory for cursor.directory. Default: the store's main catalog.","schema":{"type":"string","pattern":"^([a-z]{2}|global|directory)$"},"example":"us"},{"name":"at","in":"query","required":false,"description":"A past time, ISO-8601 or relative (-24h, -7d). Uses the newest crawl at or before it. Omit for the latest.","schema":{"type":"string","maxLength":40},"example":"-24h"},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartsGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"charts","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"Claude's popularity chart now","path":"/v1/charts/claude/popularity"},{"title":"ChatGPT productivity in the US a day ago","path":"/v1/charts/chatgpt/category%3Aproductivity?region=us&at=-24h"},{"title":"ChatGPT productivity in Germany","path":"/v1/charts/chatgpt/category%3Aproductivity?region=de"}],"x-openapps-basis":{"rows[].position":"observed","rows[].prev":"observed","rows[].prev_day":"observed","rows[].is_new":"derived","rows[].launched_at":"derived","dropped":"derived"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"charts_get","title":"Store chart with movement","kind":"projection"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/charts/{store}/{chart}/regions":{"get":{"operationId":"charts_regions_get","tags":["charts"],"summary":"One ChatGPT chart in every country at once: the top apps of the US list with each app's position per country.","description":"Use to compare where a chart differs by country. ChatGPT only (the other stores are one worldwide catalog). Positions are 1-based; null means not in that country's list.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"chart","in":"path","required":true,"description":"Chart name as the stores resource lists it, e.g. category:productivity (ChatGPT), popularity (Claude), directory:top (Cursor).","schema":{"type":"string","minLength":1,"maxLength":120},"example":"category:productivity"},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartsRegionsGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"charts","x-fern-sdk-method-name":"regions_get","x-openapps-examples":[{"title":"ChatGPT productivity by country","path":"/v1/charts/chatgpt/category%3Aproductivity/regions"}],"x-openapps-basis":{"rows[].positions":"observed"},"x-openapps-cache":"crawl"}},"/v1/featuring/{store}":{"get":{"operationId":"featuring_get","tags":["featuring"],"summary":"Every hand-picked section of a store's home page now, each with its apps and their movement since earlier crawls.","description":"Use for what a store features on its home page. Positions are 1-based within each section. Claude's directory has no home sections.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"region","in":"query","required":false,"description":"ChatGPT: lowercase country code (us, de…; the stores resource lists the crawled ones). Claude: global. Cursor: global, or directory for cursor.directory. Default: the store's main catalog.","schema":{"type":"string","pattern":"^([a-z]{2}|global|directory)$"},"example":"de"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturingGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"featuring","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"ChatGPT's home page in the US","path":"/v1/featuring/chatgpt"},{"title":"ChatGPT in Germany","path":"/v1/featuring/chatgpt?region=de"},{"title":"Cursor","path":"/v1/featuring/cursor"}],"x-openapps-basis":{"sections[].rows[].position":"observed","sections[].rows[].prev":"observed","sections[].rows[].is_new":"derived"},"x-openapps-cache":"crawl"}},"/v1/leaderboards/{store}/{metric}":{"get":{"operationId":"leaderboards_get","tags":["leaderboards"],"summary":"A store's apps ranked by one store-reported metric, such as installs, with the value each replaced.","description":"Use for who leads on installs, popularity score or stars. The metrics a store ranks by are in the stores resource; ChatGPT publishes none.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"metric","in":"path","required":true,"description":"Metric name as the stores resource lists it, e.g. installs (Claude), dir_installs (Cursor).","schema":{"type":"string","minLength":1,"maxLength":40},"example":"installs"},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardsGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"leaderboards","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"Claude by installs","path":"/v1/leaderboards/claude/installs"},{"title":"cursor.directory by installs","path":"/v1/leaderboards/cursor/dir_installs"}],"x-openapps-basis":{"rows[].position":"derived","rows[].value":"store_reported","rows[].prev":"store_reported"},"x-openapps-cache":"crawl"}},"/v1/new":{"get":{"operationId":"new_list","tags":["new"],"summary":"A store's apps launched since a time, newest first, by the store's launch date or, without one, the day first seen.","description":"Use for new releases in a store. since reaches back at most 365 days before the newest crawl. ChatGPT rows carry the app's category.","parameters":[{"name":"store","in":"query","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"since","in":"query","required":false,"description":"Start of the window: ISO-8601, or relative to the newest crawl (-24h, -7d). Default -24h.","schema":{"default":"-24h","type":"string","maxLength":40},"example":"-7d"},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewList"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"new","x-fern-sdk-method-name":"list","x-openapps-examples":[{"title":"ChatGPT this week","path":"/v1/new?store=chatgpt&since=-7d"},{"title":"Claude in the last day","path":"/v1/new?store=claude"}],"x-openapps-basis":{"rows[].launched_at":"derived","rows[].first_seen_at":"observed","rows[].category":"observed"},"x-openapps-cache":"crawl"}},"/v1/apps":{"get":{"operationId":"apps_search","tags":["apps"],"summary":"Apps whose name or description contains the query: exact names first, then names starting with it, then other matches.","description":"Use to find an app's ref from its name. Matches text only; it does not rank by popularity.","parameters":[{"name":"query","in":"query","required":true,"description":"Words to find in app names and descriptions.","schema":{"type":"string","minLength":1,"maxLength":200},"example":"notion"},{"name":"store","in":"query","required":false,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"cursor"},{"name":"kind","in":"query","required":false,"description":"app (ChatGPT); connector, plugin, desktop_extension (Claude); plugin, directory_rule, directory_mcp (Cursor).","schema":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]}},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsSearch"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"search","x-openapps-examples":[{"title":"Notion anywhere","path":"/v1/apps?query=notion"},{"title":"Linear in Cursor","path":"/v1/apps?query=linear&store=cursor"}],"x-openapps-basis":{"rows[].name":"observed"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"apps_search","title":"Find apps by name","kind":"projection"},{"name":"search","title":"Search OpenApps","kind":"composition"}]}},"/v1/apps/{store}/{plugin_id}":{"get":{"operationId":"apps_get","tags":["apps"],"summary":"One app's listing: name, kind, publisher, description, launch and first-seen dates, and its other listings in the store.","description":"Use for what an app is. For where it ranks, its metrics or its MCP tools, use apps_ranks_current, apps_metrics or apps_tools.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_01E5qTAcHfq3r1UJ8Zxgzjae"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"A Claude connector","path":"/v1/apps/claude/plugin_01E5qTAcHfq3r1UJ8Zxgzjae"}],"x-openapps-basis":{"app.name":"observed","app.publisher":"observed","app.launched_at":"derived","app.first_seen_at":"observed"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"apps_profile","title":"App profiles","kind":"composition"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/apps/{store}/{plugin_id}/ranks/current":{"get":{"operationId":"apps_ranks_current","tags":["apps"],"summary":"Every chart an app is in now: best position and region, position in the main region, and how many regions list it.","description":"Use for where an app ranks today. Positions are 1-based, from each region's latest crawl.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsRanksCurrent"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"ranks_current","x-openapps-examples":[{"title":"Where a ChatGPT app ranks","path":"/v1/apps/chatgpt/plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e/ranks/current"}],"x-openapps-basis":{"charts[].positions[].position":"observed","charts[].best":"derived","charts[].primary":"observed","charts[].regions":"derived"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"apps_profile","title":"App profiles","kind":"composition"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/apps/{store}/{plugin_id}/ranks":{"get":{"operationId":"apps_ranks_history","tags":["apps"],"summary":"Rank series of every chart an app is in now: 14 days in the chart's home region, the latest position elsewhere.","description":"Use for how an app's positions moved lately. Lists are stored on change, so a point is a change; the last point of a series is carried to its region's latest crawl and marked carried.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsRanksHistory"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"ranks_history","x-openapps-examples":[{"title":"A ChatGPT app's ranks","path":"/v1/apps/chatgpt/plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e/ranks"}],"x-openapps-basis":{"series[].points[].position":"observed","series[].points[].carried":"derived"},"x-openapps-cache":"crawl"}},"/v1/apps/{store}/{plugin_id}/metrics":{"get":{"operationId":"apps_metrics","tags":["apps"],"summary":"An app's latest value of each metric the store publishes, with the value it replaced. Each metric carries its own basis.","description":"Use for installs, popularity scores and GitHub stars. Series change-only: t is when the value last changed.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_01E5qTAcHfq3r1UJ8Zxgzjae"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsMetrics"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"metrics","x-openapps-examples":[{"title":"Claude installs","path":"/v1/apps/claude/plugin_01E5qTAcHfq3r1UJ8Zxgzjae/metrics"}],"x-openapps-basis":{"metrics[].t":"observed","metrics[].prev":"observed"},"x-openapps-cache":"crawl","x-openapps-mcp":[{"name":"apps_profile","title":"App profiles","kind":"composition"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/apps/{store}/{plugin_id}/tools":{"get":{"operationId":"apps_tools","tags":["apps"],"summary":"The MCP servers an app links to, each with the tools of its latest anonymous tools/list.","description":"Use for what an app's MCP server exposes. Servers that need sign-in have status auth and no snapshot.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_01XunKF5gozzaoP55m3XKgUm"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsTools"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"tools","x-openapps-examples":[{"title":"Linear's tools via Claude","path":"/v1/apps/claude/plugin_01XunKF5gozzaoP55m3XKgUm/tools"}],"x-openapps-basis":{"servers[].status":"observed","servers[].snapshot.tools":"observed"},"x-openapps-cache":"crawl_or_probe","x-openapps-mcp":[{"name":"apps_profile","title":"App profiles","kind":"composition"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/apps/{store}/{plugin_id}/versions":{"get":{"operationId":"apps_versions","tags":["apps"],"summary":"Every version of an app's store listing and of its detail record, oldest first, with when each was seen.","description":"Use for when an app's listing changed and what it said. A version is recorded only when the store's record changes. Detail records are tracked for ChatGPT.","parameters":[{"name":"store","in":"path","required":true,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"chatgpt"},{"name":"plugin_id","in":"path","required":true,"description":"The app's id in its store, e.g. plugin_01abc; {store}:{plugin_id} is its ref.","schema":{"type":"string","minLength":1,"maxLength":280},"example":"plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppsVersions"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"apps","x-fern-sdk-method-name":"versions","x-openapps-examples":[{"title":"A ChatGPT app's listing versions","path":"/v1/apps/chatgpt/plugin_asdk_app_69c18c28f1188191bf5b8445c4ab0a2e/versions"}],"x-openapps-basis":{"listing[].data":"observed","detail[].data":"observed","listing[].seen_since":"observed"},"x-openapps-cache":"crawl"}},"/v1/market":{"get":{"operationId":"market_get","tags":["market"],"summary":"Each store's size and shape: apps per kind, weekly launches over a year, list sizes, and open MCP toolset statistics.","description":"Use for market-level questions: how big a store is, how fast it grows, how MCP servers are built. Not per app; use apps_profile.","parameters":[{"name":"store","in":"query","required":false,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"cursor"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"market","x-fern-sdk-method-name":"get","x-openapps-examples":[{"title":"Every store","path":"/v1/market"},{"title":"Cursor","path":"/v1/market?store=cursor"}],"x-openapps-basis":{"stores[].apps":"observed","stores[].launches.weeks[].n":"derived","mcp.by_status":"observed","mcp.cross_store":"derived","mcp.open":"observed"},"x-openapps-cache":"day","x-openapps-mcp":[{"name":"market_get","title":"Store and MCP ecosystem statistics","kind":"projection"}]}},"/v1/mcp/toolsets":{"get":{"operationId":"mcp_toolset_get","tags":["mcp"],"summary":"An MCP server's tools at a time, or what changed between two of its toolset versions: tools added, removed and changed.","description":"Use for an app's or a server's toolset now, at a past time, or against an earlier version. Reads OpenApps' anonymous tools/list snapshots; it never calls the server.","parameters":[{"name":"app","in":"query","required":false,"description":"App ref '{store}:{plugin_id}' as other results return it (e.g. claude:plugin_01abc), or an OpenApps app URL.","schema":{"type":"string","minLength":1,"maxLength":300},"example":"claude:plugin_01XunKF5gozzaoP55m3XKgUm"},{"name":"server","in":"query","required":false,"description":"MCP server URL as an app's tools list it (e.g. https://mcp.linear.app/mcp), or its OpenApps id. Only servers the stores link to.","schema":{"type":"string","minLength":1,"maxLength":500},"example":"https://mcp.linear.app/mcp"},{"name":"at","in":"query","required":false,"description":"A past time, ISO-8601 or relative (-24h, -7d). Uses the newest crawl at or before it. Omit for the latest.","schema":{"type":"string","maxLength":40},"example":"2099-01-01T12:00:00Z"},{"name":"diff_from","in":"query","required":false,"description":"Compare with an earlier toolset: a snapshot hash from history, or a time (ISO-8601 or relative, -7d). Returns what was added, removed and changed.","schema":{"type":"string","minLength":1,"maxLength":80},"example":"-7d"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpToolsetGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"mcp","x-fern-sdk-method-name":"toolset_get","x-openapps-examples":[{"title":"Linear's server now","path":"/v1/mcp/toolsets?server=https%3A%2F%2Fmcp.linear.app%2Fmcp"},{"title":"What changed in Linear's tools this week","path":"/v1/mcp/toolsets?app=claude%3Aplugin_01XunKF5gozzaoP55m3XKgUm&diff_from=-7d"},{"title":"Linear's tools on 1 January 2099","path":"/v1/mcp/toolsets?server=https%3A%2F%2Fmcp.linear.app%2Fmcp&at=2099-01-01T12%3A00%3A00Z"}],"x-openapps-basis":{"servers[].status":"observed","servers[].snapshot.tools":"observed","servers[].diff":"derived","servers[].apps":"observed"},"x-openapps-cache":"crawl_or_probe","x-openapps-mcp":[{"name":"mcp_toolset_get","title":"MCP server toolset and changes","kind":"projection"},{"name":"search","title":"Search OpenApps","kind":"composition"},{"name":"fetch","title":"Fetch an OpenApps result","kind":"composition"}]}},"/v1/mcp/servers":{"get":{"operationId":"mcp_servers_list","tags":["mcp"],"summary":"The remote MCP servers that store listings link to, open ones first, with tool counts and the apps that link each.","description":"Use to browse or count MCP servers by probe status or store. For one server's tools, use mcp_servers_get or mcp_toolset_get.","parameters":[{"name":"status","in":"query","required":false,"description":"MCP server probe result: open (tools/list answers without sign-in), auth, blocked, dead or error.","schema":{"type":"string","enum":["open","auth","blocked","dead","error"]},"example":"open"},{"name":"store","in":"query","required":false,"description":"App store: chatgpt, claude or cursor.","schema":{"type":"string","enum":["chatgpt","claude","cursor"]},"example":"claude"},{"name":"limit","in":"query","required":false,"description":"Rows per page, at most 10000.","schema":{"default":20,"type":"integer","minimum":1,"maximum":10000}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor of the previous page, with the same other inputs.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServersList"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"mcp","x-fern-sdk-method-name":"servers_list","x-openapps-examples":[{"title":"Open servers","path":"/v1/mcp/servers?status=open"},{"title":"Servers Claude links to","path":"/v1/mcp/servers?store=claude"}],"x-openapps-basis":{"rows[].status":"observed","rows[].tool_count":"observed","rows[].stores":"observed"},"x-openapps-cache":"crawl_or_probe"}},"/v1/mcp/servers/{server}":{"get":{"operationId":"mcp_servers_get","tags":["mcp"],"summary":"One MCP server: its probe status, the apps that link to it, its latest toolset with every tool, and its toolset history.","description":"Use for everything about one server by id or URL. For its tools at a past time or a diff between versions, use mcp_toolset_get.","parameters":[{"name":"server","in":"path","required":true,"description":"MCP server URL as an app's tools list it (e.g. https://mcp.linear.app/mcp), or its OpenApps id. Only servers the stores link to.","schema":{"type":"string","minLength":1,"maxLength":500},"example":"https://mcp.linear.app/mcp"}],"responses":{"200":{"description":"{ data, meta }: meta says when the data was crawled (as_of), how fresh it is, and the basis of each field.","headers":{"ETag":{"description":"Changes when the answer does; send it back in If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Fresh until the store's next crawl is due.","schema":{"type":"string"}},"OpenApps-Contract":{"description":"Hash of the API contract that answered.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServersGet"}}}},"304":{"$ref":"#/components/responses/304"},"400":{"$ref":"#/components/responses/400"},"401":{"$ref":"#/components/responses/401"},"403":{"$ref":"#/components/responses/403"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"},"500":{"$ref":"#/components/responses/500"}},"x-fern-sdk-group-name":"mcp","x-fern-sdk-method-name":"servers_get","x-openapps-examples":[{"title":"Linear's server","path":"/v1/mcp/servers/https%3A%2F%2Fmcp.linear.app%2Fmcp"}],"x-openapps-basis":{"server.status":"observed","toolset.tools":"observed","apps":"observed"},"x-openapps-cache":"crawl_or_probe"}}},"components":{"schemas":{"Meta":{"type":"object","properties":{"as_of":{"type":["string","null"]},"run":{"properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"region":{"type":"string"},"started_at":{"type":"string"}},"required":["store","region","started_at"],"type":["object","null"]},"compared_to":{"properties":{"prev":{"type":["string","null"]},"day":{"type":["string","null"]}},"required":["prev","day"],"type":["object","null"]},"freshness":{"properties":{"cadence":{"type":"string"},"next_expected_at":{"type":["string","null"]},"stale":{"type":"boolean"}},"required":["cadence","next_expected_at","stale"],"type":["object","null"]},"basis":{"type":"object","additionalProperties":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"]}},"coverage":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"string"}}},"required":["notes"]},"next_cursor":{"type":["string","null"]},"truncated":{"type":"boolean"},"truncation_reason":{"type":["string","null"]}},"required":["as_of","run","compared_to","freshness","basis","coverage","next_cursor","truncated","truncation_reason"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["bad_request","not_found","method_not_allowed","rate_limited","internal"]},"message":{"type":"string"},"param":{"description":"The input the error is about","type":"string"},"allowed":{"description":"Values the input takes","type":"array","items":{"type":"string"}},"nearest":{"description":"Known values closest to the one given","type":"array","items":{"type":"string"}}},"required":["code","message"]}},"required":["error"]},"AppRow":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"url":{"type":"string"},"short_description":{"type":["string","null"]},"publisher":{"type":["string","null"]},"icon":{"description":"The app's icon on the OpenApps site","type":["string","null"]}},"required":["app","name","kind","store","url","short_description"]},"ChartRow":{"type":"object","properties":{"position":{"type":"integer"},"app":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":"string"},"prev":{"type":["integer","null"]},"prev_day":{"type":["integer","null"]},"is_new":{"type":"boolean"},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"publisher":{"type":["string","null"]},"short_description":{"type":["string","null"]},"launched_at":{"type":["string","null"]},"listing":{"type":"object","additionalProperties":{},"description":"Store-specific listing fields, e.g. Claude tier and surfaces"},"icon":{"description":"The app's icon on the OpenApps site","type":["string","null"]}},"required":["position","app","name","url","prev","prev_day","is_new"]},"ChartInfo":{"type":"object","properties":{"chart":{"type":"string"},"slug":{"type":"string"},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"kind":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"url":{"type":"string"}},"required":["chart","slug","store","kind","title","url"]},"McpTool":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"params":{"type":"array","items":{"type":"string"}},"annotations":{"type":"object","additionalProperties":{}},"input_schema":{"type":"object","additionalProperties":{}}},"required":["name","description","params"]},"ToolsetVersion":{"type":"object","properties":{"hash":{"type":"string"},"server_version":{"type":["string","null"]},"seen_since":{"type":"string"},"seen_until":{"type":"string"},"tool_count":{"type":"integer"}},"required":["hash","server_version","seen_since","seen_until","tool_count"]},"ChangesList":{"type":"object","properties":{"data":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"regions":{"type":"array","items":{"type":"string"}},"since":{"type":"string"},"until":{"type":"string","description":"The newest crawl in the window"},"total":{"type":"integer"},"counts":{"type":"object","propertyNames":{"type":"string","enum":["rank_move","chart_enter","chart_exit","featuring_enter","featuring_exit","launch","toolset_change"]},"additionalProperties":{"type":"integer"},"description":"Events per type over the whole window"},"events":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["rank_move","chart_enter","chart_exit","featuring_enter","featuring_exit","launch","toolset_change"]},"t":{"type":"string","description":"When it was observed: the crawl, the launch time, or when the new toolset was first seen"},"app":{"type":"string"},"name":{"type":["string","null"]},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"region":{"description":"null for store-wide events (launch, toolset_change)","type":["string","null"]},"chart":{"type":"string"},"server":{"type":"string"},"before":{"description":"Position (1-based) before, or the earlier toolset; null when not listed","additionalProperties":{},"type":["integer","object","null"]},"after":{"description":"Position after, or the new toolset (hash; tool, prompt and resource counts) with tools added, removed and changed","additionalProperties":{},"type":["integer","object","null"]},"url":{"type":"string"}},"required":["type","t","app","name","store","region","before","after","url"]}}},"required":["store","regions","since","until","total","counts","events"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"MoversList":{"type":"object","properties":{"data":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"region":{"type":"string","description":"The store's main region, which movement is measured in"},"charts":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"slug":{"type":"string"},"title":{"type":["string","null"]},"region":{"type":"string"},"url":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ChartRow"},"description":"Rows that moved, biggest move first; a product shows once across the charts"}},"required":["chart","slug","title","region","url","rows"]}},"featuring":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"slug":{"type":"string"},"title":{"type":["string","null"]},"entered":{"type":"array","items":{"$ref":"#/components/schemas/AppRow"}},"left":{"type":"array","items":{"$ref":"#/components/schemas/AppRow"}}},"required":["chart","slug","title","entered","left"]},"description":"Entries and exits of the store's featured lists since the previous crawl"},"metrics":{"type":"array","items":{"type":"object","properties":{"metric":{"type":"string"},"title":{"type":"string"},"unit":{"type":"string"},"basis":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"]},"rows":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"url":{"type":"string"},"short_description":{"type":["string","null"]},"publisher":{"type":["string","null"]},"icon":{"description":"The app's icon on the OpenApps site","type":["string","null"]},"value":{"type":"number"},"prev":{"type":"number"},"change":{"type":"number"},"t":{"type":"string"},"prev_t":{"type":["string","null"]}},"required":["app","name","kind","store","url","short_description","value","prev","change","t","prev_t"]},"description":"Apps whose value changed in the metric's latest update, biggest change first"}},"required":["metric","title","unit","basis","rows"]}}},"required":["store","region","charts","featuring","metrics"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"StoresGet":{"type":"object","properties":{"data":{"type":"object","properties":{"stores":{"type":"array","items":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"label":{"type":"string"},"apps":{"type":"integer"},"kinds":{"type":"object","propertyNames":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"additionalProperties":{"type":"integer"}},"url":{"type":"string"},"last_run":{"type":["string","null"]},"regions":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"last_run":{"type":"string"}},"required":["region","last_run"]}},"charts":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"kind":{"type":"string"},"title":{"type":["string","null"]},"url":{"type":"string"}},"required":["chart","kind","title","url"]}},"metrics":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"unit":{"type":"string"},"basis":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"]},"cadence":{"type":"string","description":"How often the store updates it: 3h, daily or weekly"}},"required":["name","unit","basis","cadence"]}}},"required":["store","label","apps","kinds","url","last_run","regions","metrics"]}}},"required":["stores"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"FreshnessGet":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"]},"issues":{"type":"array","items":{"type":"string"}},"checked_at":{"type":"string"},"collector_seen":{"description":"The collector's last poll","type":["string","null"]},"cron":{"properties":{"t":{"type":"string"},"probe":{"type":["string","null"]}},"required":["t","probe"],"type":["object","null"]},"refused_regions":{"type":"array","items":{"type":"string"},"description":"ChatGPT regions the store refused through every relay in the last day"},"exits_24h":{"type":"array","items":{"type":"object","properties":{"provider":{"type":["string","null"]},"tries":{"type":"integer"},"blocked":{"type":"integer"},"regions":{"type":"array","items":{"type":"string"}}},"required":["provider","tries","blocked","regions"]},"description":"Crawl tries per relay provider in the last day"},"stores":{"type":"array","items":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"runs":{"type":"integer","description":"Successful crawls ever"},"last_run":{"type":["string","null"]}},"required":["store","runs","last_run"]}},"slots":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"slot":{"type":"string","description":"UTC date and hour the 3-hour slot starts, e.g. 2026-10-13T09"},"ok":{"type":"boolean"},"failed":{"type":"integer"},"error":{"type":["string","null"]}},"required":["region","slot","ok","failed","error"]},"description":"ChatGPT crawls in the last 24 hours, per region and slot"},"crawl":{"description":"With region: its latest crawl job","properties":{"region":{"type":"string"},"status":{"type":"string"},"requested_at":{"type":"string"},"claimed_at":{"type":["string","null"]},"error":{"type":["string","null"]}},"required":["region","status","requested_at","claimed_at","error"],"type":["object","null"]}},"required":["status","issues","checked_at","collector_seen","cron","refused_regions","exits_24h","stores","slots","crawl"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"ChartsGet":{"type":"object","properties":{"data":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInfo"},"region":{"type":"string"},"total":{"type":"integer"},"dropped":{"type":"integer","description":"Apps gone since the previous crawl"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ChartRow"}}},"required":["chart","region","total","dropped","rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"ChartsRegionsGet":{"type":"object","properties":{"data":{"type":"object","properties":{"chart":{"$ref":"#/components/schemas/ChartInfo"},"regions":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"as_of":{"type":"string","description":"That region's latest crawl"}},"required":["region","as_of"]}},"total":{"type":"integer","description":"Apps in the list the rows follow"},"rows":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"url":{"type":"string"},"icon":{"type":["string","null"]},"positions":{"type":"object","additionalProperties":{"type":["integer","null"]}}},"required":["app","name","url","positions"]}}},"required":["chart","regions","total","rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"FeaturingGet":{"type":"object","properties":{"data":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"region":{"type":"string"},"sections":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"slug":{"type":"string"},"title":{"type":["string","null"]},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ChartRow"}}},"required":["chart","slug","title","rows"]}}},"required":["store","region","sections"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"LeaderboardsGet":{"type":"object","properties":{"data":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"metric":{"type":"string"},"unit":{"type":"string"},"basis":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"]},"cadence":{"type":"string"},"total":{"type":"integer","description":"Apps with a value"},"rows":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"url":{"type":"string"},"short_description":{"type":["string","null"]},"publisher":{"type":["string","null"]},"icon":{"description":"The app's icon on the OpenApps site","type":["string","null"]},"position":{"type":"integer"},"value":{"type":"number"},"prev":{"type":["number","null"]},"t":{"type":"string","description":"When the value last changed"},"prev_t":{"type":["string","null"]}},"required":["app","name","kind","store","url","short_description","position","value","prev","t","prev_t"]}}},"required":["store","metric","unit","basis","cadence","total","rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"NewList":{"type":"object","properties":{"data":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"since":{"type":"string"},"until":{"type":"string","description":"The newest crawl"},"total":{"type":"integer"},"rows":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"url":{"type":"string"},"short_description":{"type":["string","null"]},"publisher":{"type":["string","null"]},"icon":{"description":"The app's icon on the OpenApps site","type":["string","null"]},"launched_at":{"type":["string","null"]},"first_seen_at":{"type":"string"},"category":{"description":"First category list it is in (ChatGPT)","type":["string","null"]}},"required":["app","name","kind","store","url","short_description","launched_at","first_seen_at","category"]}}},"required":["store","since","until","total","rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsSearch":{"type":"object","properties":{"data":{"type":"object","properties":{"rows":{"type":"array","items":{"$ref":"#/components/schemas/AppRow"}}},"required":["rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsGet":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"publisher":{"type":["string","null"]},"short_description":{"type":["string","null"]},"launched_at":{"type":["string","null"]},"first_seen_at":{"type":"string"},"url":{"type":"string"},"also":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"kind":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]}},"required":["app","kind"]},"description":"Other listings of the same product"},"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"plugin_id":{"type":"string"},"version":{"type":["string","null"]},"last_seen_at":{"type":"string"},"icon":{"type":["string","null"]},"listing":{"type":"object","additionalProperties":{}}},"required":["app","name","kind","publisher","short_description","launched_at","first_seen_at","url","also"]}},"required":["app"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsRanksCurrent":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"charts":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"title":{"type":["string","null"]},"kind":{"type":"string"},"url":{"type":"string"},"regions":{"type":"integer"},"best":{"type":"object","properties":{"region":{"type":"string"},"position":{"type":"integer"}},"required":["region","position"]},"primary":{"description":"Position in the store's main region","type":["integer","null"]},"positions":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"position":{"type":"integer"}},"required":["region","position"]}}},"required":["chart","title","kind","url","regions","best","primary"]}}},"required":["app","charts"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsRanksHistory":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"since":{"type":"string","description":"Start of the home-region window"},"series":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"title":{"type":["string","null"]},"kind":{"type":"string"},"region":{"type":"string"},"url":{"type":"string"},"points":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string"},"position":{"type":"integer"},"carried":{"type":"boolean"}},"required":["t","position","carried"]}}},"required":["chart","title","kind","region","url","points"]}}},"required":["app","since","series"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsMetrics":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"metrics":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"unit":{"type":"string"},"basis":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"]},"value":{"type":["number","null"]},"t":{"type":"string"},"prev":{"type":["number","null"]},"prev_t":{"type":["string","null"]},"points":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string"},"value":{"type":["number","null"]}},"required":["t","value"]}}},"required":["name","unit","basis","value","t","prev","prev_t"]}}},"required":["app","metrics"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsTools":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"servers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"The server's OpenApps id: /v1/mcp/servers/{id}"},"url":{"type":"string"},"status":{"type":["string","null"]},"transport":{"type":["string","null"]},"auth_hint":{"type":["string","null"]},"checked_at":{"type":["string","null"]},"snapshot":{"description":"Latest toolset; null if never seen without sign-in","properties":{"hash":{"type":"string"},"server_name":{"type":["string","null"]},"server_version":{"type":["string","null"]},"protocol_version":{"type":["string","null"]},"seen_since":{"type":["string","null"]},"tool_count":{"type":"integer"},"prompt_count":{"type":"integer"},"resource_count":{"type":"integer"},"tools":{"type":"array","items":{"$ref":"#/components/schemas/McpTool"}}},"required":["hash","server_name","server_version","protocol_version","seen_since","tool_count","prompt_count","resource_count","tools"],"type":["object","null"]},"history":{"type":"array","items":{"$ref":"#/components/schemas/ToolsetVersion"}}},"required":["id","url","status","transport","auth_hint","checked_at","snapshot"]}}},"required":["app","servers"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"AppsVersions":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"listing":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"seen_since":{"type":"string"},"seen_until":{"type":"string"},"data":{"type":"object","additionalProperties":{},"description":"The record as the store returned it"}},"required":["hash","seen_since","seen_until"]}},"detail":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"seen_since":{"type":"string"},"seen_until":{"type":"string"},"data":{"type":"object","additionalProperties":{},"description":"The record as the store returned it"}},"required":["hash","seen_since","seen_until"]}}},"required":["app","listing","detail"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"MarketGet":{"type":"object","properties":{"data":{"type":"object","properties":{"stores":{"type":"array","items":{"type":"object","properties":{"store":{"type":"string","enum":["chatgpt","claude","cursor"]},"label":{"type":"string"},"url":{"type":"string"},"apps":{"type":"integer"},"kinds":{"type":"object","propertyNames":{"type":"string","enum":["app","connector","plugin","desktop_extension","directory_rule","directory_mcp"]},"additionalProperties":{"type":"integer"}},"last_run":{"type":["string","null"]},"launches":{"type":"object","properties":{"basis":{"type":"string","enum":["observed","store_reported","derived","proxy","estimate"],"description":"derived on ChatGPT (decoded from app ids), store_reported on Claude and Cursor"},"last_7d":{"type":"integer"},"weeks":{"type":"array","items":{"type":"object","properties":{"week":{"type":"string","description":"Monday the week starts"},"n":{"type":"integer"}},"required":["week","n"]}}},"required":["basis","last_7d","weeks"]},"lists":{"type":"array","items":{"type":"object","properties":{"chart":{"type":"string"},"title":{"type":["string","null"]},"apps":{"type":"integer"},"collection":{"type":"boolean","description":"A curated collection rather than a category"}},"required":["chart","title","apps","collection"]},"description":"Category lists in the main region, largest first"}},"required":["store","label","url","apps","kinds","last_run","launches"]}},"mcp":{"type":"object","properties":{"servers":{"type":"integer","description":"MCP servers linked from any store"},"by_status":{"type":"array","items":{"type":"object","properties":{"status":{"type":["string","null"]},"n":{"type":"integer"}},"required":["status","n"]}},"snapshots":{"type":"integer"},"cross_store":{"type":"integer","description":"Servers linked from apps in more than one store"},"url":{"type":"string"},"open":{"type":"object","properties":{"servers":{"type":"integer"},"tools":{"type":"integer"},"tools_per_server":{"type":"object","properties":{"median":{"type":["integer","null"]},"p90":{"type":["integer","null"]},"max":{"type":["integer","null"]},"histogram":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string"},"n":{"type":"integer"}},"required":["bucket","n"]}}},"required":["median","p90","max"]},"annotations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"tools":{"type":"integer"},"servers":{"type":"integer"},"tools_true":{"type":["integer","null"]}},"required":["name","tools","servers"]},"description":"Tools and servers that set each annotation; tools_true: tools setting the hint to true"},"output_schema":{"type":"object","properties":{"tools":{"type":"integer"},"servers":{"type":"integer"}},"required":["tools","servers"]},"meta":{"type":"object","properties":{"tools":{"type":"integer"},"servers":{"type":"integer"}},"required":["tools","servers"]},"params":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"tools":{"type":"integer"},"servers":{"type":"integer"}},"required":["name","tools","servers"]},"description":"Most common input parameter names"},"params_per_tool":{"type":"object","properties":{"median":{"type":["integer","null"]},"p90":{"type":["integer","null"]},"none_pct":{"type":["number","null"]},"required_pct":{"type":["number","null"]}},"required":["median","p90","none_pct","required_pct"]},"description_len":{"type":"object","properties":{"median":{"type":["integer","null"]},"p90":{"type":["integer","null"]}},"required":["median","p90"]},"protocols":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"n":{"type":"integer"}},"required":["version","n"]}}},"required":["servers","tools","tools_per_server","annotations","output_schema","params","params_per_tool","description_len","protocols"],"description":"Across every open server's latest anonymous tools/list"}},"required":["servers","by_status","snapshots","cross_store","url","open"]}},"required":["stores","mcp"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"McpToolsetGet":{"type":"object","properties":{"data":{"type":"object","properties":{"servers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"The server's OpenApps id: /v1/mcp/servers/{id}"},"url":{"type":"string"},"page":{"type":"string","description":"The server's OpenApps page"},"status":{"type":["string","null"]},"transport":{"type":["string","null"]},"checked_at":{"type":["string","null"]},"apps":{"type":"array","items":{"type":"string"},"description":"Refs of the apps that link to it, across stores"},"snapshot":{"description":"The toolset at `at` (latest if omitted); null if never seen without sign-in by then","properties":{"hash":{"type":"string"},"server_name":{"type":["string","null"]},"server_version":{"type":["string","null"]},"protocol_version":{"type":["string","null"]},"seen_since":{"type":"string","description":"First crawl that saw this toolset"},"seen_until":{"type":"string","description":"Last crawl that saw it"},"tool_count":{"type":"integer"},"prompt_count":{"type":"integer"},"resource_count":{"type":"integer"},"tools":{"description":"Left out when diff_from is given","type":"array","items":{"$ref":"#/components/schemas/McpTool"}}},"required":["hash","server_name","server_version","protocol_version","seen_since","seen_until","tool_count","prompt_count","resource_count"],"type":["object","null"]},"diff":{"description":"Only with diff_from","properties":{"from":{"description":"null: no toolset seen by then, so every tool counts as added","properties":{"hash":{"type":"string"},"seen_since":{"type":"string"}},"required":["hash","seen_since"],"type":["object","null"]},"added":{"type":"array","items":{"$ref":"#/components/schemas/McpTool"}},"removed":{"type":"array","items":{"$ref":"#/components/schemas/McpTool"}},"changed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"fields":{"type":"array","items":{"type":"string"},"description":"title, description, inputSchema, annotations or outputSchema"},"before":{"type":"object","additionalProperties":{}},"after":{"type":"object","additionalProperties":{}}},"required":["name","fields"]}}},"required":["from","added","removed","changed"],"type":["object","null"]},"history":{"type":"array","items":{"$ref":"#/components/schemas/ToolsetVersion"}}},"required":["id","url","page","status","transport","checked_at","apps","snapshot","diff"]}}},"required":["servers"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"McpServersList":{"type":"object","properties":{"data":{"type":"object","properties":{"total":{"type":"integer"},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"},"page":{"type":"string","description":"The server's OpenApps page"},"host":{"type":["string","null"]},"status":{"type":["string","null"]},"transport":{"type":["string","null"]},"auth_hint":{"type":["string","null"]},"checked_at":{"type":["string","null"]},"tool_count":{"description":"Tools in its latest toolset; null if never seen without sign-in","type":["integer","null"]},"snapshots":{"type":"integer","description":"Toolset versions seen"},"stores":{"type":"array","items":{"type":"string","enum":["chatgpt","claude","cursor"]}},"apps":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"name":{"type":["string","null"]}},"required":["app","name"]}}},"required":["id","url","page","host","status","transport","auth_hint","checked_at","tool_count","snapshots","stores","apps"]}}},"required":["total","rows"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"McpServersGet":{"type":"object","properties":{"data":{"type":"object","properties":{"server":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"},"page":{"type":"string","description":"The server's OpenApps page"},"host":{"type":["string","null"]},"status":{"type":["string","null"]},"transport":{"type":["string","null"]},"auth_hint":{"type":["string","null"]},"checked_at":{"type":["string","null"]},"error":{"description":"The last probe's error","type":["string","null"]}},"required":["id","url","page","host","status","transport","auth_hint","checked_at","error"]},"apps":{"type":"array","items":{"$ref":"#/components/schemas/AppRow"}},"toolset":{"description":"Latest toolset; null if never seen without sign-in","properties":{"hash":{"type":"string"},"server_name":{"type":["string","null"]},"server_version":{"type":["string","null"]},"protocol_version":{"type":["string","null"]},"seen_since":{"type":"string","description":"First crawl that saw this toolset"},"seen_until":{"type":"string","description":"Last crawl that saw it"},"tool_count":{"type":"integer"},"prompt_count":{"type":"integer"},"resource_count":{"type":"integer"},"tools":{"description":"Left out when diff_from is given","type":"array","items":{"$ref":"#/components/schemas/McpTool"}}},"required":["hash","server_name","server_version","protocol_version","seen_since","seen_until","tool_count","prompt_count","resource_count"],"type":["object","null"]},"history":{"type":"array","items":{"$ref":"#/components/schemas/ToolsetVersion"}}},"required":["server","apps","toolset","history"]},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]}},"responses":{"304":{"description":"Not modified since the ETag in If-None-Match."},"400":{"description":"An input is invalid; error.param names it and error.allowed lists valid values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid bearer credential.","headers":{"WWW-Authenticate":{"description":"OAuth challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Missing catalog:read scope.","headers":{"WWW-Authenticate":{"description":"OAuth challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Nothing matches, e.g. an unknown app or chart; error.nearest lists the closest known values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this address in the last minute.","headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"OpenApps failed; the message carries a reference to quote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"securitySchemes":{"DeveloperKey":{"type":"http","scheme":"bearer","description":"Create a developer key in your OpenApps account. Public reads also work without credentials."},"OAuth":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://theopenapps.com/oauth/authorize","tokenUrl":"https://theopenapps.com/oauth/token","scopes":{"catalog:read":"Read the OpenApps catalog"}}},"description":"Request resource=https://theopenapps.com/v1 and use PKCE S256."}}}}