Data API

The Data API exposes the same datasets that power the public rankings page and apps marketplace as JSON, so you can republish, analyse, or visualise them in your own tools.

All Data API endpoints are gated by any valid OpenRouter API key (the same key you use for inference) and share the same rate limits: 30 requests/minute per key, 500 requests/day per account.

Rankings Daily

The first endpoint — /api/v1/datasets/rankings-daily — returns the top 50 public models per day by total token usage, plus a single aggregated other row per day summing every model outside that top 50. Each real model row is keyed on (date, model_permaslug). Numbers are token counts (prompt_tokens + completion_tokens), matching what is shown on the rankings page.

The endpoint is gated by any valid OpenRouter API key. The same key you use to call /api/v1/chat/completions works here.

Endpoint

GET /api/v1/datasets/rankings-daily?start_date={YYYY-MM-DD}&end_date={YYYY-MM-DD} HTTP/1.1
Host: openrouter.ai
Authorization: Bearer <YOUR_OPENROUTER_API_KEY>

The endpoint accepts only GET requests. There is no request body — pass the date window via query parameters.

Headers

HeaderRequiredValue
AuthorizationYesBearer <YOUR_OPENROUTER_API_KEY>. The same key you use to call /api/v1/chat/completions works here.

Requests without a valid key receive 401 Unauthorized.

Query parameters

ParameterTypeRequiredDefaultExample
start_dateYYYY-MM-DD (UTC)No30 days before end_date2026-04-12
end_dateYYYY-MM-DD (UTC)NoThe most recent completed UTC day2026-05-11

Rules:

  • Both bounds are inclusive.
  • Dates must be calendar-valid in UTC. Overflow strings like 2026-02-30 return 400 Bad Request rather than silently rolling over.
  • start_date must be on or before end_date.
  • The maximum span between start_date and end_date is 366 days (one year + 1 leap day). Wider windows return 400 Bad Request.
  • The dataset begins on 2025-01-01. A start_date earlier than that is silently clamped forward to 2025-01-01, and the resolved value is echoed back in meta.start_date. An end_date earlier than 2025-01-01 returns 400 Bad Request.

Omitting both parameters returns the most recent 30-day window. See the Examples section below for fully-formed requests in cURL, Python, and TypeScript.

Rate limits

BucketLimit
Per API key30 requests / minute
Per account500 requests / day

The dataset updates live as traffic flows through OpenRouter — there is no daily refresh window — so a poll once per minute is more than enough to keep your view fresh. Exceeding either bucket returns 429 Too Many Requests.

Response shape

1{
2 "data": [
3 {
4 "date": "2026-05-11",
5 "model_permaslug": "openai/gpt-4o-2024-05-13",
6 "total_tokens": "1234567890"
7 },
8 {
9 "date": "2026-05-11",
10 "model_permaslug": "anthropic/claude-3.5-sonnet-20241022",
11 "total_tokens": "987654321"
12 },
13 {
14 "date": "2026-05-11",
15 "model_permaslug": "google/gemini-2.5-flash",
16 "total_tokens": "456789012"
17 },
18 {
19 "date": "2026-05-11",
20 "model_permaslug": "other",
21 "total_tokens": "123456789"
22 }
23 ],
24 "meta": {
25 "as_of": "2026-05-12T02:00:00.000Z",
26 "version": "v1",
27 "start_date": "2026-04-12",
28 "end_date": "2026-05-11"
29 }
30}

Notes on the response:

  • Up to 51 rows per day — the top 50 public models by total tokens, plus one aggregated other row covering every model outside that top 50. The other row is omitted on days where there are no models beyond the top 50.
  • Models whose total tokens on a given day sum to zero are omitted from that day before ranking. This filters out transcription / image / embedding endpoints whose activity is measured in non-token units (audio seconds, image counts) and which would otherwise appear as "0" rows or waste rank slots.
  • Rows are sorted by date ascending. Within each date, the top 50 are sorted by total_tokens descending (ties break alphabetically on model_permaslug so two models with identical totals always appear in the same order across requests), and the other row is pinned last — even when its total exceeds the top 50 — so downstream charts can rely on it being the trailing series.
  • total_tokens is returned as a string so 64-bit values are not truncated by JSON parsers that fall back to floats.
  • model_permaslug matches the canonical permaslug used elsewhere in the OpenRouter API (e.g. openai/gpt-4o-2024-05-13). Non-default variants include a :variant suffix (e.g. openai/gpt-4o-2024-05-13:free) and are ranked as their own entry, matching the rankings page. The reserved value other denotes the aggregated long-tail row described above and is the only model_permaslug value that is not a real permaslug.
  • meta.as_of is the wall-clock time the response was generated. The underlying dataset updates continuously as traffic flows through OpenRouter, so successive calls a few minutes apart can return different totals for the current (in-progress) day.
  • Token counts for each row come from the upstream provider’s own tokenizer — Anthropic counts are what Anthropic reports, OpenAI counts are what OpenAI reports, and so on. Tokenizers differ across providers, so a token in one row is not directly comparable to a token in another row from a different provider. The other row sums tokens across many providers and so should be treated as a coarse magnitude only.
  • The response stays small — at most 51 rows per day × the requested window. The default 30-day window typically returns under 1,600 rows.

Examples

$curl -G https://openrouter.ai/api/v1/datasets/rankings-daily \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "start_date=2026-04-01" \
> --data-urlencode "end_date=2026-04-30"

Acceptable use and attribution

When you republish, quote, or visualise data from this endpoint, OpenRouter must be cited using the canonical citation string below. The {as_of} value comes from meta.as_of in the response.

Source: OpenRouter (openrouter.ai/rankings), as of {as_of}.

A few practical notes:

  • The dataset is intended for analysis, reporting, and visualisation. It is not intended to be re-served as a competing free API.
  • The dataset only contains public traffic. Private models, private endpoints, and zero-data-retention traffic are excluded at the source.

App Rankings

The /api/v1/datasets/app-rankings endpoint returns the top public apps on OpenRouter ranked by token usage, matching the public apps marketplace. Hidden and private apps are excluded, and traffic from related app aliases is merged into the canonical app.

Endpoint

GET /api/v1/datasets/app-rankings?sort={popular|trending}&category={category}&limit={n}&offset={n} HTTP/1.1
Host: openrouter.ai
Authorization: Bearer <YOUR_OPENROUTER_API_KEY>

Query parameters

ParameterTypeRequiredDefaultExample
sortpopular | trendingNopopulartrending
categorystringNo(all categories)coding
subcategorystringNo(all subcategories)cli-agent
start_dateYYYY-MM-DD (UTC)No30 days before end_date2026-04-12
end_dateYYYY-MM-DD (UTC)NoMost recent completed UTC day2026-05-11
limitinteger (1-100)No5010
offsetinteger (0-100)No050

Sort modes:

  • popular ranks apps by total token volume (prompt_tokens + completion_tokens) inside the date window.
  • trending ranks by absolute excess token growth: window volume minus the average volume of the three equal-length periods before it. Apps with no excess growth are omitted, so trending may return fewer than limit rows.

When both category and subcategory are supplied, the subcategory must belong to the category group; an inconsistent pair returns 400.

Date window rules are the same as Rankings Daily: the dataset begins at 2025-01-01, max span is 366 days.

Response shape

1{
2 "data": [
3 {
4 "rank": 1,
5 "app_id": 12345,
6 "app_name": "Cline",
7 "total_tokens": "12345678901",
8 "total_requests": 4321
9 },
10 {
11 "rank": 2,
12 "app_id": 67890,
13 "app_name": "Roo Code",
14 "total_tokens": "9876543210",
15 "total_requests": 2109
16 }
17 ],
18 "meta": {
19 "as_of": "2026-05-12T02:00:00Z",
20 "version": "v1",
21 "start_date": "2026-04-12",
22 "end_date": "2026-05-11"
23 }
24}

Notes:

  • rank is absolute: the first row at offset=50 has rank: 51.
  • total_tokens is a string for 64-bit safety, same as Rankings Daily.
  • Token counts come from each upstream provider’s tokenizer, so cross-app comparisons are approximate.

Examples

$# Most popular coding apps
$curl -G https://openrouter.ai/api/v1/datasets/app-rankings \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "sort=popular" \
> --data-urlencode "category=coding" \
> --data-urlencode "limit=10"
$
$# Trending apps overall
$curl -G https://openrouter.ai/api/v1/datasets/app-rankings \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "sort=trending"

Benchmarks

The /api/v1/benchmarks endpoint provides a unified interface to benchmark data from multiple sources. Filter by source to select a specific benchmark provider, or combine with task_type to find models suited for specific workloads (e.g. coding agents querying for the best coding models across all available benchmarks).

Endpoint

GET /api/v1/benchmarks?source={source}&task_type={task_type}&max_results={n} HTTP/1.1
Host: openrouter.ai
Authorization: Bearer <YOUR_OPENROUTER_API_KEY>

Query parameters

ParameterTypeRequiredDefaultExample
sourceartificial-analysis | design-arenaYesartificial-analysis
task_typecoding | intelligence | agenticNo(all tasks)coding
arenamodels | builders | agentsNomodelsmodels
categorystringNo(all categories)codecategories
max_resultsinteger (1–100)No5020

Notes:

  • source determines the shape of items in the response. Each source has its own set of score fields.
  • task_type filters cross-source. For Artificial Analysis it returns only models with a non-null score for that task. For Design Arena it maps to the corresponding category (e.g. codingcodecategories).
  • arena and category apply only when source=design-arena.

Response shape (Artificial Analysis)

When source=artificial-analysis, each item carries composite index scores:

1{
2 "data": [
3 {
4 "source": "artificial-analysis",
5 "model_permaslug": "openai/gpt-4o",
6 "display_name": "GPT-4o",
7 "intelligence_index": 71.2,
8 "coding_index": 65.8,
9 "agentic_index": 58.3,
10 "pricing": {
11 "prompt": "0.0000025",
12 "completion": "0.00001"
13 }
14 }
15 ],
16 "meta": {
17 "as_of": "2026-06-03T12:00:00Z",
18 "version": "v1",
19 "source": "artificial-analysis",
20 "source_url": "https://artificialanalysis.ai",
21 "citation": "Source: Artificial Analysis (artificialanalysis.ai) via OpenRouter (openrouter.ai/rankings).",
22 "model_count": 1,
23 "task_type": null
24 }
25}

Response shape (Design Arena)

When source=design-arena, each item carries ELO ratings from head-to-head battles:

1{
2 "data": [
3 {
4 "source": "design-arena",
5 "model_permaslug": "anthropic/claude-sonnet-4",
6 "display_name": "Claude Sonnet 4",
7 "arena": "models",
8 "category": "codecategories",
9 "elo": 1423,
10 "win_rate": 72,
11 "avg_generation_time_ms": 3200,
12 "tournament_stats": {
13 "first_place": 12,
14 "second_place": 8,
15 "third_place": 5,
16 "fourth_place": 2,
17 "total": 27
18 },
19 "pricing": {
20 "prompt": "0.000003",
21 "completion": "0.000015"
22 }
23 }
24 ],
25 "meta": {
26 "as_of": "2026-06-03T12:00:00Z",
27 "version": "v1",
28 "source": "design-arena",
29 "source_url": "https://www.designarena.ai",
30 "citation": "Source: Design Arena (www.designarena.ai) via OpenRouter (openrouter.ai/rankings).",
31 "model_count": 1,
32 "task_type": null
33 }
34}

Examples

$# Artificial Analysis — all models
$curl -G https://openrouter.ai/api/v1/benchmarks \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "source=artificial-analysis" \
> --data-urlencode "max_results=20"
$
$# Best coding models across Artificial Analysis
$curl -G https://openrouter.ai/api/v1/benchmarks \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "source=artificial-analysis" \
> --data-urlencode "task_type=coding"
$
$# Design Arena — models arena, all categories
$curl -G https://openrouter.ai/api/v1/benchmarks \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "source=design-arena" \
> --data-urlencode "arena=models"

Task Classifications

The /api/v1/classifications/task endpoint returns the market-share breakdown of OpenRouter traffic by task classification — code generation, web search, summarization, and so on — over a trailing time window. Each classification reports its share of total requests and token volume as a fraction between 0 and 1.

The underlying data is sampled, so absolute volumes aren’t exposed. What you get is the relative shape of traffic: which tasks account for the most usage and how they compare within their macro-category.

Endpoint

GET /api/v1/classifications/task?window=7d HTTP/1.1
Host: openrouter.ai
Authorization: Bearer <YOUR_OPENROUTER_API_KEY>

Query parameters

ParameterTypeRequiredDefaultExample
window7dNo7d7d

Only 7d (trailing 7 days) is supported for now. Future windows (e.g. 1d, 30d) may be added.

Response shape

1{
2 "data": {
3 "window_days": 7,
4 "as_of": "2026-06-17",
5 "classifications": [
6 {
7 "tag": "code:general_impl",
8 "display_name": "Code Generation",
9 "macro_category": "code",
10 "usage_share": 0.23,
11 "token_share": 0.31,
12 "category_usage_share": 0.51,
13 "category_token_share": 0.48,
14 "models": [
15 {
16 "id": "openai/gpt-4.1-mini",
17 "tag_usage_share": 0.55,
18 "tag_token_share": 0.75
19 },
20 {
21 "id": "anthropic/claude-sonnet-4",
22 "tag_usage_share": 0.20,
23 "tag_token_share": 0.12
24 }
25 ]
26 },
27 {
28 "tag": "agent:web_search",
29 "display_name": "Web Search",
30 "macro_category": "agent",
31 "usage_share": 0.15,
32 "token_share": 0.12,
33 "category_usage_share": 0.60,
34 "category_token_share": 0.55,
35 "models": [
36 {
37 "id": "anthropic/claude-sonnet-4",
38 "tag_usage_share": 0.40,
39 "tag_token_share": 0.50
40 }
41 ]
42 }
43 ],
44 "macro_categories": [
45 {
46 "key": "code",
47 "label": "Code",
48 "usage_share": 0.45,
49 "token_share": 0.52
50 },
51 {
52 "key": "data",
53 "label": "Data",
54 "usage_share": 0.20,
55 "token_share": 0.18
56 },
57 {
58 "key": "agent",
59 "label": "Agent",
60 "usage_share": 0.25,
61 "token_share": 0.22
62 },
63 {
64 "key": "general",
65 "label": "General",
66 "usage_share": 0.10,
67 "token_share": 0.08
68 }
69 ]
70 }
71}

Notes:

  • classifications is sorted by usage_share descending.
  • usage_share and token_share are fractions of total classified traffic. The unclassified other bucket is excluded from the denominator, so these shares sum to 1 across all classifications.
  • category_usage_share and category_token_share are fractions within the classification’s macro-category. They sum to 1 across all classifications that share the same macro_category.
  • models lists the top models for this classification by request volume. Each entry reports the model’s share of that classification’s requests (tag_usage_share) and tokens (tag_token_share). Only the top-N models are included, so shares may sum to less than 1.
  • macro_categories groups classifications into four buckets: Code, Data, Agent, and General. Each macro-category’s shares sum to the corresponding total in classifications.
  • as_of is the upper bound of the time window (yesterday in UTC). It marks the expected latest date in the snapshot but doesn’t confirm data presence for that specific date.
  • The response is cached for 60 seconds on the server side. A Cache-Control: private, max-age=60, stale-while-revalidate=300 header is set on every response.

Examples

$curl -G https://openrouter.ai/api/v1/classifications/task \
> -H "Authorization: Bearer $OPENROUTER_API_KEY" \
> --data-urlencode "window=7d"

Acceptable use and attribution

When republishing or quoting data from this endpoint, cite as:

Source: OpenRouter (openrouter.ai/rankings), as of {as_of}.

Versioning

All Data API endpoint paths include a version (/api/v1/...) and every response includes meta.version. Backwards-incompatible changes (renamed/removed fields, changed semantics for an existing field) will only ship behind a new version. Additive changes (new optional fields) can land in v1.