From 3b2f5b2316568c5880056e8754ecdcf8bd119a9b Mon Sep 17 00:00:00 2001 From: robert-j-y <212159665+robert-j-y@users.noreply.github.com> Date: Wed, 10 Jun 2026 16:46:14 -0700 Subject: [PATCH] chore: update OpenAPI spec from monorepo (#301) Co-authored-by: OpenRouter SDK Bot --- .speakeasy/in.openapi.yaml | 298 +++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) diff --git a/.speakeasy/in.openapi.yaml b/.speakeasy/in.openapi.yaml index 6f453b8..11bf5d9 100644 --- a/.speakeasy/in.openapi.yaml +++ b/.speakeasy/in.openapi.yaml @@ -2412,6 +2412,76 @@ components: - path - diff type: object + AppRankingsItem: + example: + app_id: 12345 + app_name: Cline + rank: 1 + total_requests: 4321 + total_tokens: '12345678' + properties: + app_id: + description: Stable numeric identifier of the app on OpenRouter. + example: 12345 + type: integer + app_name: + description: Public display name of the app. + example: Cline + type: string + rank: + description: 1-based position of the app within this response, per the requested `sort`. + example: 1 + type: integer + total_requests: + description: Number of requests attributed to the app inside the date window. + example: 4321 + type: integer + total_tokens: + description: >- + Sum of `prompt_tokens + completion_tokens` attributed to the app inside the date window, returned as a + decimal string so 64-bit values are not truncated. + example: '12345678' + type: string + required: + - rank + - app_id + - app_name + - total_tokens + - total_requests + type: object + AppRankingsResponse: + example: + data: + - app_id: 12345 + app_name: Cline + rank: 1 + total_requests: 4321 + total_tokens: '12345678' + - app_id: 67890 + app_name: Roo Code + rank: 2 + total_requests: 2109 + total_tokens: '9876543' + meta: + as_of: '2026-05-12T02:00:00Z' + end_date: '2026-05-11' + start_date: '2026-04-12' + version: v1 + properties: + data: + description: >- + Apps ranked per the requested `sort`, re-numbered 1..N after category filtering. `popular` sorts by + `total_tokens` descending; `trending` sorts by absolute excess token growth descending and may return fewer + than `limit` rows when few apps are growing. + items: + $ref: '#/components/schemas/AppRankingsItem' + type: array + meta: + $ref: '#/components/schemas/RankingsDailyMeta' + required: + - data + - meta + type: object AutoRouterPlugin: example: allowed_models: @@ -22915,6 +22985,234 @@ paths: x-fern-ignore: true x-speakeasy-ignore: true x-speakeasy-name-override: createCoinbaseCharge + /datasets/app-rankings: + get: + description: |- + Returns the top public apps on OpenRouter ranked by token usage inside the requested + date window, matching the public apps marketplace on openrouter.ai/apps. Token totals + are `prompt_tokens + completion_tokens`; hidden and private apps are excluded and + traffic from related app aliases is merged into the canonical visible app. + + `sort=popular` (default) ranks by total token volume inside the window. + `sort=trending` ranks by absolute excess token growth: window volume minus the average + volume of the three equal-length periods immediately preceding the window. Apps with + no excess growth are omitted, so `trending` may return fewer than `limit` rows. + + Filter with `category` (marketplace category group, e.g. `coding`) or `subcategory` + (e.g. `cli-agent`). Ranks are re-numbered 1..N after filtering. Page with `offset` — + `rank` stays absolute, so the first row of `offset=50` is `rank: 51`. + + Authenticate with any valid OpenRouter API key (same key used for inference). + Rate-limited to 30 requests/minute per key and 500 requests/day per account. + + When republishing or quoting this dataset, OpenRouter must be cited as: + "Source: OpenRouter (openrouter.ai/apps), as of {as_of}." + + Token counts come from each upstream provider's own tokenizer, so a token attributed + to one app is not directly comparable to a token attributed to another app whose + traffic flows through a different provider. + operationId: getAppRankings + parameters: + - description: >- + Marketplace category group to filter by (e.g. `coding`). Only apps tagged with a subcategory inside this + group are returned. Mutually combinable with `subcategory` — when both are supplied the `subcategory` must + belong to the `category` group. + in: query + name: category + required: false + schema: + description: >- + Marketplace category group to filter by (e.g. `coding`). Only apps tagged with a subcategory inside this + group are returned. Mutually combinable with `subcategory` — when both are supplied the `subcategory` must + belong to the `category` group. + enum: + - coding + - creative + - productivity + - entertainment + example: coding + type: string + - description: >- + Marketplace subcategory to filter by (e.g. `cli-agent`). Takes precedence over `category` for the actual + filter; when `category` is also supplied the pair must be consistent. + in: query + name: subcategory + required: false + schema: + description: >- + Marketplace subcategory to filter by (e.g. `cli-agent`). Takes precedence over `category` for the actual + filter; when `category` is also supplied the pair must be consistent. + enum: + - cli-agent + - ide-extension + - cloud-agent + - programming-app + - native-app-builder + - creative-writing + - video-gen + - image-gen + - audio-gen + - roleplay + - game + - writing-assistant + - general-chat + - personal-agent + - legal + example: cli-agent + type: string + - description: >- + `popular` ranks apps by total token volume inside the date window. `trending` ranks apps by absolute excess + token growth: window volume minus the average volume of the three equal-length periods immediately preceding + the window. Apps with no excess growth are omitted from `trending` results. + in: query + name: sort + required: false + schema: + default: popular + description: >- + `popular` ranks apps by total token volume inside the date window. `trending` ranks apps by absolute + excess token growth: window volume minus the average volume of the three equal-length periods immediately + preceding the window. Apps with no excess growth are omitted from `trending` results. + enum: + - popular + - trending + example: popular + type: string + - description: >- + Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The dataset + begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is echoed in + `meta.start_date`. + in: query + name: start_date + required: false + schema: + description: >- + Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The + dataset begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is + echoed in `meta.start_date`. + example: '2026-04-12' + pattern: ^\d{4}-\d{2}-\d{2}$ + type: string + - description: >- + End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must + be on or after 2025-01-01; earlier values are rejected with a 400. + in: query + name: end_date + required: false + schema: + description: >- + End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must + be on or after 2025-01-01; earlier values are rejected with a 400. + example: '2026-05-11' + pattern: ^\d{4}-\d{2}-\d{2}$ + type: string + - description: Maximum number of apps to return (1-100). Defaults to 50. + in: query + name: limit + required: false + schema: + default: 50 + description: Maximum number of apps to return (1-100). Defaults to 50. + example: 50 + maximum: 100 + minimum: 1 + type: integer + - description: >- + Number of ranked apps to skip before the first returned row (0-100). Defaults to 0. `rank` stays absolute, + so the first row of `offset=50` is `rank: 51`. + in: query + name: offset + required: false + schema: + default: 0 + description: >- + Number of ranked apps to skip before the first returned row (0-100). Defaults to 0. `rank` stays absolute, + so the first row of `offset=50` is `rank: 51`. + example: 0 + maximum: 100 + minimum: 0 + nullable: true + type: integer + responses: + '200': + content: + application/json: + example: + data: + - app_id: 12345 + app_name: Cline + rank: 1 + total_requests: 4321 + total_tokens: '12345678' + - app_id: 67890 + app_name: Roo Code + rank: 2 + total_requests: 2109 + total_tokens: '9876543' + meta: + as_of: '2026-05-12T02:00:00Z' + end_date: '2026-05-11' + start_date: '2026-04-12' + version: v1 + schema: + $ref: '#/components/schemas/AppRankingsResponse' + description: >- + Apps ranked per the requested `sort`, re-numbered 1..N. `popular` sorts by `total_tokens` descending; + `trending` sorts by absolute excess token growth descending and may return fewer than `limit` rows. + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Top apps by token usage + tags: + - Datasets + x-speakeasy-pagination: + inputs: + - in: parameters + name: offset + type: offset + - in: parameters + name: limit + type: limit + outputs: + results: $.data + type: offsetLimit /datasets/rankings-daily: get: description: |-