GET/opendota/abilitiesapiKey3 credits/request
Returns Dota 2 abilities from OpenDota's constants table as compact summaries (key, display name, behavior, target team and type, damage type, dispellable, BKB pierce, cooldown, mana cost, innate flag, description), sorted by key. Internal helper entries without a display name are skipped. `q` searches the key and display name.
Optional: q, limit.
Sampled 29 Oct 2026: 8 items. Filled in every item: key, name, innate. Not in every item: behavior (3), cooldown (3), mana_cost (3), description (3), damage_type (1), bkb_pierce (1). In the sample: name: “Blink” and 5 other values; innate: true in 0 of 8; behavior: median 1 entry; cooldown: “10.5 9 7.5 6” and 2 other values; mana_cost: “65 60 55 50” and 2 other values; description: “Short distance teleportation that allows Anti-Mage to move…” and 2 other values; damage_type: “Physical”; bkb_pierce: “Yes”.
Open in Playground
GET/opendota/benchmarksapiKey2 credits/request
Returns a Dota 2 hero's benchmark percentiles from OpenDota's public games: for each of ten per-minute metrics (`gold_per_min`, `xp_per_min`, `kills_per_min`, `deaths_per_min`, `assists_per_min`, `last_hits_per_min`, `denies_per_min`, `hero_damage_per_min`, `hero_healing_per_min`, `tower_damage`) the value at percentiles 0.1 to 0.99, sorted by percentile. An unknown hero id returns 404.
Required: hero_id. Optional: bracket, role (2 allowed values: core, support).
Sampled 29 Oct 2026: 10 items. Filled in every item: metric, points. In the sample: metric: “assists_per_min” and 9 other values; points: median 11 entries.
Open in Playground
GET/opendota/constantsapiKey1 credit/request
Returns one OpenDota lookup table as a sorted list of `id`/`name` entries, used to decode ids in match data: game modes and lobby types (with `balanced`), patches (with release `date`), regions, server clusters (`value` is the region id), item and ability ids, permanent buff ids, experience thresholds per level (`value`) countries (`id` is the ISO code), order types (`order_types`, the unit order names) player slot colors (`player_colors`, hex colors), chat wheel phrases (`chat_wheel`, `name` is the label and `text` the message), item rarity colors (`item_colors`, `text` is the hex color), neutral ancient creeps (`ancients`) and skillshot abilities (`skillshots`). `resource` is one of `game_mode`, `lobby_type`, `patch`, `region`, `cluster`, `item_ids`, `ability_ids`, `permanent_buffs`, `xp_level`, `countries`.
Required: resource (16 allowed values: game_mode, lobby_type, patch, region, cluster, item_ids, ability_ids, permanent_buffs, xp_level, countries, order_types, player_colors, chat_wheel, item_colors, ancients, skillshots).
Sampled 29 Oct 2026: 26 items. Filled in every item: id, name, balanced. In the sample: name: “game_mode_unknown” and 25 other values; balanced: true in 10 of 26.
Open in Playground
GET/opendota/find-matchesapiKey2 credits/request
Returns recent public Dota 2 matches in which the given heroes were on team A and/or team B, with both full lineups (radiant and dire), whether Radiant won, and which side the requested team A heroes were on and whether they won. Provide at least one hero id in total; each side takes up to 5 comma-separated hero ids from opendota-heroes. Unknown or repeated hero ids return an invalid-parameter error.
Optional: team_a, team_b.
Sampled 29 Oct 2026: 10 items. Filled in every item: match_id, start_time, radiant_win, radiant, dire, team_a_side, team_a_win. In the sample: start_time: 2026-10-29; team_a_side: dire (6), radiant (4); radiant_win: true in 5 of 10; radiant: median 5 entries; dire: median 5 entries; team_a_win: true in 5 of 10.
Open in Playground
GET/opendota/hero-abilitiesapiKey2 credits/request
Returns a Dota 2 hero's ability keys, its eight talents by level and its facets (title, description, color, deprecated flag). An unknown hero id, or a hero OpenDota has no ability data for, returns 404.
Required: hero_id.
Sampled 29 Oct 2026: 8 items. Filled in every item: level, key. In the sample: level: 1 to 4, median 2.
Open in Playground
GET/opendota/hero-descriptionsapiKey2 credits/request
Returns, for every Dota 2 hero or for one `hero_id`, what Aghanim's Scepter and Aghanim's Shard do: whether each upgrade exists, its description, the skill it changes and whether it adds a new skill. `include_lore=true` adds each hero's lore text (about 155 KB for all heroes), so it is off by default. An unknown hero id returns not found. Take `hero_id` from opendota-heroes.
Optional: hero_id, include_lore.
Sampled 29 Oct 2026: 1 item. Filled in every item: hero_id, name, key, scepter, shard. In the sample: name: “npc_dota_hero_antimage”.
Open in Playground
GET/opendota/hero-durationsapiKey2 credits/request
Returns a hero's games and wins grouped by game length in five-minute bins (`start_minute` is the bin's first minute), sorted by length, to show whether the hero is stronger early or late. An unknown hero id returns not found.
Required: hero_id.
Sampled 29 Oct 2026: 23 items. Filled in every item: start_minute, games, wins, win_rate_percent. In the sample: start_minute: 5 to 200, median 60; games: 1 to 2,828, median 56; wins: 0 to 1,407, median 29; win_rate_percent: 0 to 100, median 48.55.
Open in Playground
GET/opendota/hero-itemsapiKey3 credits/request
Returns the items players buy on a hero in four phases (`start_game`, `early_game`, `mid_game`, `late_game`), each sorted by purchase count, with item ids resolved to internal names such as `power_treads` through the item-id table. An unknown hero id returns not found.
Required: hero_id.
Sampled 29 Oct 2026: 4 items. Filled in every item: phase, items. In the sample: phase: “start_game” and 3 other values; items: median 15 entries.
Open in Playground
GET/opendota/hero-matchesapiKey2 credits/request
Returns recent professional and public matches in which a hero was played (about 100), each with the side it played, whether it won, its kills, deaths and assists, duration and league when there is one. Players' account ids are not returned. An unknown hero id returns not found.
Required: hero_id.
Sampled 29 Oct 2026: 100 items. Filled in every item: match_id, start_time, duration_seconds, played_radiant, won, league_id, league_name, kills and 2 more. In the sample: start_time: 2026-06-23 to 2026-10-28; duration_seconds: 1,237 to 3,581, median 2,350; league_name: “PARI UNIVERSE by FISSURE” and 15 other values; played_radiant: true in 47 of 100; won: true in 48 of 100; kills: 0 to 23, median 7; deaths: 0 to 11, median 3; assists: 0 to 18, median 5.
Open in Playground
GET/opendota/hero-matchupsapiKey2 credits/request
Returns how often a hero faced each other hero in recent public games and how often it won, sorted by games played, with localized hero names and win-rate percentages. An unknown hero id returns not found.
Required: hero_id.
Sampled 29 Oct 2026: 126 items. Filled in every item: hero_id, localized_name, games, wins, win_rate_percent. In the sample: games: 2 to 81, median 23; localized_name: “Storm Spirit” and 125 other values; wins: 1 to 42, median 12; win_rate_percent: 16.67 to 86.67, median 48.57.
Open in Playground
GET/opendota/hero-statsapiKey1 credit/request
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.
Optional: primary_attr (4 allowed values: agi, all, int, str), attack_type (2 allowed values: Melee, Ranged), role (8 allowed values: Carry, Disabler, Durable, Escape, Initiator, Nuker, Pusher, Support), sort (11 allowed values: id, name, pro_pick, pro_win, pro_ban, pro_win_rate, pub_pick, pub_win, pub_win_rate, turbo_pick, turbo_win_rate), desc, limit.
Sampled 29 Oct 2026: 40 items. Filled in every item: id, name, localized_name, primary_attr, attack_type, roles, base_health, base_mana and 9 more. In the sample: 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; roles: median 4 entries; localized_name: “Anti-Mage” and 39 other values; attack_type: Ranged (22), Melee (18); base_armor: -2 to 2, median 0; base_attack_min: 12 to 40, median 26.
Open in Playground
GET/opendota/heroesapiKey1 credit/request
Returns the live OpenDota hero lookup needed to resolve `hero_id` values in live and detailed match responses. It includes every current hero ID with its internal name, localized name, primary attribute (`agi`, `all`, `int`, or `str`) and attack type (`Melee` or `Ranged`).
Takes no parameters.
Sampled 28 Oct 2026: 127 items. Filled in every item: id, name, localized_name, primary_attr, attack_type.
Open in Playground
GET/opendota/itemsapiKey2 credits/request
Returns Dota 2 items from OpenDota's constants table as compact summaries (key, id, display name, quality, gold cost, behavior, cooldown, mana cost, components, active and passive abilities, numeric attributes), sorted by key. `q` searches the key and display name, `quality` filters by quality, and `qualities` lists the quality values present.
Optional: q, quality, limit.
Sampled 29 Oct 2026: 8 items. Filled in every item: key, id. Not in every item: name (7), quality (4), cost_gold (7), behavior (5), cooldown (5), components (3), abilities (4), attributes (5). In the sample: cost_gold: 1,750 to 6,800, median 2,250; name: “Arcane Blink” and 6 other values; components: median 2 entries; cooldown: 9 to 15, median 15; abilities: median 1 entry; attributes: median 7 entries.
Open in Playground
GET/opendota/league-match-idsapiKey1 credit/request
Returns match IDs for one league, including amateur leagues omitted from opendota_league_matches. An empty array is valid for a league with no matches. Copy an ID into opendota_match for match details.
Required: league_id.
Open in Playground
GET/opendota/league-matchesapiKey1 credit/request
Returns the complete match list supplied for one OpenDota league, including match ID, teams, scores, start time and series metadata. Optionally filter locally to matches involving one team; league_id and team_id are echoed. This source route is not paginated and can include completed or scheduled rows; use opendota_match for parsed player statistics.
Required: league_id. Optional: team_id.
Sampled 29 Oct 2026: 10 items. Filled in every item: match_id, start_time, duration_seconds, league_id, radiant_team_id, dire_team_id, radiant_score, dire_score and 3 more. In the sample: start_time: 2026-10-23 to 2026-10-27; duration_seconds: 1,462 to 3,537, median 2,196; radiant_win: true in 7 of 10; radiant_score: 13 to 41, median 24; dire_score: 9 to 49, median 21.
Open in Playground
GET/opendota/leagueapiKey2 credits/request
Returns one league's name, tier (`amateur`, `excluded`, `premium`, `professional` or `unrated` when blank), ticket and banner, plus the teams that played in it with rating and record. An unknown league id returns not found.
Required: league_id.
Sampled 29 Oct 2026: 10 items. Filled in every item: id, name, tag, rating, delta, wins, losses, last_match_time and 1 more. Not in every item: logo_url (9). In the sample: last_match_time: 2026-10-25 to 2026-10-29; rating: 1,067.89 to 1,589.46, median 1,318.76; name: “GamerLegion” and 9 other values; logo_url: cdn.steamusercontent.com and 1 other host; tag: “GL” and 9 other values; delta: -21.94 to 24.38, median -2.66; wins: 5 to 1,887, median 123; losses: 11 to 1,289, median 123.
Open in Playground
GET/opendota/leaguesapiKey1 credit/request
Returns every league ID and its source name, ticket, banner and tier. The source list is large and can include historical or excluded leagues. Filter `tier` locally; `unrated` selects source rows whose tier is blank. The response echoes tier_filter. Use a returned ID with opendota_league_matches.
Optional: tier (5 allowed values: amateur, excluded, premium, professional, unrated).
Sampled 29 Oct 2026: 2484 items. Field profiles cover the first 500 checked items. Filled in every checked item: id, name, tier. In the sample: name: “MLG T.K.O.” and 492 other values.
Open in Playground
GET/opendota/liveapiKey1 credit/request
Returns OpenDota's current top live Dota 2 games: match and league IDs, team names, score, game clock, net-worth lead, player names when exposed, raw hero IDs, the upstream team code (`0` or `1`), and team slot (`1`, `2`, `3`, `4`, or `5`). The source mixes public matchmaking with tournament games; `league_id` is `0` when no league is associated, so its presence alone does not certify a professional event. `delay_seconds` and `last_update_time` report source freshness. Live player K/D/A is not provided by this endpoint. Resolve `hero_id` values with opendota_heroes.
Takes no parameters.
Sampled 28 Oct 2026: 100 items. Filled in every item: match_id, league_id, radiant_score, dire_score, radiant_lead, game_time_seconds, delay_seconds, spectators and 1 more. Not in every item: players (98), radiant_name (1), dire_name (1). In the sample: last_update_time: 2026-10-27 to 2026-10-28; radiant_score: 0 to 69, median 25; players: median 10 entries; dire_score: 0 to 74, median 26; radiant_lead: -35,576 to 57,020, median 89; game_time_seconds: -79 to 3,980, median 1,796; delay_seconds: 60 to 300, median 120; spectators: 0 to 285, median 4.
Open in Playground
GET/opendota/matchapiKey1 credit/request
Returns a compact parsed match summary and player lines for one numeric OpenDota match ID. Copy the ID from opendota_live, opendota_pro_matches, opendota_league_matches, or opendota_league_match_ids. Replay-derived player data can be absent or delayed; a missing match ID returns not found. Steam account IDs, chat logs, replay salts and raw telemetry are not returned. `hero_id` is resolved with opendota_heroes.
Required: id.
Sampled 29 Oct 2026: 10 items. Filled in every item: name, is_radiant, hero_id, kills, deaths, assists, last_hits, denies and 6 more. In the sample: kills: 0 to 12, median 4; name: “Sage of the Six Paths” and 9 other values; is_radiant: true in 5 of 10; deaths: 0 to 11, median 2; assists: 1 to 18, median 6; last_hits: 26 to 388, median 301; denies: 0 to 24, median 3; gold_per_min: 240 to 728, median 497.
Open in Playground
GET/opendota/patch-notesapiKey3 credits/request
Without `patch`, lists every patch key OpenDota has notes for (from 7_06d to the current patch) in chronological order with the number of heroes and items changed. With `patch` (for example `7_38`), returns that patch's general notes, item changes and hero changes (general, talents and per-ability notes, with the hero id and name resolved).
Optional: patch.
Sampled 29 Oct 2026: 86 items. Filled in every item: key, notes. In the sample: notes: median 2 entries.
Open in Playground
GET/opendota/pro-matchesapiKey1 credit/request
Returns professional Dota 2 match summaries with match ID, teams, league, start time, duration, scores, winner and series metadata. OpenDota returns up to 100 rows per page. Set `less_than_match_id` to a positive match ID to fetch older results; use `next_less_than_match_id` from the response for the next page. An empty cursor page is the end of history. This is recent results, not an upcoming-match schedule. Use opendota_match with one returned match ID for parsed player statistics.
Optional: less_than_match_id.
Sampled 28 Oct 2026: 100 items. Filled in every item: match_id, start_time, duration_seconds, league_id, league_name, radiant_score, dire_score, radiant_win and 1 more. Not in every item: radiant_team_id (84), radiant_name (84), dire_team_id (83), dire_name (83), series_id (81). In the sample: start_time: 2026-10-22 to 2026-10-27; duration_seconds: 1,013 to 4,619, median 2,305; radiant_win: true in 49 of 100; radiant_score: 3 to 53, median 31; dire_score: 7 to 71, median 30.
Open in Playground
GET/opendota/public-matchesapiKey2 credits/request
Returns about 100 recent ranked public Dota 2 matches with the heroes on each side, game mode, lobby type and average rank tier, optionally limited to a rank range. Rank tiers are the medal (1 Herald, 2 Guardian, 3 Crusader, 4 Archon, 5 Legend, 6 Ancient, 7 Divine, 8 Immortal) times ten plus stars 1 to 5. Page back with `less_than_match_id` set to the previous `next_less_than_match_id`. Players' account ids are not returned.
Optional: min_rank (40 allowed values: 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55, 61, 62, 63, 64, 65, 71, 72, 73, 74, 75, 81, 82, 83, 84, 85), max_rank (40 allowed values: 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55, 61, 62, 63, 64, 65, 71, 72, 73, 74, 75, 81, 82, 83, 84, 85), less_than_match_id.
Sampled 29 Oct 2026: 100 items. Filled in every item: match_id, start_time, duration_seconds, radiant_win, lobby_type, game_mode, avg_rank_tier, avg_rank_medal and 4 more. In the sample: start_time: 2026-10-29; duration_seconds: 258 to 1,920, median 1,320; radiant_win: true in 58 of 100; radiant_heroes: median 5 entries; lobby_type: 0 to 7, median 0; game_mode: 1 to 23, median 23; avg_rank_tier: 71 to 75, median 73; ranked_players: 1 to 9, median 3.
Open in Playground
GET/opendota/rank-distributionapiKey1 credit/request
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.
Takes no parameters.
Sampled 29 Oct 2026: 36 items. Filled in every item: rank_tier, medal, stars, players, cumulative_players, share_percent, cumulative_percent. In the sample: medal: Herald (5), Guardian (5), Crusader (5) and 5 more; rank_tier: 11 to 80, median 43; stars: 0 to 5, median 3; players: 9,124 to 357,865, median 259,926; cumulative_players: 9,124 to 8,753,767, median 4,713,453; share_percent: 0.1 to 4.09, median 2.97; cumulative_percent: 0.1 to 100, median 53.84.
Open in Playground
GET/opendota/recordsapiKey2 credits/request
Returns the top 100 single-match records for one stat (`kills`, `deaths`, `assists`, `last_hits`, `denies`, `gold_per_min`, `xp_per_min`, `hero_damage`, `tower_damage`, `hero_healing`, `duration`): rank, match id, start time, hero (with name) and the record value. Use opendota-match with a returned match id.
Required: field (11 allowed values: kills, deaths, assists, last_hits, denies, gold_per_min, xp_per_min, hero_damage, tower_damage, hero_healing, duration).
Sampled 29 Oct 2026: 100 items. Filled in every item: rank, match_id, start_time, hero_id, hero_name, score. In the sample: start_time: 2026-10-25 to 2026-10-29; rank: 1 to 100, median 50; hero_name: “Wraith King” and 43 other values; score: 56 to 114, median 60.
Open in Playground
GET/opendota/scenariosapiKey3 credits/request
Returns OpenDota's scenario datasets as games, wins and win rate rows, most games first. `kind` selects `item-timings` (an item bought by a time for a hero), `lane-roles` (a hero in a lane role at a time) or `misc` (courier kill, first blood and chat scenarios by side and region). Filters are validated before any upstream call: `hero_id` and `item` apply to item-timings, `hero_id` and `lane_role` to lane-roles, `scenario` to misc.
Required: kind (3 allowed values: item-timings, lane-roles, misc). Optional: hero_id, item, lane_role, scenario (4 allowed values: courier_kill, first_blood, neg_chat_1min, pos_chat_1min), limit.
Sampled 29 Oct 2026: 2 items. Filled in every item: hero_id, hero_name, item, time_seconds, games, wins, win_rate_percent. In the sample: time_seconds: 1,500 to 1,800, median 1,500; hero_name: “Anti-Mage”; item: “blink”; wins: 0 to 1, median 0; win_rate_percent: 0 to 100, median 0.
Open in Playground
GET/opendota/team-heroesapiKey1 credit/request
Returns the heroes a team has played with games, wins and win rate, sorted by games played. Heroes the team never played are omitted. An unknown team id returns not found.
Required: team_id.
Sampled 29 Oct 2026: 127 items. Filled in every item: hero_id, localized_name, games, wins, win_rate_percent. In the sample: games: 1 to 144, median 45; localized_name: “Beastmaster” and 126 other values; wins: 0 to 95, median 27; win_rate_percent: 0 to 100, median 55.1.
Open in Playground
GET/opendota/team-matchesapiKey1 credit/request
Returns a team's complete upstream match history with league, opponent, score and winner data. The source does not paginate this list; large histories can contain over a thousand rows. Use opendota_match for parsed player statistics.
Required: team_id.
Sampled 29 Oct 2026: 1268 items. Field profiles cover the first 500 checked items. Filled in every checked item: match_id, start_time, duration_seconds, league_id, league_name, radiant, radiant_score, dire_score and 4 more. Not in every checked item: opposing_team_logo_url (495). In the sample: start_time: 2025-02-26 to 2026-10-27; duration_seconds: 872 to 5,500, median 2,394; league_name: “PARI UNIVERSE by FISSURE” and 28 other values; opposing_team_logo_url: cdn.steamusercontent.com and 1 other host; radiant: true in 261 of 500; radiant_score: 2 to 54, median 25; dire_score: 2 to 63, median 24; radiant_win: true in 262 of 500.
Open in Playground
GET/opendota/team-playersapiKey1 credit/request
Returns the players who have played for a team with games played, wins and whether they are a current member, current members first. Steam account ids are not returned. An unknown team id returns not found.
Required: team_id.
Sampled 29 Oct 2026: 28 items. Filled in every item: games_played, wins, is_current_team_member. Not in every item: name (20). In the sample: games_played: 6 to 1,014, median 87; name: “Save-” and 19 other values; is_current_team_member: true in 5 of 28; wins: 1 to 590, median 33.
Open in Playground
GET/opendota/teamapiKey1 credit/request
Returns one team's OpenDota profile, tag, logo, rating, wins, losses and most recent match metadata.
Required: team_id.
Sampled 29 Oct 2026: 10 fields returned with a value. In the sample: team.last_match_time: 2026-10-27; team.rating: 1,224.29; team.name: “BETBOOM TEAM”; team.logo_url: cdn.steamusercontent.com; team.tag: “BETBOOM”; team.delta: -21.94; team.wins: 707; team.losses: 561.
Open in Playground
GET/opendota/teamsapiKey1 credit/request
Returns a zero-based page of OpenDota team records with team IDs, names, tags, ranking and recent-match metadata. OpenDota returns up to 1000 teams per page; use `next_page` while present. Use a team ID with opendota_team or opendota_team_matches.
Optional: page.
Sampled 29 Oct 2026: 1000 items. Field profiles cover the first 500 checked items. Filled in every checked item: id, rating, wins, losses, last_match_time. Not in every checked item: name (493), tag (448), logo_url (462), delta (71), last_match_id (71). In the sample: last_match_time: 2012-11-07 to 2026-10-28; rating: 1,128.25 to 1,582.82, median 1,181.19; name: “Team Yandex” and 462 other values; logo_url: cdn.steamusercontent.com and 3 other hosts; tag: “TY” and 393 other values; delta: -25.91 to 24.38, median -9.7; wins: 7 to 1,885, median 43; losses: 0 to 1,289, median 28.
Open in Playground