Professional match monitoring
OpenDotaエンドポイントを使えば、「Professional match monitoring」をドキュメント化された入力とJSONレスポンスによる再現可能なAPIリクエストに変えられます。
Join Dota 2 hero and match records across live games, professional feeds, ranked public matches, lineup queries, and replay-aware detail.
Collect OpenDota hero, live-game, professional and public-match, lineup-search, and match-detail data as structured JSON.
エンドポイントファミリー
6
ドキュメント化されたパラメータ
18
サンプル数
8
ライブカタログスナップショット
稼働エンドポイント
8
メソッド
GET
必須パラメータ
10
スキーマ参照
8
{
"platform": "OpenDota",
"endpoint": "opendota-pro-matches",
"method": "GET",
"path": "/opendota/pro-matches",
"auth": "apiKey"
}ユースケース
Collect OpenDota hero, live-game, professional and public-match, lineup-search, and match-detail data as structured JSON.
OpenDotaエンドポイントを使えば、「Professional match monitoring」をドキュメント化された入力とJSONレスポンスによる再現可能なAPIリクエストに変えられます。
OpenDotaエンドポイントを使えば、「Live Dota 2 game discovery」をドキュメント化された入力とJSONレスポンスによる再現可能なAPIリクエストに変えられます。
OpenDotaエンドポイントを使えば、「Hero and match analytics」をドキュメント化された入力とJSONレスポンスによる再現可能なAPIリクエストに変えられます。
マネージド実行
以下の数値はすべて、稼働中のOpenDotaエンドポイントカタログから取得しています(エンドポイント8件、ドキュメント化されたリクエストパラメータ18個、公開レスポンススキーマ8件)。DocsとPlaygroundが参照しているカタログと同じものです。
OpenDotaのエンドポイントは8件、8つのリクエストファミリーに分類されています(Find Matches、Hero Descriptions、Hero Matchesほか5件)。
これらのOpenDotaエンドポイントには18個のリクエストパラメータがドキュメント化されており、うち10個が必須です。統合コードを書く前に入力仕様をすべて確認できます。
8件のOpenDotaエンドポイントのうち8件が実際のサンプルレスポンスを、8件がドキュメント化されたレスポンススキーマを備えています。最初のリクエストの前に実データの形に合わせて実装できます。
OpenDotaのエンドポイントは成功時のスキーマに加えてエラーレスポンス(400、404、429、503)もドキュメント化しています。ブロック、レート制限、レコード欠損は空データではなく型付きのエラーとして返ります。
OpenDotaのエンドポイントは8個のホスト型MCPツールとして提供されており、エージェントは同じパラメータと同じJSON契約のまま、追加の実装なしに同じルートを呼び出せます。
カバレッジマップ
/opendota/find-matches
/opendota/hero-descriptions
/opendota/hero-matches
/opendota/heroes
/opendota/live
/opendota/match
エンドポイントカタログ
/opendota/pro-matchesReturns 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.
レスポンスに関する注記
- OpenDota returns up to 100 rows per page. The first page contains recent results; use the cursor to read older history. This is not an upcoming-match schedule. - `count` is the number of matches in this page. - `less_than_match_id` must be a positive ID. Zero, negative or non-numeric values return HTTP 400 with an invalid-parameter error. - `next_less_than_match_id` is the lowest `match_id` in the returned page. Pass it as `less_than_match_id` to fetch the next page. An empty cursor page is a valid end-of-history response; an unexpectedly empty unfiltered response is reported as an upstream data gap. - `start_time` is UTC in RFC 3339 format. `duration_seconds` is the match length. - `radiant_win` is the upstream result boolean. `true` means Radiant won; `false` means Dire won. It is omitted if the source has no result yet. - Copy a `match_id` into [opendota-match](opendota-match.md) for the compact match summary and any parsed player lines. - The endpoint caches results for up to 15 minutes.
MCPツール opendota_pro_matches
/opendota/liveReturns 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.
レスポンスに関する注記
- The response can include ordinary public matchmaking and tournament games. `league_id` is `0` when no league is associated; a nonzero ID does not by itself prove a professional event. - `delay_seconds` and `last_update_time` describe the source snapshot. The source is best-effort and its observed delay varied. A missing update time stays omitted; a zero timestamp remains zero. - Player `team_code` values are `0` and `1`. `team_slot` values are `1`, `2`, `3`, `4`, and `5`. These are raw OpenDota codes. - `hero_id` is an OpenDota hero identifier. Use [opendota-heroes](opendota-heroes.md) to resolve the current IDs and names. - The source does not provide live player K/D/A on this endpoint. An empty `matches` list is valid when no games are live. - The endpoint caches the source snapshot for up to one minute to stay within OpenDota's anonymous API limits.
MCPツール opendota_live
/opendota/heroesReturns 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`).
レスポンスに関する注記
- The response contains every current hero supplied by OpenDota. The set and count may change with game updates. - `primary_attr` has these values: `agi`, `all`, `int`, `str`. - `attack_type` has these values: `Melee`, `Ranged`. - The endpoint caches the directory for up to 24 hours.
MCPツール opendota_heroes
/opendota/matchReturns 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.
レスポンスに関する注記
- The response includes the teams, league, patch, score, result and parsed player lines where available. - Replay parsing is optional and can arrive several minutes after a match. If OpenDota has not parsed the replay, `players` is omitted. A match whose replay is unavailable may have only the match summary. - Player `hero_id` values come from OpenDota's current hero index; use [opendota-heroes](opendota-heroes.md) to resolve them. - Account IDs, chat logs, replay salts, replay URLs and raw telemetry are not returned. - The source detail is cached for up to one minute.
MCPツール opendota_match
/opendota/find-matchesReturns 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.
レスポンスに関する注記
- At least one hero id is required across `team_a` and `team_b`. A non-number, an id that is not in `opendota-heroes`, a repeated id or more than five ids on one side returns `400` before any search. - OpenDota returns each match with a fixed orientation: `radiant` and `dire` lineups (hidden slots are left out) and `radiant_win`. Your `team_a` heroes can be on either side, so each match also has `team_a_side` (`radiant` or `dire`) and `team_a_win`, worked out from where the `team_a` heroes were; both are omitted when `team_a` is empty. - The response is cached for up to five minutes.
MCPツール opendota_find_matches
/opendota/hero-descriptionsReturns, 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.
レスポンスに関する注記
- Each hero has `hero_id`, `name` (the internal `npc_dota_hero_*` name), `key` (the name without the prefix, which is also the lore key), `scepter` and `shard`. Each upgrade has `available`, `description`, `skill_name` (the ability it changes) and `new_skill` (true when the upgrade adds an ability). - A hero with no Scepter or Shard upgrade has `available: false` and an empty description. Descriptions are the tooltip text from the game files and can contain `%` placeholders for values. - With `include_lore=false` the lore table is not fetched at all. - Built from the dotaconstants tables `aghs_desc` and `hero_lore`. The response is cached for up to a day and costs two credits.
MCPツール opendota_hero_descriptions
/opendota/hero-matchesReturns 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.
レスポンスに関する注記
- Each match has the side the hero played (`played_radiant`), `won`, kills, deaths, assists, duration and, for league games, `league_id` and `league_name`. Players' account ids are never returned. - An unknown hero id returns `404`. The response is cached for up to five minutes.
MCPツール opendota_hero_matches
/opendota/public-matchesReturns 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.
レスポンスに関する注記
- Each match has `radiant_heroes` and `dire_heroes` (hero id and localized name). Hidden slots are left out, so a lineup can be shorter than five or empty. - `avg_rank_tier` and `avg_rank_medal` describe the match's ranked players (`ranked_players` is how many were ranked). Players' account ids are never returned. - `lobby_type` and `game_mode` are the numeric ids described by [opendota-constants](opendota-constants.md). The response is cached for up to five minutes.
MCPツール opendota_public_matches
関連API
Sports & Gaming
Browse public sports and event data from FanDuel Sportsbook. Discover market-specific event types, follow a league or schedule, and read the markets and prices FanDuel publishes for that event and market.
Sports & Gaming
Follow public horse-racing cards across tracks and countries. Discover today's tracks, inspect races and runners, and read official results, wager-type reference data, and published pool information without placing a wager.
Sports & Gaming
Explore FanDuel Research's public editorial and sports-data surfaces. Discover sport slugs and teams, read articles and player updates, inspect live fixtures, and retrieve the published projection tables with their source-specific slate identifiers.
OpenDotaのスクレイピング方法
OpenDota describes itself as a volunteer-developed, open-source Dota 2 data platform; its FAQ explains that basic public-match data is broader than replay-derived detail, which may cover only a subset and arrive minutes later. Players must enable Dota 2's Expose Public Match Data setting before their public matches appear. This landing highlights eight production-validated routes from OpenDota's larger catalog: hero discovery, live games, professional and ranked public matches, lineup search, hero ability descriptions and histories, and match detail. On 2026-10-29, hero-match and rank-filtered public-match responses each returned 100 rows with a usable pagination cursor; match detail also returned HTTP 200 for the current valid-ID canary. One direct lineup-search request returned HTTP 503 during the same day's research, so treat upstream errors as transient and do not interpret them as an empty lineup. Keep fetched_at and returned IDs; missing replay fields are not zero stats.
/opendota/heroes returns Dota hero identifiers and names for joins. Retain the numeric hero_id values exactly; hero statistics and match records use those IDs rather than display names.
/opendota/live returns games visible at request time, without a page or cursor parameter. Polling the endpoint creates successive observations, not a durable event history. Store fetched_at and deduplicate by the source's match identifier.
/opendota/pro-matches returns a recent list of up to 100 records and a next_less_than_match_id cursor. Pass that returned value as less_than_match_id for older matches; don't invent IDs or increment the cursor yourself.
/opendota/find-matches accepts up to five hero IDs for each team and needs at least one side; obtain IDs from `/opendota/heroes`. `/opendota/hero-matches` takes one positive `hero_id` and returns about 100 recent public and professional appearances, not a full archive.
/opendota/public-matches accepts `min_rank` and `max_rank` tiers from medal × 10 plus stars, and a `less_than_match_id` cursor from the previous response. A production sample for ranks 71–85 returned 100 rows; reuse its next cursor instead of incrementing or inventing IDs.
Pass a match ID returned by a feed to `/opendota/match`; the valid-ID canary returned 200 on 2026-10-29. `/opendota/hero-descriptions` returns one hero or all 127, and `include_lore=true` adds a much larger lore table. A successful detail response still may lack replay-derived fields.
OpenDota's FAQ says players must enable Expose Public Match Data, while replay parsing covers only a subset and can lag. A 503 from lineup search is an upstream error, not a zero-match result; back off rather than increasing request volume.
FAQ
No. Its FAQ distinguishes broad public-match data from replay parsing, which supplies additional detail for only a subset and may arrive minutes later.
OpenDota says the player must enable Expose Public Match Data in the Dota 2 client; matches played before enabling it may not appear in the public profile data.
Yes. Follow next_less_than_match_id from a response into less_than_match_id on the next request. The current route returns a bounded recent page rather than a full archive.
No. Basic public data is broader than replay parsing, which OpenDota says may be missing or arrive minutes later. The match-detail canary returned 200 on 2026-10-29, but that does not guarantee parsed fields for every match.
A direct 2026-10-29 sample returned HTTP 503 although the route also had an UP ordinary heartbeat. Back off, keep source error and empty-result cases distinct, and do not treat the failure as a successful empty search.