ESPN Scraper - Scores, Odds, Standings & Tennis avatar

ESPN Scraper - Scores, Odds, Standings & Tennis

Pricing

from $1.50 / 1,000 sports data rows

Go to Apify Store
ESPN Scraper - Scores, Odds, Standings & Tennis

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

rj

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Features

Limited permissions

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?

ModeOne row perMain fields
scoreboard (team sports)gamedate, 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 / bouttournament, 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 / sessionevent, session (FP1, Race...), status, leaderboard (position, name, country, score)
schedulegamea team's full season schedule and results
standingsteam in a tablegroup (conference/division), rank, W/L/T, win %, games behind, points, goals/points for and against, streak, every ESPN column
teamsteamname, abbreviation, ESPN id, colours, logo, current record
newsarticleheadline, description, published date, byline, categories, image, URL
injuriesinjured playerteam, player, position, status (Out, Questionable...), injury, expected return, note
rankingsranked team/playerpoll (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

  1. Pick a mode and one or more leagues.
  2. For scoreboard, set dates: today, yesterday, tomorrow, 20250115 or a range 20250101-20250107.
  3. 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:

EventPriceWhen
record$0.0015each row (game, match, event, standing, team, article, injury, ranking)
game-summary$0.003each 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: 20 and ["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.
  • onlyChanged compares the whole row (score, status, clock, odds...) with the last run that used the same stateKey. The first run outputs everything. onlyNew outputs 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 onlyChanged and 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

More scrapers by the same developer

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.