Atlas / Categories / Games & Comics / Dota 2 Games & Comics — entry 018 of 75
Dota 2 Verified Sep 2026
OpenDota provides open Dota 2 match, player, and hero statistics parsed from Valve's WebAPI and replay files, including hero win rates, benchmarked performance percentiles, and full match/player history. The core API is entirely keyless and free, with a 60-call-per-minute / 3,000-call-per-day limit; registering a free account for an API key only raises those limits, it doesn't gate access.
OpenDota provides open Dota 2 match, player, and hero statistics parsed from Valve's WebAPI. A live GET this run against /players/1 returned a genuine 837 B player profile at HTTP 200, content-type: application/json; charset=utf-8 — fully keyless.
dota-2 esports match-stats valve game-data
Authentication None required Call it straight away — no key, no signup.
HTTPS Supported Traffic is encrypted in transit.
CORS Enabled Callable directly from browser JavaScript.
Pricing Freemium A usable free tier exists, with paid plans for more volume.
Formats JSON Responses can be requested as JSON.
GreatAPIs Score Score 91 out of 100
Authentication 25/25 No authentication required
Pricing 17/20 Freemium tier available
Docs 20/20 Machine-readable spec file bundled
Formats 9/15 Single response format
Freshness 20/20 Verified within 6 months
Embed this badge <a href="https://greatapis.com/api/dota-2/"><img src="https://greatapis.com/badge/dota-2.svg" alt="Scored 91 on greatapis.com"></a>
Auth quickstart No API key, signup, or credit card required — the live GET above returned real player data with no auth header attached. An optional free API key only raises the rate limit; it never gates access. A keyless request this run carried x-rate-limit-remaining-minute: 57 and x-rate-limit-remaining-day: 2987, consistent with the documented 60/minute, 3,000/day keyless ceiling. Stored key No key stored Clear key
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Endpoints benchmarks 1 GET /benchmarksGET /benchmarks Parameters Name In Required Type hero_idquery yes string bracketquery no integer
Responses Status Description Schema 200Success BenchmarksResponse
constants 1 GET /constants/{resource}GET /constants Parameters Name In Required Type resourcepath yes string
Responses Status Description Schema 200Success —
distributions 1 GET /distributionsGET /distributions Responses Status Description Schema 200Success DistributionsResponse
explorer 1 GET /explorerGET /explorer Parameters Name In Required Type sqlquery no string
Responses Status Description Schema 200Success —
findMatches 1 GET /findMatchesGET / Parameters Name In Required Type teamAquery no array teamBquery no array
Responses Status Description Schema 200Success —
health 1 GET /healthGET /health Responses Status Description Schema 200Success —
hero stats 1 GET /heroStatsGET /heroStats Responses Status Description Schema 200Success —
heroes 6 GET /heroesGET /heroes Responses Status Description Schema 200Success —
GET /heroes/{hero_id}/durationsGET /heroes/{hero_id}/durations Parameters Name In Required Type hero_idpath yes integer
Responses Status Description Schema 200Success —
GET /heroes/{hero_id}/itemPopularityGET /heroes/{hero_id}/itemPopularity Parameters Name In Required Type hero_idpath yes integer
Responses Status Description Schema 200Success HeroItemPopularityResponse
GET /heroes/{hero_id}/matchesGET /heroes/{hero_id}/matches Parameters Name In Required Type hero_idpath yes integer
Responses Status Description Schema 200Success —
GET /heroes/{hero_id}/matchupsGET /heroes/{hero_id}/matchups Parameters Name In Required Type hero_idpath yes integer
Responses Status Description Schema 200Success —
GET /heroes/{hero_id}/playersGET /heroes/{hero_id}/players Parameters Name In Required Type hero_idpath yes integer
Responses Status Description Schema 200Success —
leagues 5 GET /leaguesGET /leagues Responses Status Description Schema 200Success —
GET /leagues/{league_id}GET /leagues/{league_id} Parameters Name In Required Type league_idpath yes integer
Responses Status Description Schema 200Success —
GET /leagues/{league_id}/matchIdsGET /leagues/{league_id}/matchIds Parameters Name In Required Type league_idpath yes integer
Responses Status Description Schema 200Success —
GET /leagues/{league_id}/matchesGET /leagues/{league_id}/matches Parameters Name In Required Type league_idpath yes integer
Responses Status Description Schema 200Success MatchObjectResponse
GET /leagues/{league_id}/teamsGET /leagues/{league_id}/teams Parameters Name In Required Type league_idpath yes integer
Responses Status Description Schema 200Success TeamObjectResponse
live 1 GET /liveGET /live Responses Status Description Schema 200Success —
matches 1 GET /matches/{match_id}GET /matches/{match_id} Parameters Name In Required Type match_idpath yes integer
Responses Status Description Schema 200Success MatchResponse
metadata 1 GET /metadataGET /metadata Responses Status Description Schema 200Success MetadataResponse
parsed matches 1 GET /parsedMatchesGET /parsedMatches Parameters Name In Required Type less_than_match_idquery no integer
Responses Status Description Schema 200Success —
players 15 GET /players/{account_id}GET /players/{account_id} Parameters Name In Required Type account_idpath yes integer
Responses Status Description Schema 200Success PlayersResponse
GET /players/{account_id}/countsGET /players/{account_id}/counts Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success PlayerCountsResponse
GET /players/{account_id}/heroesGET /players/{account_id}/heroes Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success —
GET /players/{account_id}/histograms/{field}GET /players/{account_id}/histograms Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string fieldpath yes string
Responses Status Description Schema 200Success —
GET /players/{account_id}/matchesGET /players/{account_id}/matches Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string projectquery no string
Responses Status Description Schema 200Success —
GET /players/{account_id}/peersGET /players/{account_id}/peers Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success —
GET /players/{account_id}/prosGET /players/{account_id}/pros Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success —
GET /players/{account_id}/rankingsGET /players/{account_id}/rankings Parameters Name In Required Type account_idpath yes integer
Responses Status Description Schema 200Success —
GET /players/{account_id}/ratingsGET /players/{account_id}/ratings Parameters Name In Required Type account_idpath yes integer
Responses Status Description Schema 200Success —
GET /players/{account_id}/recentMatchesGET /players/{account_id}/recentMatches Parameters Name In Required Type account_idpath yes integer
Responses Status Description Schema 200Success —
POST /players/{account_id}/refreshPOST /players/{account_id}/refresh Parameters Name In Required Type account_idpath yes integer
Responses Status Description Schema 200Success —
GET /players/{account_id}/totalsGET /players/{account_id}/totals Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success —
GET /players/{account_id}/wardmapGET /players/{account_id}/wardmap Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success PlayerWardMapResponse
GET /players/{account_id}/wlGET /players/{account_id}/wl Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success PlayerWinLossResponse
GET /players/{account_id}/wordcloudGET /players/{account_id}/wordcloud Parameters Name In Required Type account_idpath yes integer limitquery no integer offsetquery no integer winquery no integer patchquery no integer game_modequery no integer lobby_typequery no integer regionquery no integer datequery no integer lane_rolequery no integer hero_idquery no integer is_radiantquery no integer included_account_idquery no integer excluded_account_idquery no integer with_hero_idquery no integer against_hero_idquery no integer significantquery no integer havingquery no integer sortquery no string
Responses Status Description Schema 200Success PlayerWordCloudResponse
pro matches 1 GET /proMatchesGET /proMatches Parameters Name In Required Type less_than_match_idquery no integer
Responses Status Description Schema 200Success —
pro players 1 GET /proPlayersGET /proPlayers Responses Status Description Schema 200Success —
public matches 1 GET /publicMatchesGET /publicMatches Parameters Name In Required Type less_than_match_idquery no integer min_rankquery no integer max_rankquery no integer
Responses Status Description Schema 200Success —
rankings 1 GET /rankingsGET /rankings Parameters Name In Required Type hero_idquery yes string
Responses Status Description Schema 200Success RankingsResponse
records 1 GET /records/{field}GET /records/{field} Parameters Name In Required Type fieldpath yes string
Responses Status Description Schema 200Success —
request 2 GET /request/{jobId}GET /request/{jobId} Parameters Name In Required Type jobIdpath yes string
Responses Status Description Schema 200Success —
POST /request/{match_id}POST /request/{match_id} Parameters Name In Required Type match_idpath yes integer
Responses Status Description Schema 200Success —
scenarios 3 GET /scenarios/itemTimingsGET /scenarios/itemTimings Parameters Name In Required Type itemquery no string hero_idquery no integer
Responses Status Description Schema 200Success —
GET /scenarios/laneRolesGET /scenarios/laneRoles Parameters Name In Required Type lane_rolequery no string hero_idquery no integer
Responses Status Description Schema 200Success —
GET /scenarios/miscGET /scenarios/misc Parameters Name In Required Type scenarioquery no string
Responses Status Description Schema 200Success —
schema 1 GET /schemaGET /schema Responses Status Description Schema 200Success —
search 1 GET /searchGET /search Parameters Name In Required Type qquery yes string
Responses Status Description Schema 200Success —
teams 5 GET /teamsGET /teams Parameters Name In Required Type pagequery no integer
Responses Status Description Schema 200Success —
GET /teams/{team_id}GET /teams/{team_id} Parameters Name In Required Type team_idpath yes integer
Responses Status Description Schema 200Success TeamObjectResponse
GET /teams/{team_id}/heroesGET /teams/{team_id}/heroes Parameters Name In Required Type team_idpath yes integer
Responses Status Description Schema 200Success TeamHeroesResponse
GET /teams/{team_id}/matchesGET /teams/{team_id}/matches Parameters Name In Required Type team_idpath yes integer
Responses Status Description Schema 200Success TeamMatchObjectResponse
GET /teams/{team_id}/playersGET /teams/{team_id}/players Parameters Name In Required Type team_idpath yes integer
Responses Status Description Schema 200Success TeamPlayersResponse
top players 1 GET /topPlayersGET /topPlayers Parameters Name In Required Type turboquery no integer
Responses Status Description Schema 200Success —
Developer reference Base URL https://api.opendota.com/api
Rate limit 60 requests/minute and 3,000 requests/day per IP, unauthenticated (an API key raises the limit) -- live x-rate-limit-remaining-minute/x-rate-limit-remaining-day headers on api.opendota.com/api/status.
Key endpoints GET /players/{account_id} GET /heroStats GET /heroes GET /matches/{match_id} Gotchas & limits CORS echoes the caller's Origin instead of a wildcard — a live GET this run with Origin: https://greatapis.com returned access-control-allow-origin: https://greatapis.com, access-control-allow-credentials: true, and vary: Origin; the same GET with no Origin header carried no access-control-allow-origin at all (though access-control-allow-credentials: true was still present either way). A bare curl with no Origin showing no ACAO is expected behavior, not an outage. Rate-limit headers use a non-standard hyphenation — a live GET this run returned x-rate-limit-remaining-minute and x-rate-limit-remaining-day (not the conventional x-ratelimit-* spelling), and there is no x-rate-limit-limit and no retry-after header. The only way to infer the ceiling is by watching the remaining count decrement across calls. Unknown IDs return a clean 404, not an empty or malformed body — live GETs this run against both /players/999999999 and /matches/1 returned HTTP 404 with the identical 21 B body {"error":"Not Found"}. A valid low account ID still resolves normally, confirmed live above with /players/1 — a small numeric ID is not itself a sign of an invalid one. /players/{account_id} takes the 32-bit Dota account ID, not the 64-bit Steam ID — confirmed live above: the same profile carries account_id: 1 and steamid: "76561197960265729" side by side, and only the former works in the path.The free tier is not a trial — a live keyless GET this run to /heroStats (164,790 B) and /heroes (21,804 B) both returned full HTTP 200 datasets with no key, no truncation, and no upsell fields; registering a key only raises the 60/min, 3,000/day ceiling reported in the rate-limit headers above, it doesn't unlock additional data.
Availability Uptime 100%
Median latency 221 ms
Last check Up · 200 · Sep 2026
3 checks since Aug 2026. A person runs this check by hand, not an automated monitor.