ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds avatar

ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds

Pricing

from $2.00 / 1,000 results

Go to Apify Store
ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds

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

MrBridge

Maintained by Community

Actor stats

0

Bookmarked

61

Total users

25

Monthly active users

14 days ago

Last modified

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.

What you can do with it

  • 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.
  • 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 typesLeaguesNotes
scoreboard, gameSummary, playByPlay, playerBoxscore, schedule, teams, standings, roster, athletes, athleteGamelog, newsNBA, WNBA, NFL, MLB, NHL, NCAA (football, men's and women's basketball)Full support. Validated end-to-end on NBA.
scoreboard, gameSummary, playByPlay, schedule, teams, standings, newsSoccer leagues (Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS)No US-style per-player roster/gamelog/boxscore.
scoreboard, gameSummary, schedule, teams, newsCup 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 typeOne row isKey inputs
scoreboarda game (scores, teams, status, venue, margin)league + date range or seasons
gameSummarya game's team boxscoreeventIds or chained from scoreboard
playByPlaya single playeventIds or chained
playerBoxscorea player in a gameeventIds or chained
schedulea scheduled gameleague + teamIds + season
teamsa teamleague
standingsa team's standings rowleague + seasons
rostera roster playerleague + teamIds
athletesan athleteleague
athleteGameloga player's game in a seasonleague + athleteIds + seasons
newsa news article (metadata + link)league

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 games. Roughly 500 results per game, so about 1,500 in total:

{
"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)

{
"_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"
}

Need real-time interactive access?

For live, on-demand queries from an AI agent (Claude, ChatGPT, and other MCP clients), use the ESPN MCP Server. It exposes the same ESPN data as tools with no caching, ideal for single-question lookups. This Actor is the opposite end: bulk and historical extraction into a 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 500 results per game, and a player gamelog returns roughly 80 results per season. 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, the run still finishes successfully, and you are not charged for it. Failures are written to the OUTPUT record rather than the dataset, precisely because only delivered rows are billed.

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.

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.

This Actor extracts publicly available data 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.