OpenDota API endpoint
Returns how OpenDota's rated players are distributed over Dota 2 rank tiers: for each `rank_tier` (the first digit is the medal, the second the stars) the medal name, stars, player count, cumulative count and the share and cumulative share in percent, sorted by tier.
/opendota/rank-distributionHeader: x-api-key required.
Parameters:
Notable response behavior:
rank_tier 54 is Legend 4: the tens digit is the medal (Herald, Guardian, Crusader, Archon, Legend, Ancient, Divine, Immortal) and the units digit the stars; Immortal rows have stars 0 to 5 as OpenDota reports them.share_percent and cumulative_percent are computed from total_players. The response is cached for up to one hour.| Field | Filled in, of 36 checked | Values in the sample |
|---|---|---|
| rank_tier | 36 | 11 to 80, median 43 |
| medal | 36 | Herald (5), Guardian (5), Crusader (5) and 5 more |
| stars | 36 | 0 to 5, median 3 |
| players | 36 | 9,124 to 357,865, median 259,926 |
| cumulative_players | 36 | 9,124 to 8,753,767, median 4,713,453 |
| share_percent | 36 | 0.1 to 4.09, median 2.97 |
| cumulative_percent | 36 | 0.1 to 100, median 53.84 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/opendota/rank-distribution" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/rank-distribution",
"fetched_at": "2026-10-28T10:00:00Z",
"total_players": 8745631,
"count": 1,
"ranks": [
{
"rank_tier": 54,
"medal": "Legend",
"stars": 4,
"players": 512000,
"cumulative_players": 4100000,
"share_percent": 5.85,
"cumulative_percent": 46.9
}
]
}
}Request schema
No body schema
Response schema
Inline response schema
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | opendota.DistributionsResponse | No | ||||
| data.count | integer | No | 36 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.ranks | array | No | ||||
| data.ranks[].cumulative_percent | number | No | 46.9 | |||
| data.ranks[].cumulative_players | integer | No | 4100000 | |||
| data.ranks[].medal | string | No | Legend | |||
| data.ranks[].players | integer | No | 512000 | |||
| data.ranks[].rank_tier | integer | No | 54 | |||
| data.ranks[].share_percent | number | No | 5.85 | |||
| data.ranks[].stars | integer | No | 4 | |||
| data.source_url | string | No | ||||
| data.total_players | integer | No | 8745631 | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/opendota/rank-distribution" \
-H "x-api-key: $CRAWLORA_API_KEY"