Devil ScrapesQuick answer The ESPN Scores Scraper pulls ESPN scoreboards for seven leagues (English...
The ESPN Scores Scraper pulls ESPN scoreboards for seven leagues (English Premier League, La Liga, Serie A, NBA, NFL, MLB and NHL) into JSON, CSV or Excel: one row per game with teams, scores, game state, start time in UTC, the winner, venue, city, broadcasters and a link to the ESPN summary page. Pick leagues and a date range of up to 31 days and get every game in one run. ESPN has no official public scores API, so we read its public scoreboard data and return it as a tidy dataset. Pricing is pay-per-result, $0.20 per run plus $0.0015 per game, $1.70 per 1,000 games.
Not an official, documented one. ESPN's own pages load scoreboards from internal endpoints that are undocumented, shaped differently per sport, and free to change without notice. Every "ESPN API" guide you find is someone's reverse-engineered notes. We keep that layer working, normalise it into one row shape across all seven leagues, and absorb the changes so your pipeline doesn't have to.
Because ESPN's scoreboard reports a score of 0 for both sides before kickoff. Read home_score and away_score alone and every upcoming fixture looks like a goalless draw. Feed that into a model and you've invented results.
On ESPN's scoreboard, a 0-0 before kickoff and a 0-0 at full time look the same. Only the game state tells them apart.
So every row carries status_state: pre (not started), in (in progress) or post (finished), plus a completed flag and ESPN's own status_detail text. Filter on completed: true before you treat a score as a result. We also fill winner from the final score when ESPN leaves it out, and keep it null for draws and unfinished games.
event_id per league, so you get each game once.odds_details and over_under are filled only when ESPN's scoreboard carries a line, which is often not the case. Treat them as a bonus, not a betting feed: for many games, and for whole leagues, they come back null.One row per game, 21 fields: event_id, league, league_name, event_name, short_name, start_time, status_state, status_detail, completed, home_team, away_team, home_score, away_score, winner, venue, city, odds_details, over_under, broadcasts, url and scraped_at.
{
"event_id": "401879268",
"league": "soccer/eng.1",
"league_name": "English Premier League",
"event_name": "Leeds United at Arsenal",
"short_name": "LEE @ ARS",
"start_time": "2026-10-10T11:30:00Z",
"status_state": "pre",
"completed": false,
"home_team": "Arsenal",
"away_team": "Leeds United",
"home_score": 0,
"away_score": 0,
"winner": null,
"venue": "Emirates Stadium",
"city": "London",
"broadcasts": ["USA Net", "Universo"],
"scraped_at": "2026-10-07T12:00:00Z"
}
Note the 0-0 on a pre game. Input: leagues as sport/league keys (soccer/eng.1, soccer/esp.1, soccer/ita.1, basketball/nba, football/nfl, baseball/mlb, hockey/nhl), startDate and endDate (empty means today, UTC) and maxEvents up to 10,000.
Scoreboards only: no standings, rosters, box scores or play-by-play. Seven leagues in this version. Odds columns are frequently empty. Up to 31 days per run. Each run is a snapshot, so schedule it for live updates. A day with no games is a successful run that costs only the start fee.
Is this an official ESPN API?
No. It is an independent scraper that reads ESPN's public scoreboard data.
What about blocks and rate limits?
That's our job. We retry with exponential backoff on 408, 429 and 5xx, honour Retry-After, and isolate failures per league-day so one hiccup never costs you the whole run. Apify Proxy is available if you want it.
Does it return live scores?
Yes, for games in progress at the moment of the run (status_state: "in"). Schedule it every few minutes for a live ticker.
How does pricing work?
$0.20 per run plus $0.0015 per game: $1.70 per 1,000 games.
ā ESPN Scores Scraper on Apify
Built by Devil Scrapes. We handle the undocumented endpoints, the retries and the game-state traps, so a 0-0 in your dataset means a 0-0 on the pitch. š