ESPN Sports Scraper | $3.99 / 1k | avatar

ESPN Sports Scraper | $3.99 / 1k |

Pricing

from $3.99 / 1,000 results

Go to Apify Store
ESPN Sports Scraper | $3.99 / 1k |

ESPN Sports Scraper | $3.99 / 1k |

Scrape ESPN scores, fixtures, teams and standings for the NFL, NBA, MLB, NHL and top soccer leagues. No API key needed. Export to CSV, JSON or Excel.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

Raffy

Raffy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get live scores, fixtures, team lists and league standings for the NFL, NBA, MLB, NHL and the major soccer leagues as clean structured rows — no API key, no browser, no scraper to maintain. It is the quickest way to put an NFL scores API behind your app, a full NBA standings feed into a dashboard, or a season of Premier League results into a model.

This Actor reads the same public JSON endpoints that espn.com's own web app calls and turns them into one flat row per game, team or standings entry. Pick a league and a resource, press start, and the rows land in a dataset you can download as JSON, CSV or Excel, or pull straight from the Apify API. Fifteen leagues share one schema, and every row carries a stable teamId, so scores, teams and standings join without fuzzy name matching.

HTTP only. No headless browser, so runs finish in seconds and cost very little platform time — the default run does 24 requests in about 7 seconds.

What does this ESPN sports scraper do?

Each row is one event (a game or fixture), one team, or one standings entry. The resource field says which, so a dataset that mixes them stays readable.

  • Five sports, fifteen leagues, one schema. NFL, NBA, MLB, NHL, WNBA, NCAA football and basketball, plus the Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, Champions League, Europa League and MLS. Any other ESPN league works too — paste its endpoint into the URL list.
  • Scores and fixtures. A scoreboard call returns a whole day, a date range or an entire calendar year in one request, with status, live or final scores, venue, broadcaster and attendance.
  • Standings data. Wins, losses, ties, win percentage, table points, points for and against, games behind, rank and playoff seed for each team in the table.
  • Enriched team rows. Each team is followed up with one extra call, so you get its division, current record and home venue, not just its name.
  • Honest rows. Every row says whether it is real data (ok), a request ESPN had nothing for (not_found) or a request that failed (error). You are only billed for ok.

Result status (tri-state output)

statusMeaningBilled
okData was extracted.Yes
not_foundESPN answered, but there is nothing to report — a day with no games, a season with no table.No
errorThe endpoint could not be read after retries (network error, HTTP error, unexpected format), or an input entry was not an ESPN URL. error says why.No

Use cases for ESPN scores and standings data

  • Sports apps and score widgets. A developer schedules a scoreboard run every 10-15 minutes and renders homeTeam, awayTeam, homeScore, awayScore and eventStatus as a live scoreboard, without paying for a commercial feed or maintaining a scraper.
  • Fantasy league tools. A fantasy platform pulls the weekly fixture list with week and startDate, joins it to team rows on teamId, and locks rosters against the real kick-off times instead of a hand-maintained calendar.
  • Betting and forecasting models. A quant pulls a whole season of resource: events history plus standings (wins, losses, pointsFor, pointsAgainst, streak) to build the features a win-probability or totals model needs.
  • Media and newsroom dashboards. A sports desk keeps a live table of every league it covers, so an editor sees the current rank and record of any team without opening fifteen browser tabs.
  • Analytics and BI reporting. An analyst loads standings and results into BigQuery or a spreadsheet each morning to track a club's form, attendance and home-away splits over a season.
  • AI agents and chatbots. An assistant answering "who won last night?" calls the Actor for one date, gets flat JSON with an explicit status, and can tell "no games today" apart from "the request failed" without guessing.

What data you get from every row

Fields that do not apply to a row are simply absent — never filled with a placeholder or a zero.

Every row

FieldTypeDescription
urlstringLink to the ESPN page for this row: the game page for an event, the team page for a team or standings row.
statusstringok, not_found or error — see the table above.
errorstringWhy a not_found or error row looks the way it does. Absent on ok rows.
scrapedAtstringISO 8601 timestamp of extraction.
resourcestringevents, teams or standings.
leaguestringLeague slug as ESPN uses it: nfl, nba, mlb, nhl, eng.1, uefa.champions, ...
leagueNamestringHuman-readable league name, e.g. National Football League.
seasonintegerSeason year as ESPN labels it. A 2025-26 European season is season 2025.

Scores and fixtures (resource: events)

FieldTypeDescription
eventIdstringESPN event (game) id.
eventNamestringFull event name, e.g. New Orleans Saints at Atlanta Falcons.
shortNamestringShort event name, e.g. NO @ ATL.
weekintegerWeek number (NFL, college football) or matchday, when the league publishes one.
startDatestringKick-off / first pitch, ISO 8601 UTC.
eventStatusstringscheduled, in progress, final, postponed, canceled, delayed or other.
statusDetailstringESPN's own wording, e.g. Final, Full Time, 9/9 - 8:20 PM EDT.
homeTeamstringHome team display name.
homeTeamIdstringESPN id of the home team — the join key to team and standings rows.
homeAbbreviationstringHome team abbreviation, e.g. ATL.
homeScorenumberHome score. Absent while the event is still scheduled, so an unplayed game is never reported as 0-0.
awayTeamstringAway team display name.
awayTeamIdstringESPN id of the away team.
awayAbbreviationstringAway team abbreviation, e.g. NO.
awayScorenumberAway score. Absent while the event is still scheduled.
broadcaststringBroadcaster(s) ESPN lists for the event, comma separated.
attendanceintegerReported attendance, when published.

Teams (resource: teams)

FieldTypeDescription
teamIdstringESPN team id; the same id links events, teams and standings rows.
namestringTeam display name, e.g. Atlanta Falcons.
abbreviationstringTeam abbreviation, e.g. ATL.
locationstringTeam location or market, e.g. Atlanta.
logoUrlstringTeam logo (PNG) URL.
conferencestringConference or top-level standings group, e.g. American Football Conference.
divisionstringDivision or standings group, e.g. NFC South, League Phase.
recordstringWin-loss record as ESPN prints it, e.g. 14-3 or 26-7-5.
detailErrorstringPresent only when the optional per-team detail call failed; the row is kept without those extra fields.

Venue (events, and the home venue on team rows)

FieldTypeDescription
venuestringVenue name: the stadium of the event, or the team's home ground.
citystringVenue city.
statestringVenue state or region, where ESPN publishes one.
countrystringVenue country.

Standings (resource: standings)

Standings rows also carry teamId, name, abbreviation, location, logoUrl, conference, division and record from the table above.

FieldTypeDescription
rankintegerPosition inside the standings group, 1 = top of that table.
playoffSeedintegerPlayoff seed, for the leagues that publish one.
winsnumberWins in the standings row.
lossesnumberLosses in the standings row.
tiesnumberTies or draws in the standings row.
winPercentnumberWin percentage as ESPN publishes it (0-1).
pointsnumberTable points, for soccer and hockey standings.
pointsFornumberPoints, goals or runs scored.
pointsAgainstnumberPoints, goals or runs conceded.
gamesBehindnumberGames behind the group leader.
gamesPlayednumberGames played.
streaknumberCurrent streak as a signed number: 3 = three wins, -2 = two losses.

How to scrape ESPN scores, teams and standings

  1. Click Try for free (or open the Actor from your Apify console).
  2. Choose a Resource (scoreboard, teams or standings) and a League. That is enough for most runs.
  3. Optionally paste ESPN API URLs instead — the URL list wins over the Resource/League fields when it is not empty.
  4. Set Maximum results to cap both the dataset size and your spend.
  5. Click Start. The default input finishes in about 7 seconds; a season-wide scoreboard with 500 rows takes well under a minute.
  6. Download the dataset as JSON, CSV, Excel or XML, or read it from the Apify API. You can also schedule the Actor to run every hour or every morning.

What you can paste into "ESPN API URLs"

You pasteThe Actor fetches
https://site.web.api.espn.com/apis/site/v2/sports/football/nfl/scoreboard?dates=20260104that endpoint, unchanged
https://site.api.espn.com/...the same path on site.web.api.espn.com, which answers every client
https://www.espn.com/nba/standingsthe NBA standings endpoint
https://www.espn.com/soccer/table/_/league/esp.1the LaLiga standings endpoint
nfl, epl, champions-leaguethat league, for the resource you selected
anything that is not an ESPN URLnothing — one free error row explains it was skipped

Input

FieldTypeDefaultWhen to change it
startUrlsarray of stringsone NFL teams URL: https://site.web.api.espn.com/apis/site/v2/sports/football/nfl/teams?limit=1000Paste ESPN endpoints, espn.com pages or bare league slugs when you want an exact endpoint or a league that is not in the dropdown. Clear the list to let resource + league build the URL for you.
resourceselectscoreboardSwitch to teams for a league's team list, or standings for the league table. Used only when the URL list is empty.
leagueselectnflPick the league you want: nfl, nba, mlb, nhl, wnba, college-football, mens-college-basketball, eng.1, esp.1, ita.1, ger.1, fra.1, uefa.champions, uefa.europa, usa.1.
datestringemptyScoreboard only. Set YYYYMMDD for one day's scores, YYYYMMDD-YYYYMMDD for a range, or YYYY for a whole year of fixtures. Empty means the current calendar year, which always contains games.
seasonintegeremptySet it to pull a past season, e.g. 2025. Standings read it as ESPN's season year; the scoreboard uses it as the calendar year when no date is given.
maxItemsinteger20Raise it for a full league or a season history — this is also your spending cap, since each ok row is one billable result.
proxyConfigurationobjectoffLeave off; these endpoints answer datacenter IPs directly. Enable Apify Proxy (datacenter group) only if your runs start getting blocked.
{
"startUrls": [],
"resource": "standings",
"league": "eng.1",
"season": 2025,
"maxItems": 20,
"proxyConfiguration": { "useApifyProxy": false }
}

Why the default input is a team list, not today's scoreboard

A scoreboard for one specific day returns nothing when nobody plays that day — off days, off seasons, international breaks. A default like that would produce an empty dataset on a random Tuesday. The prefilled default therefore asks for the NFL team list, which is date-independent and returns 32 teams every day of the year. When you do run a scoreboard without a date, the Actor asks for the whole current calendar year for the same reason, so you always get fixtures back.

Output

One row per event, team or standings entry. Real rows from runs of this Actor:

[
{
"url": "https://www.espn.com/nfl/team/_/name/atl/atlanta-falcons",
"status": "ok",
"scrapedAt": "2026-09-08T12:57:56.180Z",
"resource": "teams",
"league": "nfl",
"leagueName": "National Football League",
"season": 2026,
"teamId": "1",
"name": "Atlanta Falcons",
"abbreviation": "ATL",
"location": "Atlanta",
"logoUrl": "https://a.espncdn.com/i/teamlogos/nfl/500/atl.png",
"division": "NFC South",
"record": "0-0",
"venue": "Mercedes-Benz Stadium",
"city": "Atlanta",
"state": "GA",
"country": "USA"
},
{
"url": "https://www.espn.com/soccer/match/_/gameId/740780/fulham-crystal-palace",
"status": "ok",
"scrapedAt": "2026-09-08T12:58:18.415Z",
"resource": "events",
"league": "eng.1",
"leagueName": "English Premier League",
"season": 2025,
"eventId": "740780",
"eventName": "Fulham at Crystal Palace",
"shortName": "FUL @ CRY",
"startDate": "2026-01-01T17:30:00.000Z",
"eventStatus": "final",
"statusDetail": "FT",
"homeTeam": "Crystal Palace",
"homeTeamId": "384",
"homeAbbreviation": "CRY",
"homeScore": 1,
"awayTeam": "Fulham",
"awayTeamId": "370",
"awayAbbreviation": "FUL",
"awayScore": 1,
"venue": "Selhurst Park",
"city": "London",
"country": "England",
"broadcast": "Peacock",
"attendance": 25111
},
{
"url": "https://www.espn.com/nba/team/_/name/bos/boston-celtics",
"status": "ok",
"scrapedAt": "2026-09-08T13:05:26.529Z",
"resource": "standings",
"league": "nba",
"leagueName": "National Basketball Association",
"season": 2026,
"teamId": "2",
"name": "Boston Celtics",
"abbreviation": "BOS",
"conference": "Eastern Conference",
"division": "Atlantic",
"rank": 1,
"playoffSeed": 2,
"wins": 56,
"losses": 26,
"winPercent": 0.68292683,
"pointsFor": 9418,
"pointsAgainst": 8787,
"gamesBehind": 0,
"streak": 2
},
{
"url": "https://site.web.api.espn.com/apis/site/v2/sports/hockey/nhl/scoreboard?dates=20260908",
"status": "not_found",
"error": "No results for this page",
"scrapedAt": "2026-09-08T13:07:11.902Z"
}
]

How much does it cost to scrape ESPN data?

This Actor uses pay per event pricing. You pay for the run start and for each saved result; platform compute is included.

EventPriceCharged when
Actor start$0.005Once per run (Apify charges one event per GB of memory, minimum one; the 1 GB default is one event).
Result$0.00399Per record with status: ok saved to the dataset — one event, one team or one standings row.

That is $3.99 per 1,000 records plus half a cent per run. Rows with status not_found or error are never charged: a scoreboard for a day with no games costs you nothing but the run start. The free Apify plan's $5 of monthly credit covers about 1,250 records in a single run. You can cap spending per run with Maximum results and with the run's Max total charge option.

How it compares

This Actor is a fast, cheap, no-key way to get the sports data that ESPN already publishes: scores, fixtures, teams and league tables, across fifteen leagues in a single schema. Because it is HTTP-only and one scoreboard call can return an entire season, a large pull is a handful of requests rather than thousands, and you are billed per row you keep rather than per month.

It is not a replacement for a commercial sports data feed. There are no box scores, no play-by-play, no player statistics, no rosters, no injury reports and no odds. Latency is polling-based, so it suits a dashboard refreshed every few minutes rather than a live in-play betting screen. And the endpoints are unofficial, so a team that needs a contractual uptime guarantee should buy a licensed feed instead.

Integrations, API and AI agents

Results export to CSV, JSON, Excel and XML from the Apify console, or flow straight into Google Sheets, Airtable, Slack or a CRM through Apify integrations and webhooks — including Make, Zapier and n8n. Schedule a run every 10-15 minutes for live scores, or every morning for standings.

The Actor can be called from the Apify API, from any Apify client library, from the Apify MCP server, or by any AI agent that can call an HTTP endpoint. Every row carries a status column, so an agent can tell "no games today" apart from "the request failed".

Tips

  • One request, many rows. A scoreboard call returns the whole day, range or year at once, so a 500-row season history costs one HTTP request, not 500.
  • Use date ranges. 20260101-20260131 gives you a month of fixtures in a single call; 2026 gives the whole calendar year.
  • Join on teamId. The same id appears on event rows (homeTeamId, awayTeamId), team rows and standings rows.
  • Schedule it. For a live scoreboard, schedule a run every 10-15 minutes with date set to today and a small maxItems.
  • Watch eventStatus. Only rows with final are settled results; in progress scores change between runs.

Limitations

  • These endpoints are public but undocumented. ESPN does not publish or support them and can change or remove a field at any time; when that happens rows come back as error and the Actor is updated (report it in the Issues tab with the run ID).
  • Coverage varies by league. Divisions, table points, attendance, broadcast and week numbers only appear where ESPN publishes them — a soccer table has no week, an NBA table has no table points.
  • The scoreboard is date-dependent. A day with no games returns one not_found row, and a run with no ok rows at all is marked failed on purpose so a scheduled job cannot fail silently. Use a date range, a whole year, or the teams / standings resources when you need a guaranteed result.
  • College leagues are large. ESPN lists 700+ college football teams; raise maxItems accordingly, and expect one extra request per team row.
  • Team rows cost two requests each (list plus a detail call for record, division and venue). Everything else is far cheaper than one request per row.
  • No box scores, play-by-play, odds or rosters in this version — the Actor covers events, teams and standings. sports.core.api.espn.com reference-style URLs are not accepted.
  • Results reflect what ESPN published at the time of the run.

FAQ

Is it legal to scrape ESPN data? Scraping publicly available data is generally legal, but you are responsible for how you use the output. Read the legal notice below and ESPN's terms of service, and do not redistribute content in ways those terms forbid.

Do I need an ESPN API key or an account? No. The endpoints this Actor reads need no key and no login. You only pay Apify for the run.

Which leagues and sports are supported? The dropdown covers NFL, NBA, MLB, NHL, WNBA, NCAA football, NCAA men's basketball, the English Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, the Champions League, the Europa League and MLS. Any other ESPN league works too — paste its endpoint into ESPN API URLs.

Can I get live scores, or only finished games? Both. A scoreboard run returns whatever ESPN shows at that moment: eventStatus is scheduled, in progress or final, and homeScore / awayScore update between runs until the game is settled. Schedule a run every 10-15 minutes for a near-live feed.

Can I pull a whole past season? Yes. Set date to a year (2025) or a range (20250101-20250630), or set season for standings. One call returns the whole span, so a season of fixtures is one request.

Can I use this Actor from an AI agent or MCP client? Yes. It is a standard Apify Actor, so it can be called from the Apify API, from the Apify MCP server, or from any agent framework that can call an HTTP API. Every row carries status, so an agent can tell "no games today" apart from "the request failed".

Why did I get fewer rows than maxItems? Either the league has fewer records than you asked for (a table has 20 teams, a matchday has 10 fixtures), or the run reached its charge limit. The run log's final line always reports how many rows were saved and why it stopped.

What if a field is missing? Optional fields are omitted when ESPN does not publish them for that row. If a field that should always be present is missing, open an issue in the Issues tab with the run ID.

This Actor reads only data that ESPN publishes publicly; it does not log in, does not use credentials, and does not attempt to defeat access controls. Athlete and team names in scores, fixtures and standings are public sports records, and the Actor extracts no contact details, no private user data and no precise location data. Your results could still contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with ESPN's terms of service and applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by ESPN, its owners, or any league or club named here. All trademarks belong to their respective owners.