OpenDota Dota 2 Pro Matches Scraper
Pricing
from $2.00 / 1,000 results
OpenDota Dota 2 Pro Matches Scraper
Pull recent Dota 2 professional matches from the OpenDota feed with match ID, league, both team names, the winning side, final score, and match length. Switch modes for hero pick and win rates, pro players, or ranked teams. Great for esports analytics, betting models, and recap feeds.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
ParseForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share

🎮 OpenDota Pro Matches Scraper
🚀 Export recent Dota 2 professional matches in one run. Pull the latest 100 pro games with team names, league, score, winner, and duration, plus hero stats, pro players, and ranked teams.
🕒 Last updated: 2026-06-04 · 📊 16 fields per pro match record · 4 data modes · Global Dota 2 esports coverage
The OpenDota Pro Matches Scraper turns the public OpenDota API into clean, ready-to-use rows of Dota 2 esports data. Point it at the Pro Matches feed for recent professional games, or switch the Data Type input to pull hero pick and win rates, the registered pro player roster, or ranked professional teams.
Coverage spans the live OpenDota dataset, the same data that powers community match analysis. Pro Matches returns the most recent professional games across every active league. Hero Stats covers all 127 current heroes. The Pro Players roster holds thousands of registered players, and the Teams feed ranks a thousand professional teams by rating.
| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Esports analysts and data scientists | Tracking pro match results and meta trends |
| Dota 2 content creators and streamers | Building recap feeds and stat overlays |
| Betting and odds modelers | Backtesting team and hero performance |
| Fantasy and community tool builders | Powering rosters, leaderboards, and dashboards |
📋 What the OpenDota Pro Matches Scraper does
This Actor reads the OpenDota public API and returns a clean per-record shape for whichever Data Type you pick.
- Pro Matches (default) returns recent professional games with match ID, league, both team names, the winning side, both scores, a readable duration, and an ISO start time.
- Hero Stats returns every hero with primary attribute, attack type, roles, and pro pick, win, ban, and win rate counts plus public and turbo play counts.
- Pro Players returns registered professional players with name, persona, team, country, and last match time.
- Teams returns ranked professional teams with rating, wins, losses, and last match time.
Each mode keeps its own focused field set, so you never get a wide table full of empty columns.
🎬 Full Demo (🚧 Coming soon)
⚙️ Input
| Field | Type | Description |
|---|---|---|
endpoint | select | Which OpenDota dataset to collect. One of pro-matches, hero-stats, pro-players, teams. Default pro-matches. |
maxItems | integer | How many records to return. Free plan is capped at 10. Paid plans go up to 1,000,000. |
Example 1 — Recent pro matches
{"endpoint": "pro-matches","maxItems": 50}
Example 2 — Hero pick and win stats
{"endpoint": "hero-stats","maxItems": 127}
⚠️ Good to Know: The OpenDota free API is rate limited to roughly 60 calls per minute. This Actor makes a single call per run, so you stay well inside that limit. Team names in Pro Matches can be empty for ad-hoc or unregistered squads, so those two fields are kept and can be null on individual rows.
📊 Output
Each Pro Matches record contains the following fields.
| Field | Description |
|---|---|
🆔 matchId | Unique OpenDota match identifier |
🏆 leagueId / leagueName | League the game was played in |
🟢 radiantTeamId / radiantTeam | Radiant side team ID and name |
🔴 direTeamId / direTeam | Dire side team ID and name |
🏅 winner | Winning side, Radiant or Dire |
🔢 radiantScore / direScore | Kill score for each side |
⏱ duration / durationSeconds | Readable match length and raw seconds |
🕒 startTime | Match start time in ISO format |
📦 seriesId / seriesType | Series identifier and type |
🕒 scrapedAt | When the record was collected |
❌ error | Null on success, message on failure |
Real sample records (Pro Matches)
{"matchId": 8838575634,"leagueId": 19752,"leagueName": "Immigrant Night Club #1","radiantTeamId": null,"radiantTeam": null,"direTeamId": 9337762,"direTeam": "gway toe","winner": "Dire","radiantScore": 32,"direScore": 52,"duration": "35:44","durationSeconds": 2144,"startTime": "2026-06-04T18:57:34.000Z","seriesId": 0,"seriesType": 0,"scrapedAt": "2026-06-04T19:58:02.985Z","error": null}
{"matchId": 8838571851,"leagueId": 18867,"leagueName": "Ultras Dota Pro League 2025-26","radiantTeamId": 9717312,"radiantTeam": "Silent Shadows","direTeamId": 9828921,"direTeam": "Air Defence","winner": "Radiant","radiantScore": 57,"direScore": 19,"duration": "25:01","durationSeconds": 1501,"startTime": "2026-06-04T18:54:13.000Z","seriesId": 1106113,"seriesType": 1,"scrapedAt": "2026-06-04T19:58:02.986Z","error": null}
{"matchId": 8838520571,"leagueId": 19699,"leagueName": "Road To EWC 2026 Regional Qualifiers","radiantTeamId": 10164102,"radiantTeam": "Stormrage","direTeamId": 10144722,"direTeam": "IGNITE","winner": "Dire","radiantScore": 5,"direScore": 39,"duration": "25:51","durationSeconds": 1551,"startTime": "2026-06-04T18:22:50.000Z","seriesId": 1106075,"seriesType": 1,"scrapedAt": "2026-06-04T19:58:02.986Z","error": null}
The Hero Stats mode returns rows like this.
{"heroId": 2,"name": "Axe","primaryAttribute": "str","attackType": "Melee","roles": ["Initiator", "Durable", "Disabler", "Carry"],"proPick": 142,"proWin": 72,"proBan": 158,"proWinRate": 50.7,"pubPick": 661914,"pubWin": 353171,"turboPicks": 235932,"turboWins": 123314,"scrapedAt": "2026-06-04T19:58:20.826Z","error": null}
✨ Why choose this Actor
- Four datasets, one Actor. Switch between pro matches, hero stats, pro players, and teams from a single dropdown.
- Clean per-mode rows. Each mode returns only the fields that belong to it, so your tables stay readable.
- Human-friendly values. Start times become ISO timestamps and match length becomes a readable mm:ss string, with raw seconds kept too.
- No key required. OpenDota is free and keyless, so there is nothing to register or rotate.
- Honest field set. Team names that the source leaves empty are kept and clearly null, never faked.
📈 How it compares to alternatives
| Approach | Setup | Maintenance | Clean output |
|---|---|---|---|
| This Actor | Pick a mode and run | None on your side | Normalized fields, ready to use |
| Raw OpenDota API calls | Write code, handle rate limits | You maintain it | Raw epochs and snake_case keys |
| Manual site browsing | Slow and manual | High | Copy and paste only |
🚀 How to use
- Create a free Apify account using this sign-up link.
- Open the OpenDota Pro Matches Scraper in the Apify Console.
- Pick a Data Type. Leave it on Pro Matches for recent professional games.
- Set Max Items, then click Start.
- When the run finishes, open the dataset to view and export your records.
💼 Business use cases
Esports analytics
| Goal | How this helps |
|---|---|
| Track recent results | Pull the latest pro matches with winner and score |
| Spot meta shifts | Compare hero pick, ban, and win rates over time |
Betting and modeling
| Goal | How this helps |
|---|---|
| Backtest models | Feed historical match outcomes into your pipeline |
| Rank teams | Use the Teams feed rating, wins, and losses |
Content and media
| Goal | How this helps |
|---|---|
| Build recap feeds | Turn match rows into automated summaries |
| Power overlays | Drive stream graphics with hero and team data |
Community tools
| Goal | How this helps |
|---|---|
| Player directories | List registered pros with team and country |
| Leaderboards | Sort teams by current rating |
🔌 Automating OpenDota Pro Matches Scraper
Connect the Actor output to the tools you already use.
- Make and Zapier can trigger on each run and route records onward.
- Slack can receive match recap notifications.
- Airbyte can sync the dataset into your warehouse.
- GitHub Actions can run the scraper on a schedule.
- Google Drive can store snapshots of each run.
🌟 Beyond business use cases
- Research. Study how hero pick and ban patterns evolve across patches.
- Personal. Follow your favorite teams and keep a private match log.
- Non-profit. Power free community stat sites for amateur leagues.
- Experimentation. Prototype a Dota 2 prediction model with real outcomes.
🤖 Ask an AI assistant
Paste your dataset into an assistant and ask it to summarize.
❓ Frequently Asked Questions
Where does the data come from? The public OpenDota API at api.opendota.com, which mirrors Dota 2 match data.
Do I need an API key? No. OpenDota is free and keyless for this data.
How many modes are there? Four. Pro Matches, Hero Stats, Pro Players, and Teams.
How recent are the pro matches? The Pro Matches feed returns the most recent professional games, refreshed by OpenDota as new games finish.
Why are some team names empty? OpenDota leaves the team name blank for ad-hoc or unregistered squads. Those fields are kept and shown as null rather than guessed.
What does the winner field mean? It reads Radiant or Dire, the side that won the game, derived from the source win flag.
Why is duration shown twice? You get a readable mm:ss string and the raw seconds value, so both display and math are easy.
Is there a rate limit? OpenDota allows roughly 60 calls per minute. This Actor makes one call per run, so you stay well under it.
How many records can I get? Free plans return up to 10 records. Paid plans return up to 1,000,000.
Can I schedule it? Yes. Use the Apify scheduler or any external scheduler to run it on an interval.
What time zone are timestamps in? All timestamps are normalized to ISO 8601 in UTC.
Is this affiliated with Valve or OpenDota? No. It is an independent tool that reads only publicly available data.
🔌 Integrate with any app
Every run writes to a structured dataset you can pull through the Apify API or connect to Make, Zapier, and other platforms, so the data flows straight into your own apps and workflows.
🔗 Recommended Actors
- Understat xG Scraper for football expected goals data.
- Steam Store Scraper for PC game listings and details.
- OpenCritic Games Scraper for game review scores.
- Speedrun Leaderboards Scraper for speedrun records.
- RAWG Scraper for a broad video game database.
💡 Pro Tip: browse the complete ParseForge collection.
🆘 Need Help? Open our contact form
⚠️ Disclaimer: This is an independent tool, not affiliated with OpenDota or Valve. Only publicly available data is collected.