canonical: https://jentic.com/apis/opendota.com/opendota

# OpenDota API

The OpenDota API is the open-data layer over Dota 2 match telemetry, exposing parsed match details, player histories, hero and item statistics, professional team metadata, and live league standings extracted from replay files. It supports the broader Dota 2 community's analytics tools, statistics sites, and third-party trackers with 55 endpoints spanning matches, players, heroes, items, leagues, teams, and aggregate metrics. An optional api_key query parameter raises rate limits for high-volume consumers.

## For AI agents

Retrieve Dota 2 match data, player histories, hero and item statistics, and professional league information across 55 endpoints derived from parsed game replays.

## Scope

Does not handle live in-game state, account authentication, or matchmaking actions - use for read-only Dota 2 statistics, parsed match data, and pro-scene metadata only.

## Capabilities

- Fetch full parsed match details including per-player gold, XP, and combat events via /matches/{match_id}
- Build a player profile by combining /players/{account_id}, /players/{account_id}/wl, and /players/{account_id}/recentMatches
- Retrieve a player's per-hero and per-peer statistics through /players/{account_id}/heroes and /players/{account_id}/peers
- Power leaderboards and tournament trackers using league, team, and pro-match aggregate endpoints
- Compute meta analytics from hero, item, and rank-tier aggregate stats
- Trigger fresh replay parsing for un-parsed public matches via /request/{job_id}

## Use cases

### Player Stats Dashboard

Build a Dota 2 player dashboard showing recent matches, win-loss record, hero proficiency, and top teammates. The OpenDota API exposes one player profile endpoint plus a set of nested resources (wl, recentMatches, heroes, peers, totals, counts) that combine into a complete dashboard with around six requests per profile load.

Example prompt: For account_id 76561198015862139, call /players/{id}, /players/{id}/wl, and /players/{id}/heroes and return the player's win rate plus top three heroes.

### Match Replay Analytics

Pull parsed match data including per-minute gold and XP, ability uses, kill events, and item timings via /matches/{match_id}. Used by post-game analytics sites that surface mistakes, rotations, and team-fight outcomes. If a public match is unparsed, request a parse via /request/{job_id} and poll for completion.

Example prompt: Call /matches/7456000123 and return the radiant and dire net worth at minute 20 plus the kill score at that timestamp.

### Pro Scene Tracker

Track active professional leagues, teams, and pro matches by combining league, team, and pro-match aggregate endpoints. Powers community tournament trackers that show standings, recent results, and player rosters during major events without scraping third-party sites.

Example prompt: List currently active leagues from the leagues endpoint and return their league_id, name, and tier.

### Agent-Driven Match Lookup

An AI agent answering Dota 2 questions can use Jentic to discover the right OpenDota endpoint for a query like "how did Player X do in their last 10 ranked matches?". Jentic returns /players/{account_id}/recentMatches with the input schema; the agent calls it and summarises the result. The optional api_key keeps the agent within free-tier rate limits at scale.

Example prompt: Through Jentic, find the operation for "recent matches for a player" and call it with account_id supplied by the user.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | /matches/{match_id} | Get parsed match details |
| GET | /players/{account_id} | Get a player profile |
| GET | /players/{account_id}/wl | Get a player's win-loss record |
| GET | /players/{account_id}/recentMatches | List recent matches for a player |
| GET | /players/{account_id}/heroes | Get a player's per-hero performance |
| GET | /players/{account_id}/peers | Get a player's most-played teammates |
| GET | /players/{account_id}/totals | Get aggregate per-stat totals for a player |
| GET | /players/{account_id}/counts | Get count breakdowns by lane, role, and result |

## Key resources

- **Matches** — Parsed match details including events, item builds, and per-minute timelines
- **Players** — Player profiles, win-loss, recent matches, hero and peer statistics
- **Heroes and Items** — Aggregate hero pick/win rates and item usage statistics
- **Pro Scene** — Leagues, teams, and pro-match aggregates
- **Requests** — Trigger parsing of un-parsed public match replays

## Why Jentic

- **Setup:** Wiring the OpenDota API by hand means managing the optional api_key for higher rate limits, appending it to the query string, and shaping match and player queries yourself. Through Jentic you install once, import the OpenDota API from the API Directory, store the key once, and your agent calls it.
- **Permission scoping:** The API puts the match id and account id in the URL path (/matches/{match_id}, /players/{account_id}), so a rule can pin your agent to per-player work: it can read that player's win-loss, recent matches, and hero stats. You choose the operations it may call, and since this is read-only, nothing beyond that set runs.
- **Credential handling:** Your optional OpenDota api_key is stored once, encrypted, by your own Jentic One instance and appended to the api_key query parameter at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'recent matches for a Dota 2 player' or 'parsed match details', and Jentic returns the matching OpenDota operation with its account_id or match_id schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Steam Web API** — Source of Dota 2 player and match data that OpenDota augments with replay parsing
- **Riot Games API** — Equivalent stats API for League of Legends rather than Dota 2
- **PandaScore API** — Multi-game esports data covering Dota 2 plus other titles in one API

## FAQ

### What authentication does the OpenDota API use?

OpenDota accepts an optional api_key query parameter; calls without a key fall under a lower public rate limit. Jentic stores the api_key encrypted in your Jentic One instance and appends it to each request's query string at execution, keeping the value out of the agent's prompt context.

### Can I get a player's recent matches with the OpenDota API?

Yes. Call /players/{account_id}/recentMatches to get the most recent 20 matches for a Dota 2 account, with match ID, hero, kills/deaths/assists, duration, and win flag for each. Combine with /players/{account_id}/wl for an aggregate win-loss view.

### What are the rate limits for the OpenDota API?

The free tier permits roughly 60 requests per minute and 2,000 per day; an api_key raises the daily ceiling. Heavy consumers should use OpenDota's paid plan tiers documented on the OpenDota website. On 429 responses, back off and retry.

### How do I trigger replay parsing for a match through Jentic?

Use the Jentic search query "request a Dota 2 match parse". Jentic returns /request/{job_id} with the input schema; the agent supplies the match_id and polls /request/{job_id} until the parse completes. Run it through Jentic One, the self-hosted execution layer.

### Is the OpenDota API free?

Yes, the public tier is free for individual and community use. OpenDota offers paid plans for higher rate limits and commercial use, billed per call volume.

### How do I look up a Dota 2 match by ID with the OpenDota API?

GET /matches/{match_id} returns the full match record including team and per-player stats. If parsed_at is null, the match has not yet been replay-parsed; trigger a parse via /request/{job_id} or fall back to the unparsed summary.

### Can I limit what my agent is allowed to do with the OpenDota API?

Yes. Because you run Jentic One yourself, you write the rules that decide which OpenDota operations your agent may call and which credentials it may use. The OpenDota API is read-only and puts the match ID and account ID in the URL path (/matches/{match_id}, /players/{account_id}), so you can pin an agent to per-player work such as reading a player's win-loss, recent matches, and hero stats while excluding every other endpoint. Only the operations you approve run, and your api_key stays under your control.
