Skip to content

OpenApps API (v1)

A read-only JSON API at https://theopenapps.com/v1 with 30 operations over the ChatGPT, Claude, Cursor and Grok Bot app stores. No key is needed for up to 60 requests a minute per IP address, and every answer carries the date its data refers to.

Base URL
/v1theopenapps.com
Auth
None neededfree key for more requests
Without a key
60 a minuteper IP address
Format
JSON{ data, meta }

Quick start

Every operation is a GET. Ask for a chart and you get its rows with their position now and on the previous day:

Request
curl "https://theopenapps.com/v1/charts/claude/popularity?limit=2"
Response, shortened
Loading an example answer…

Find an app's ref with apps_search, then pass it to the app operations. A ref is {store}:{plugin_id}, for example claude:plugin_01PoHZZkGN1CnSkTGNn7178Z for Google Drive on Claude.

Request
curl "https://theopenapps.com/v1/apps?query=notion&store=chatgpt&limit=1"

Responses and errors

  • A success is 200 with { data, meta }. meta.as_of is the date the data refers to.
  • meta.basis maps each output field to where its value comes from: observed (as the store lists it, or as a server's tool list states it), store_reported (a number the store publishes) or derived (computed by OpenApps, such as movement or launch dates).
  • Lists page with limit and cursor: pass meta.next_cursor back with the same other inputs. Without a key, a chart stops at its top 100 rows in the United States and at reaches 30 days back; a free key opens every country and 500 rows. Past your plan, the response says what it left out and which plan opens it. Arrays in a query are comma-separated. Times are ISO-8601 or relative to the latest data (-24h, -7d).
  • An answer is cached until the data changes, and carries an ETag. Responses allow any origin (CORS).
  • Errors are 400, 404, 429 or 500 with { error: { code, message, param?, allowed?, nearest? } }. A wrong name comes back with the nearest valid ones:
404 response
{
  "error": {
    "code": "not_found",
    "message": "No claude chart 'nope'. stores_get with store=claude lists them.",
    "param": "chart",
    "nearest": [
      "new",
      "trending",
      "popularity",
      "connectors:trending",
      "connectors:popularity"
    ]
  }
}

Keys and limits

Public reads need no key. If you send one, use Authorization: Bearer oa_… with an API key from your account. Keys come with a free account, start with oa_ followed by 64 hex characters, expire after 90 days and can be revoked at any time. Agents can also sign in with OAuth and the catalog:read scope; those tokens are bound to /v1 or /mcp.

AccessRequests and MCP callsDepth
No key60 a minute per IP addressAs the public pages: the United States, the top 100 rows of a list, 30 days of ranks and launches, 7 of changes, featuring and movers
Free key600 a minute per accountAs a free account: every country, 500 rows of a list, 30 days back
Pro key600 a minute per accountEvery row and the full history

A key or an OAuth connection counts against its account's limit and reads what its account's plan sees. Over a limit you get 429 with a Retry-After header; past your depth, the response says what it left out and which plan opens it.

Operations

30 operations in seven groups. Open one for its parameters and an example. The full schemas are in the OpenAPI 3.1 document (/v1/openapi.json).

Stores and markets

Charts, featuring and changes

OpenApps Rank

Launches and apps

Publishers and products

Explorer and tags

MCP servers

The OpenAPI document also lists freshness_get, which we use to monitor the service. It isn't covered here and may change.

Attribution

Credit data you use as Data: OpenApps (theopenapps.com) with the date from meta.as_of and a link. For agents, the same map is in llms.txt and /v1/agent-context.