OpenDota Dota 2 Pro Matches Scraper avatar

OpenDota Dota 2 Pro Matches Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
OpenDota Dota 2 Pro Matches Scraper

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

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

ParseForge Banner

🎮 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 scientistsTracking pro match results and meta trends
Dota 2 content creators and streamersBuilding recap feeds and stat overlays
Betting and odds modelersBacktesting team and hero performance
Fantasy and community tool buildersPowering 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

FieldTypeDescription
endpointselectWhich OpenDota dataset to collect. One of pro-matches, hero-stats, pro-players, teams. Default pro-matches.
maxItemsintegerHow 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.

FieldDescription
🆔 matchIdUnique OpenDota match identifier
🏆 leagueId / leagueNameLeague the game was played in
🟢 radiantTeamId / radiantTeamRadiant side team ID and name
🔴 direTeamId / direTeamDire side team ID and name
🏅 winnerWinning side, Radiant or Dire
🔢 radiantScore / direScoreKill score for each side
duration / durationSecondsReadable match length and raw seconds
🕒 startTimeMatch start time in ISO format
📦 seriesId / seriesTypeSeries identifier and type
🕒 scrapedAtWhen the record was collected
errorNull 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

ApproachSetupMaintenanceClean output
This ActorPick a mode and runNone on your sideNormalized fields, ready to use
Raw OpenDota API callsWrite code, handle rate limitsYou maintain itRaw epochs and snake_case keys
Manual site browsingSlow and manualHighCopy and paste only

🚀 How to use

  1. Create a free Apify account using this sign-up link.
  2. Open the OpenDota Pro Matches Scraper in the Apify Console.
  3. Pick a Data Type. Leave it on Pro Matches for recent professional games.
  4. Set Max Items, then click Start.
  5. When the run finishes, open the dataset to view and export your records.

💼 Business use cases

Esports analytics

GoalHow this helps
Track recent resultsPull the latest pro matches with winner and score
Spot meta shiftsCompare hero pick, ban, and win rates over time

Betting and modeling

GoalHow this helps
Backtest modelsFeed historical match outcomes into your pipeline
Rank teamsUse the Teams feed rating, wins, and losses

Content and media

GoalHow this helps
Build recap feedsTurn match rows into automated summaries
Power overlaysDrive stream graphics with hero and team data

Community tools

GoalHow this helps
Player directoriesList registered pros with team and country
LeaderboardsSort 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.

💡 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.