ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds
Pricing
from $2.00 / 1,000 results
ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds
Extract ESPN sports data in bulk: live and historical scores, boxscores, odds, standings, schedules, rosters and player gamelogs, 17 leagues. Flat CSV, Excel and pandas output. Run via API, schedule runs, or integrate with other tools and AI workflows. By MrBridge (mr-bridge.com)
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
MrBridge
Maintained by CommunityActor stats
0
Bookmarked
113
Total users
29
Monthly active users
a day ago
Last modified
Categories
Features
Share
ESPN Sports Data Scraper
Extract sports data from ESPN in bulk: full-season scores, boxscores, play-by-play, betting odds, standings, schedules, rosters, athletes and multi-season player gamelogs. Output is flat, snake_case and ready for pandas, Excel or Kaggle. It reads ESPN's public JSON API directly (no HTML parsing, no browser), so it is fast and needs no API key.
This is the batch companion to the interactive ESPN MCP Server. Use the MCP server for real-time, on-demand questions from an AI agent. Use this Actor to pull whole seasons into a dataset for analysis.
Features
- Eleven data types in one Actor: scoreboard, game summary, play-by-play, player boxscore, schedule, teams, standings, roster, athletes, athlete gamelog and news.
- Seventeen leagues: NFL, NCAA Football (FBS), NBA, WNBA, NCAA Men's and Women's Basketball, MLB, NHL, six soccer leagues, two UEFA cups and the FIFA World Cup.
- Full seasons in one run: pick a season or a date range, one row per game. Season type defaults to All (preseason, regular season and playoffs).
- Play-by-play: one row per play, for the leagues that support it (see the table below). Football plays are read from each drive.
- Betting odds: the
includeOddssetting addshas_odds,favorite,spread,over_underand both moneylines to scoreboard rows at no extra request. Game summary rows carry them too when ESPN kept the lines. - Chained game details:
withGameDetailsadds up to one game-summary row per scoreboard game, so you get scores and team boxscores in a single run. - Flat or raw output: flat snake_case rows by default, the raw ESPN JSON fragment with
outputFormatset toraw, or both. - Safe spend: a result limit caps the cost of a run, an empty game costs nothing, and a failed lookup is reported in the
OUTPUTrecord and never billed. - No API key, no browser: the Actor reads ESPN's public JSON API directly, with datacenter proxies by default.
Common uses
- Pull complete seasons of scores in one run: by default the season type is All (preseason + regular season + playoffs), or narrow it to a single type. Narrowing filters the request sent to ESPN rather than the rows delivered, so see the FAQ if you need an exact match.
- Build Kaggle-ready CSV/Excel datasets with no post-processing.
- Collect multi-season player gamelogs for modeling.
- Get full boxscores, play-by-play and odds per game for betting research on the current seasons and upcoming games. Games from earlier seasons can lose their lines on ESPN's side.
- Snapshot standings, rosters and schedules for dashboards.
Supported leagues
NFL, NCAA Football (FBS), NBA, WNBA, NCAA Men's and Women's Basketball, MLB, NHL, and soccer: Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS, UEFA Champions League, UEFA Europa League, FIFA World Cup.
Every league is served by the same ESPN endpoints, so the core data types work the same way across them. The differences are structural, by sport:
| Data types | Leagues | Notes |
|---|---|---|
| scoreboard, gameSummary, playByPlay, playerBoxscore, schedule, teams, standings, roster, athletes, athleteGamelog, news | NBA, WNBA, NFL, MLB, NHL, NCAA (football, men's and women's basketball) | Full support. Validated end-to-end on NBA. Football play-by-play (NFL, NCAA) comes without athlete ids, coordinates or score value, which ESPN does not publish for football plays. |
| scoreboard, gameSummary, playByPlay, schedule, teams, standings, news | Soccer leagues (Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS) | No US-style per-player roster/gamelog/boxscore. |
| scoreboard, gameSummary, schedule, teams, news | Cup competitions (UEFA Champions/Europa League, FIFA World Cup) | No conventional season standings. |
An unsupported (league, data type) combination is reported in the run's OUTPUT record in plain language, never a crash and never a charge.
Data types
| Data type | One row is | Key inputs |
|---|---|---|
scoreboard | a game (scores, teams, status, venue, margin) | league + date range or seasons |
gameSummary | a game's team boxscore | eventIds or chained from scoreboard |
playByPlay | a single play | eventIds or chained |
playerBoxscore | a player in a game | eventIds or chained |
schedule | a scheduled game | league + teamIds + season |
teams | a team | league |
standings | a team's standings row | league + seasons |
roster | a roster player | league + teamIds |
athletes | an athlete | league |
athleteGamelog | a player's game in a season | league + athleteIds + seasons |
news | a news article (metadata + link) | league |
How to use ESPN Sports Data Scraper
- Open the Actor on Apify and go to the Input tab.
- Choose a Data type (for example Scoreboard) and a League.
- Set the scope: Seasons, a start and end date, team ids, athlete ids or event ids, depending on the data type (see the Data types table above).
- Set a Result limit. Each result is one billed row, so the limit is also your cost ceiling.
- Optional: turn on Include odds or Also fetch game details for scoreboard runs.
- Click Start. Rows reach the dataset while the run progresses.
- Download the dataset as JSON, CSV or Excel, or read it through the API. The run's
OUTPUTrecord in the key-value store lists results delivered, results billed and any lookup that failed.
Chaining example: a scoreboard run with game details gives you a game list and the team boxscore of each game. For play-by-play, pass the game ids of the games you care about in eventIds.
Example input
Full NBA 2025 season, all game types (the default: preseason + regular + playoffs). One result per game, so a full season is roughly 1,400 results: raise the result limit or set it to 0 once you know what you want.
{"dataType": "scoreboard","league": "nba","seasons": ["2025"],"resultLimit": 1500}
Narrow it to the regular season only:
{"dataType": "scoreboard","league": "nba","seasons": ["2025"],"seasonType": "2","resultLimit": 1300}
Full play-by-play for three NBA games. Roughly 500 results per basketball game, so about 1,500 in total. A football game is about 150 to 180:
{"dataType": "playByPlay","league": "nba","eventIds": ["401585601", "401585602", "401585603"],"resultLimit": 1600}
One season of a player's gamelog, roughly 80 results:
{"dataType": "athleteGamelog","league": "nba","athleteIds": ["4065648"],"seasons": ["2025"],"resultLimit": 100}
Every season the player has on ESPN, discovered automatically. A long career runs to several hundred results, so keep a limit on the first try:
{"dataType": "athleteGamelog","league": "nba","athleteIds": ["4065648"],"allSeasons": true,"resultLimit": 800}
Example output (flat)

Each scoreboard row also carries team ids and abbreviations, the winner flags, margin, total points, venue, attendance, broadcast and the ESPN game URL. One row of a flat scoreboard run:
{"_type": "scoreboard","league": "nba","season": 2025,"season_type": 2,"game_id": "401585601","date_utc": "2025-04-13T23:00Z","status": "post","completed": true,"home_team_abbrev": "BOS","home_score": 120,"away_team_abbrev": "MIA","away_score": 111,"margin": 9,"total_points": 231,"venue_name": "TD Garden","scraped_at": "2026-07-11T09:00:00.000Z"}
Use it with AI agents and MCP clients
Two routes, depending on the question.
- Bulk or historical data for an agent. Add this Actor to the Apify MCP server, which exposes Apify Actors as tools to MCP clients such as Claude Desktop, Cursor or VS Code. The agent can start a scoreboard or play-by-play run, wait for it and read the dataset. Setup steps are in the Apify MCP documentation. Keep a result limit in the input, because an agent can otherwise request a whole season.
- Live, on-demand questions. For real-time lookups (today's scores, one team's roster, one game's odds), use the ESPN MCP Server. It exposes the same ESPN data as tools with no caching. This Actor is the opposite end: bulk and historical extraction into a dataset.
Integrations and API
A run can feed other systems without custom code.
- API and clients: start runs and fetch the dataset through the Apify API, or with the JavaScript and Python clients.
- Scheduling: refresh scores or standings on a cron with Schedules.
- Webhooks: call your own endpoint when a run succeeds or fails, using webhooks. A blocked run ends FAILED, so a failure webhook catches it.
- Other tools: send results to Google Sheets, Make, Zapier or n8n through the Apify integrations.
- Storage: read rows as JSON, CSV or Excel from the dataset.
Pricing
This Actor uses pay-per-event pricing. You are charged once per result delivered to the dataset, at the rate shown on the Pricing tab. Volume varies a lot by data type: a scoreboard pull returns one result per game, a play-by-play pull returns roughly 450 to 500 results per basketball game and 150 to 180 per football game, and a player gamelog returns roughly 80 results per season. A game with no play yet returns nothing and is not charged. Set a result limit before a large pull.
Failed runs and error rows are not charged. To cap spend, set the result limit in the input, or set the maximum cost per run in the Console before you start.
FAQ
Do I need an ESPN API key? No. The data comes from ESPN's public JSON endpoints.
Are there rate limits? The Actor paces itself (bounded concurrency, backoff, aggressive caching of finished data) to stay a good citizen of ESPN's endpoints.
Very large multi-season pulls? Rows are pushed incrementally, so a run that hits its timeout keeps everything gathered so far. For very large jobs, raise the run timeout or split into per-season runs.
Where are the run totals? Each run writes an OUTPUT record to its default key-value store: results delivered, results billed, how many lookups failed and the detail of each one, plus the finish time. An integration can check a run without scanning the dataset.
Does picking a single season type guarantee only that type? No, and the distinction matters if you filter downstream. The Actor forwards your choice to ESPN, which decides what to return: a run asking for the postseason may occasionally include a regular-season game. Every row carries its own season_type and season_type_name, so an exact match is one filter away on your side.
What happens when a lookup fails? You get the reason in plain language in the run's OUTPUT record, and you are not charged for it. Failures are written there rather than in the dataset, precisely because only delivered rows are billed. The run still finishes successfully when it delivered at least one row, or when there was simply nothing to return, a day without games for instance.
What if ESPN blocks the run? If ESPN refused every request and nothing was delivered, the run ends FAILED, so a schedule or an integration sees the block instead of an empty success. Nothing is billed, and each refused request is logged as a warning with the address that was refused.
Related Actors
- ESPN MCP Server: live ESPN data as MCP tools for AI agents.
- SofaScore Sports Scraper: match and player data from SofaScore.
- Flashscore Matches Scraper: matches and results from Flashscore.
- LoL MCP Server and TFT MCP Server: League of Legends and Teamfight Tactics data for AI agents.
About
Built by mrbridge. Explore the wider catalogue of data and automation tools at mr-bridge.com/scrapers, and the model context protocol servers at mr-bridge.com/mcp-servers. More about this Actor on its mr-bridge.com page.
Feedback and issues
Found a bug, or want a league or data type added? Your feedback shapes the roadmap: open an issue on the Issues tab.
An honest review helps other users decide, and you can bookmark this Actor too. For bugs or other problems, use the Issues tab.
Is it legal to scrape ESPN data?
This Actor extracts publicly available data from ESPN for research and analytics. Respect ESPN's terms of use and applicable laws when using the data. ESPN is a trademark of its owner and is not affiliated with this Actor.