Endpoint Playground
Returns every Dota 2 hero with base stats (health, mana, armor, attack range, move speed) and OpenDota's aggregate pick/win counts and win rates for professional games (with bans), public games, turbo, and each of the eight rank brackets (`Herald`, `Guardian`, `Crusader`, `Archon`, `Legend`, `Ancient`, `Divine`, `Immortal`). Filter by `primary_attr` (`agi`, `all`, `int`, `str`), `attack_type` (`Melee`, `Ranged`) and `role`, sort with `sort` and `desc`, and cap with `limit`. Win rates are percentages and are omitted when there are no picks.
29 Oct 2026: 40 heroes; 17 fields had a value in every checked item.
Sample value profiles: primary_attr: agi (19), str (11), int (7) and 1 more; base_mana: 0 to 75, median 75; name: “npc_dota_hero_antimage” and 39 other values.
curl 'https://api.crawlora.net/api/v1/opendota/hero-stats?primary_attr=agi&attack_type=Melee&role=Carry&sort=id' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| primary_attr | string | No | agi | Primary attribute filter; one of agi, all, int, str |
| attack_type | string | No | Melee | Attack type filter; one of Melee, Ranged |
| role | string | No | Carry | Role filter; one of Carry, Disabler, Durable, Escape, Initiator, Nuker, Pusher, Support |
| sort | string | No | id | Sort key; one of id, name, pro_pick, pro_win, pro_ban, pro_win_rate, pub_pick, pub_win, pub_win_rate, turbo_pick, turbo_win_rate; defaults to id |
| desc | boolean | No | Sort descending (the default for every key except id and name) | |
| limit | integer | No | Number of heroes to return, 1 to 200; defaults to all |
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/hero-stats",
"fetched_at": "2026-10-28T10:00:00Z",
"count": 1,
"heroes": [
{
"id": 1,
"name": "npc_dota_hero_antimage",
"localized_name": "Anti-Mage",
"primary_attr": "agi",
"attack_type": "Melee",
"roles": [
"Carry",
"Escape",
"Nuker"
],
"base_health": 120,
"base_mana": 75,
"base_armor": 2,
"base_attack_min": 29,
"base_attack_max": 33,
"attack_range": 150,
"move_speed": 310,
"pro": {
"picks": 13,
"wins": 7,
"bans": 36,
"win_rate_percent": 53.85
},
"public": {
"picks": 696061,
"wins": 355934,
"win_rate_percent": 51.13
},
"turbo": {
"picks": 279477,
"wins": 141948,
"win_rate_percent": 50.79
},
"rank_brackets": [
{
"bracket": 1,
"name": "Herald",
"picks": 12570,
"wins": 6479,
"win_rate_percent": 51.54
}
]
}
]
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.