Dota 2

Dota 2 — free tier with API key

🎮 GamesUNMONITORED
AUTH APIKEYCORS AGENT ?HTTPS COMMERCIAL ?

Dota 2 exposes a free-tier JSON API. Register for an API key if required; we verified a public or demo endpoint.

HOW IT'S SCORED ⓘ
Status badge · for your READMEshipapis health badge: — · unmonitored
ON PROBE SCHEDULE

We probe a documented GET and expect 2xx JSON — full uptime and health score. Open provider docs ↗

Uptime historystarts after first probe

On our probe schedule. Uptime charts appear after the first check lands.

Example responsefrom provider docs — not verified by us
GET https://api.opendota.com/api

{
  "openapi": "3.0.3",
  "info": {
    "title": "OpenDota API",
    "description": "# Introduction\nThe OpenDota API provides Dota 2 related data including advanced match data extracted from match replays.\n\nYou can find data that can be used to convert hero and ability IDs and other information provided by the API from the [dotaconstants](https://github.com/odota/dotaconstants) repository.\n\nYou can use the API without a key, but registering for a key allows increased rate limits and usage. Check out the [API page](https://www.opendota.com/api-keys) to learn more.\n    ",
    "version": "31.1.0"
  },
  "servers": [
    {
      "url": "https://api.opendota.com/api"
    }
  ],
  "components": {
    "securitySchemes": {
      "api_key": {
        "type": "apiKey",
        "name": "api_key",
        "description": "Use an API key to remove monthly call limits and to receive higher rate limits. [Learn more and get your API key](https://www.opendota.com/api-keys).\n        Usage example: https://api.opendota.com/api/matches/271145478?api_key=YOUR-API-KEY\n        \n        API key can also be sent using the authorization header \"Authorization: Bearer YOUR-API-KEY\"\n        ",
        "in": "query"
      }
    },
    "schemas": {
      "BenchmarksResponse": {
        "title": "BenchmarksResponse",
        "type": "object",
        "properties": {
          "hero_id": {
            "description": "The ID value of the hero played",
            "type": "integer"
          },
          "result": {
            "description": "result",
            "type": "object",
            "properties": {
              "gold_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "xp_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "kills_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "last_hits_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "hero_damage_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "hero_healing_per_min": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "number"
                    }
                  }
                }
              },
              "tower_damage": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "percentile": {
                      "description": "percentile",
                      "type": "number"
                    },
                    "value": {
                      "description": "value",
                      "type": "integer"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "DistributionsResponse": {
        "title": "DistributionsResponse",
        "type": "object",
        "properties": {
          "ranks": {
            "description": "ranks",
            "type": "object",
            "properties": {
              "rows": {
                "description": "rows",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "bin": {
                      "description": "bin",
                      "type": "integer"
                    },
                    "bin_name": {
                      "description": "bin_name",
                      "type": "integer"
                    },
                    "count": {
                      "description": "count",
                      "type": "integer"
                    },
                    "cumulative_sum": {
                      "description": "cumulative_sum",
                      "type": "integer"
                    }
                  }
                }
              },
              "sum": {
                "description": "sum",
                "type": "object",
                "properties": {
                  "count": {
                    "description": "count",
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "HeroDurationsResponse": {
        "title": "HeroDurationsResponse",
        "type": "object",
        "properties": {
          "duration_bin": {
            "description": "Lower bound of number of seconds the match lasted",
            "type": "string"
          },
          "games_played": {
            "description": "Number of games played",
            "type": "integer"
          },
          "wins": {
            "description": "Number of wins",
            "type": "integer"
          }
        }
      },
      "HeroItemPopularityResponse": {
        "title": "HeroItemPopularityResponse",
        "type": "object",
        "properties": {
          "start_game_items": {
            "description": "Items bought before game started",
            "type": "object",
            "properties": {
              "item": {
                "description": "Number of item bought",
                "type": "integer"
              }
            }
          },
          "early_game_items": {
            "description": "Items bought in the first 10 min of the game, with cost at least 700",
            "type": "object",
            "properties": {
              "item": {
                "description": "Number of item bought",
                "type": "integer"
              }
            }
          },
          "mid_game_items": {
            "description": "Items bought between 10 and 25 min of the game, with cost at least 2000",
            "type": "object",
            "properties": {
              "item": {
                "description": "Number of item bought",
                "type": "integer"
              }
            }
          },
          "late_game_items": {
            "description": "Items bought at least 25 min after game started, with cost at least 4000",
            "type": "object",
            "properties": {
              "item": {
                "description": "Number of item bought",
                "type": "integer"
              }
            }
          }
        }
      },
      "HeroMatchupsResponse": {
        "title": "HeroMatchupsResponse",
        "type": "object",
        "properties": {
          "hero_id": {
            "description": "The ID value of the hero played",
            "type": "integer"
          },
          "games_played": {
            "description": "Number of games played",
            "type": "integer"
          },
          "wins": {
            "description": "Number of games won",
            "type": "integer"
          }
        }
      },
      "HeroObjectResponse": {
        "title": "HeroObjectResponse",
        "type": "object",
        "properties": {
          "id": {
            "description": "The ID value of the hero played",
            "type": "integer"
          },
          "name": {
            "description": "Dota hero command name",
            "type": "string",
            "example": "npc_dota_hero_antimage"
          },
          "localized_name": {
            "description": "Hero name",
            "type": "string",
            "example": "Anti-Mage"
          },
          "primary_attr": {
            "description": "Hero primary shorthand attribute name, e.g. 'agi'",
            "type": "string"
          },
          "attack_type": {
            "description": "Hero attack type, either 'Melee' or 'Ranged'",
            "type": "string"
          },
          "roles": {
            "type": "array",
            "items": {
              "description": "A hero's role in the game",
              "type": "string"
            }
          }
        },
        "required": [
          "id"
        ]
      },
      "HeroStatsResponse": {
        "title": "HeroStatsResponse",
        "type": "object",
        "properties": {
          "id": {
            "description": "The ID value of the hero played",
            "type": "integer"
          },
          "name": {
            "description": "Dota hero command name",
            "type": "string",
            "example": "npc_dota_hero_antimage"
          },
          "localized_name": {
            "description": "Hero name",
            "type": "string",
            "example": "Anti-Mage"
          },
          "primary_attr": {
            "description": "primary_attr",
            "type": "string"
          },
          "attack_type": {
            "description": "attack_type",
            "type": "string"
          },
          "roles": {
            "description": "roles",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "img": {
            "description": "img",
            "type": "string"
          },
          "icon": {
            "description": "icon",
            "type": "string"
          }
        }
      },
      "LeagueObjectResponse": {
        "title": "LeagueObjectResponse",
        "type": "object",
        "properties": {
          "leagueid": {
            "description": "leagueid",
            "type": "integer"
          },
          "ticket": {
            "description": "ticket",
            "type": "string"
          },
          "banner": {
            "description": "banner",
            "type": "string"
          },
          "tier": {
            "description": "tier",
            "type": "string"
          },
          "name": {
            "description": "League name",
            "type": "string",
            "example": "ASUS ROG DreamLeague Season 4"
          }
        }
      }
    },
    "parameters": {
      "heroIdPathParam": {
        "name": "hero_id",
        "in": "path",
        "description": "Hero ID",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "leagueIdPathParam": {
        "name": "league_id",
        "in": "path",
        "description": "League ID",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "matchIdParam": {
        "name": "match_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "lessThanMatchIdParam": {
        "name": "less_than_match_id",
        "in": "query",
        "description": "Get matches with a match ID lower than this value",
        "required": false,
        "schema": {
          "type": "integer"
        }
      },
      "minRankParam": {
        "name": "min_rank",
        "in": "query",
        "description": "Minimum rank for the matches. Ranks are represented by integers (10-15: Herald, 20-25: Guardian, 30-35: Crusader, 40-45: Archon, 50-55: Legend, 60-65: Ancient, 70-75: Divine, 80: Immortal). Each increment represents an additional star.",
        "required": false,
        "schema": {
          "type": "integer"
        }
      },
      "maxRankParam": {
        "name": "max_rank",
        "in": "query",
        "description": "Maximum rank for the matches. Ranks are represented by integers (10-15: Herald, 20-25: Guardian, 30-35: Crusader, 40-45: Archon, 50-55: Legend, 60-65: Ancient, 70-75: Divine, 80: Immortal). Each increment represents an additional star.",
        "required": false,
        "schema": {
          "type": "integer"
        }
      },
      "accountIdParam": {
        "name": "account_id",
        "in": "path",
        "description": "Steam32 account ID",
        "required": true,
        "schema": {
          "type": "integer"
        }
      },
      "fieldParam": {
        "name": "field",
        "in": "path",
        "description": "Field to aggregate on",
        "required": true,
        "schema": {
          "type": "string"
        }
      }
    }
  },
  "paths": {
    "/matches/{match_id}": {
      "get": {
        "operationId": "get_matches_by_match_id",
        "summary": "GET /matches/{match_id}",
        "description": "Match data",
        "tags": [
          "matches"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/matchIdParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "$ref": "#/components/schemas/MatchResponse"
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}": {
      "get": {
        "operationId": "get_players_by_account_id",
        "summary": "GET /players/{account_id}",
        "description": "Player data",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "$ref": "#/components/schemas/PlayersResponse"
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/wl": {
      "get": {
        "operationId": "get_players_by_account_id_select_wl",
        "summary": "GET /players/{account_id}/wl",
        "description": "Win/Loss count",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          },
          {
            "$ref": "#/components/parameters/limitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "$ref": "#/components/schemas/PlayerWinLossResponse"
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/recentMatches": {
      "get": {
        "operationId": "get_players_by_account_id_select_recent_matches",
        "summary": "GET /players/{account_id}/recentMatches",
        "description": "Recent matches played (limited number of results)",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "items": {
                      "$ref": "#/components/schemas/PlayerRecentMatchesResponse"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/matches": {
      "get": {
        "operationId": "get_players_by_account_id_select_matches",
        "summary": "GET /players/{account_id}/matches",
        "description": "Matches played (full history, and supports column selection)",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          },
          {
            "$ref": "#/components/parameters/limitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PlayerMatchesResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/heroes": {
      "get": {
        "operationId": "get_players_by_account_id_select_heroes",
        "summary": "GET /players/{account_id}/heroes",
        "description": "Heroes played",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          },
          {
            "$ref": "#/components/parameters/limitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PlayerHeroesResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/peers": {
      "get": {
        "operationId": "get_players_by_account_id_select_peers",
        "summary": "GET /players/{account_id}/peers",
        "description": "Players played with",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          },
          {
            "$ref": "#/components/parameters/limitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PlayerPeersResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/players/{account_id}/pros": {
      "get": {
        "operationId": "get_players_by_account_id_select_pros",
        "summary": "GET /players/{account_id}/pros",
        "description": "Pro players played with",
        "tags": [
          "players"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/accountIdParam"
          },
          {
            "$ref": "#/components/parameters/limitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json; charset=utf-8": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PlayerProsResponse"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
Call itcurl · fetch · python
curl "https://api.opendota.com/api"
const res = await fetch("https://api.opendota.com/api");
const data = await res.json();
console.log(data);
import requests

res = requests.get("https://api.opendota.com/api")
print(res.json())
Endpoints · 2On scheduleFULL DOCS ↗
On schedule — GET /api awaits first probe
GET/apiPROBED

Dota 2 — free tier with API key

GET/api?limit=5

Paginated variant with limit parameter.

Machine-readable spec

We probe a documented GET and expect 2xx JSON — full uptime and health score. Export includes every documented route below.

Response-shape history

Not tracked yet. Shape-change history starts once this API joins our probe schedule.

Dota 2: common questions

Is Dota 2 free to use?

Yes — Dota 2 is a free games API. Free tier: Free tier — key may be required. Whether the free tier allows commercial use is unclear — check the provider docs.

Does Dota 2 need an API key?

Yes — Dota 2 needs a free API key, which you pass on each request. Rate limits: Unpublished.

Can I call Dota 2 from the browser?

Yes — Dota 2 returns CORS headers over HTTPS, so front-end code can fetch it directly with no backend proxy. Use the fetch snippet on this page, or hit "Run live" to try it now.

Is Dota 2 up right now?

Dota 2 is catalogued but not yet on our probe schedule, so we don't publish a live status for it. Check the provider's own status page or docs for its current state.