ESPN Scraper - Scores, Odds, Standings & Tennis
Pricing
from $1.50 / 1,000 sports data rows
ESPN Scraper - Scores, Odds, Standings & Tennis
ESPN live scores, schedules, betting odds, standings, team lists, news, injuries and rankings for NFL, NBA, MLB, NHL, college, soccer, F1, golf, UFC - plus ATP/WTA tennis matches with set scores. Only-changed mode for live polling. No API key.
Pricing
from $1.50 / 1,000 sports data rows
Rating
0.0
(0)
Developer
rj
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Features
Share
ESPN Scraper - Live Scores, Schedules, Standings, Odds & Tennis
Get live scores, results, schedules, betting odds, standings, teams, news, injuries and rankings for every major league on ESPN - NFL, NBA, WNBA, MLB, NHL, college football and basketball, Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, F1, PGA golf and UFC - plus ATP and WTA tennis matches with set-by-set scores. One Actor replaces a separate scores scraper, odds scraper and tennis scraper. It reads ESPN's public JSON API (no API key, no browser, no login), so runs are fast and cheap, and an only-changed mode makes it a live-score and odds feed when you schedule it every few minutes.
What data can you get?
| Mode | One row per | Main fields |
|---|---|---|
scoreboard (team sports) | game | date, status (scheduled/in/final) + detail (Q3 4:12, Final/OT), home/away team, score, record, winner, linescores, venue, city, attendance, TV, odds (provider, spread, over/under, moneylines), recap headline, ESPN link |
scoreboard (tennis, UFC) | match / bout | tournament, draw (Men's Singles...), round, court, players with country and seed, set scores with tiebreaks, score text (6-4 7-6(5)), winner, result |
scoreboard (golf, F1) | event / session | event, session (FP1, Race...), status, leaderboard (position, name, country, score) |
schedule | game | a team's full season schedule and results |
standings | team in a table | group (conference/division), rank, W/L/T, win %, games behind, points, goals/points for and against, streak, every ESPN column |
teams | team | name, abbreviation, ESPN id, colours, logo, current record |
news | article | headline, description, published date, byline, categories, image, URL |
injuries | injured player | team, player, position, status (Out, Questionable...), injury, expected return, note |
rankings | ranked team/player | poll (AP Top 25, CFP, Coaches, ATP, WTA), rank, previous rank, points, record |
Add includeSummary to get each game's box score: team stats, statistical leaders, betting lines and scoring plays.
Use cases
- Sports betting and odds tracking - DraftKings spreads, totals and moneylines for every NFL/NBA/NHL/MLB/college game, polled with only-changed mode.
- Live-score widgets, bots and apps - schedule every 1-5 minutes and push only games whose score or status changed to Slack, Discord or your database.
- Fantasy sports - injury reports, box scores and leaders.
- Tennis analytics - every ATP/WTA match of a day or a tournament with seeds and set scores.
- Sports data journalism and research - historical results by date range, season schedules, standings snapshots, polls.
How to use
- Pick a mode and one or more leagues.
- For
scoreboard, set dates:today,yesterday,tomorrow,20250115or a range20250101-20250107. - Run. Results appear in the dataset; pick the Games, Tennis & MMA matches, Standings... view.
Last night's NBA and tennis results:
{ "mode": "scoreboard", "leagues": ["nba", "atp", "wta"], "dates": "yesterday" }
This week's NFL odds:
{ "mode": "scoreboard", "leagues": ["nfl"], "dates": "20261108-20261110" }
Live-score polling (schedule every 2 minutes; only new or changed games are output and charged):
{ "mode": "scoreboard", "leagues": ["nba", "nhl"], "dates": "today", "onlyChanged": true, "stateKey": "live-nba-nhl" }
Box scores for a day of Premier League games:
{ "mode": "scoreboard", "leagues": ["epl"], "dates": "20250115", "includeSummary": true }
A team's season schedule, standings, injuries, rankings:
{ "mode": "schedule", "leagues": ["nba"], "teams": ["lal", "bos"], "season": 2025 }{ "mode": "standings", "leagues": ["epl", "laliga"] }{ "mode": "injuries", "leagues": ["nfl"] }{ "mode": "rankings", "leagues": ["ncaaf", "atp", "wta"] }
Leagues: nfl, ncaaf, nba, wnba, ncaab, ncaaw, mlb, nhl, mls, epl, laliga, bundesliga, seriea, ligue1, ucl, uel, atp, wta, f1, pga, lpga, ufc. Any other ESPN league works as a raw sport/league path, e.g. soccer/ned.1 (Eredivisie), soccer/bra.1, soccer/mex.1, baseball/college-baseball.
Output example
A game (real output, NBA, 15 January 2025):
{"type": "game","id": "game:401705127","gameId": "401705127","league": "nba","sport": "basketball","name": "New York Knicks at Philadelphia 76ers","date": "2025-01-16T00:00:00.000Z","status": "final","statusDetail": "Final/OT","completed": true,"venue": "Xfinity Mobile Arena","city": "Philadelphia","attendance": 20088,"broadcast": "ESPN","home": { "id": "20", "team": "Philadelphia 76ers", "abbreviation": "PHI", "score": 119, "record": "15-24", "winner": false, "rank": null, "linescores": [21, 26, 38, 24, 10] },"away": { "id": "18", "team": "New York Knicks", "abbreviation": "NY", "score": 125, "record": "27-15", "winner": true, "rank": null, "linescores": [30, 30, 25, 24, 16] },"odds": null,"headline": "Brunson scores 16 of his 38 points in 4th quarter and OT as Knicks beat 76ers 125-119","url": "https://www.espn.com/nba/game/_/gameId/401705127/knicks-76ers","summary": null,"scrapedAt": "2026-11-06T12:27:41.889Z"}
Odds on an upcoming game (spread is the home team's line):
"odds": { "provider": "DraftKings", "details": "KC -10", "spread": -10, "overUnder": 47.5, "homeMoneyline": -575, "awayMoneyline": 425 }
A tennis match:
{"type": "match","id": "match:153127","league": "atp","tournament": "Australian Open","matchType": "Men's Singles","round": "Round 2","date": "2025-01-15T00:40:00.000Z","status": "final","court": "1573 Arena","player1": { "id": "2952", "name": "Reilly Opelka", "country": "USA", "seed": null, "winner": false, "sets": [6, 6, 7, 6, 4] },"player2": { "id": "3811", "name": "Tomas Machac", "country": "Czechia", "seed": 26, "winner": true, "sets": [3, 7, 6, 7, 6] },"setScores": [{ "set": 1, "player1": 6, "player2": 3, "tiebreak": null }, { "set": 2, "player1": 6, "player2": 7, "tiebreak": 1 }, "..."],"score": "3-6 7-6(1) 6-7(5) 7-6(4) 6-4","winner": "Tomas Machac","result": "(26) Tomas Machac (CZE) bt Reilly Opelka (USA) 3-6 7-6 (7-1) 6-7 (5-7) 7-6 (7-4) 6-4","url": "https://www.espn.com/tennis/scoreboard/tournament/_/eventId/154-2025/competitionType/1"}
Every row has type, id, league, sport, url and scrapedAt. Missing values are null, never left out. A run summary (per-league status, request count, warnings) is saved as RUN_SUMMARY in the key-value store.
Pricing
Pay per event - you pay only for rows you get:
| Event | Price | When |
|---|---|---|
record | $0.0015 | each row (game, match, event, standing, team, article, injury, ranking) |
game-summary | $0.003 | each game whose box-score summary was fetched (only with includeSummary) |
Examples: a full NBA night (10 games) ≈ $0.015; 1,000 rows ≈ $1.50; 100 games with box scores ≈ $0.45. In only-changed mode unchanged games cost nothing, so polling a slate of 15 games every few minutes costs only for the games that changed. Set Maximum cost per run in the run options: the Actor stops cleanly at your budget and never charges past it.
Tips and limits
- Max rows counts across all leagues, in the order you list them. With
maxItems: 20and["nba", "atp"], NBA games come first and tennis fills the rest. - Dates are ESPN's US Eastern day for
today/yesterday/tomorrow. Ranges are fetched one day at a time (max 93 days); a 7-day range is 7 requests per league. - Tennis: ESPN returns whole tournaments, so matches are filtered to the requested dates using their UTC start time. Grand Slam matches appear in both the ATP and WTA feeds; each match is output (and charged) once, under the first league you list.
- Odds appear only when ESPN shows a line - usually for upcoming games in US leagues and college sports. Past games and many soccer leagues have
odds: null. - College scoreboards (
ncaaf,ncaab,ncaaw) include all Division I / FBS games, not just the Top 25. - Injuries exist for NFL, NBA, WNBA, MLB and NHL; rankings for college football/basketball and ATP/WTA. Other leagues return no rows and the run says so.
- Box scores (
includeSummary) are for team-sport games; tennis, golf and racing rows have no summary. onlyChangedcompares the whole row (score, status, clock, odds...) with the last run that used the samestateKey. The first run outputs everything.onlyNewoutputs only rows never seen before (useful for news and injuries).- ESPN's API is unofficial and undocumented. If ESPN changes it, open an issue and it will be fixed quickly.
FAQ
Is it legal to scrape ESPN? The Actor reads only public data that ESPN's own website and apps load without login: scores, schedules, standings, odds and headlines. It collects no personal data beyond the public professional-athlete information ESPN publishes (names, positions, injury status). You are responsible for complying with ESPN's terms of use and the laws that apply to you, especially before redistributing data commercially.
Do I need an API key? No. ESPN's site API is public; no key, account or cookies are used.
Do I need a proxy? Usually not - ESPN's API answers Apify's datacenter IPs. If ESPN returns HTTP 403 or 429, enable Apify Proxy (datacenter). Residential proxies are not supported: if you select the RESIDENTIAL group, the Actor logs a warning and uses Apify datacenter proxy instead.
How "live" are live scores?
As live as ESPN's own scoreboard (seconds to a minute behind). Schedule the Actor every 1-5 minutes with onlyChanged: true to get a feed of score changes.
Which sportsbook are the odds from?
Whatever ESPN shows for that game, currently DraftKings for most US games (odds.provider).
Why are scores null?
The game has not started yet (ESPN reports 0-0; the Actor outputs null so you don't mistake it for a result).
How do I find a team abbreviation?
Run mode teams for the league; use abbreviation (e.g. lal, kc) or teamId.
Integrations
-
API. Start runs and fetch results with the Apify API, or the JavaScript and Python clients:
curl -X POST "https://api.apify.com/v2/acts/rjmacarthy~espn-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"scoreboard","leagues":["nfl"],"dates":"today"}' -
Schedules + webhooks. Poll live scores every few minutes with
onlyChangedand trigger your pipeline on each run. -
Zapier, Make, n8n. Send final scores or odds moves to Google Sheets, Slack, Discord or e-mail with no code.
-
Google Sheets, Airbyte, Keboola and more through Apify integrations.
-
AI agents. Use the Actor as a tool through the Apify MCP server ("what were last night's NBA scores?").
Changelog
- 0.1 (November 2026) - First release: scoreboards with odds for 20+ leagues, tennis matches with set scores, golf/F1 leaderboards, UFC bouts, team schedules, standings, teams, news, injuries, rankings, box-score summaries, only-new / only-changed polling.
Ready-to-run examples
- NBA games today with betting odds: spreads and totals
- Australian Open 2025 tennis results with set scores
More scrapers by the same developer
- Apple App Store Scraper: Apps, Search & Reviews
- Google News Scraper: Articles, Publisher URLs & Full Text
- Google Play Scraper: Apps, Search & Reviews
- PDF to Markdown & Text Converter for LLMs and RAG
- Roblox Games Scraper - Players, Visits, Charts & Stats
- Substack Scraper
Browse all my Actors on my Apify Store profile.
Support
Missing a league, a field or a sport? Open an issue on the Issues tab with your input. Fixes are usually quick.