# ESPN Scraper - Scores, Box Scores, Standings, Rosters & News (`pipiagent/espn-scraper`) Actor

Get sports data from ESPN's public site: scores and schedules, box scores with player stats, play-by-play, standings, rosters and news for NFL, NBA, MLB, NHL, college sports, Premier League and other soccer leagues, tennis, golf, F1 and UFC. No API key.

- **URL**: https://apify.com/pipiagent/espn-scraper.md
- **Developed by:** [Frank0306](https://apify.com/pipiagent) (community)
- **Categories:** Developer tools, News
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ESPN Scraper

Get sports data from ESPN's public website: scores and schedules, box scores with player stats, play-by-play, standings, team rosters, news and injury reports. It covers the NFL, NBA, WNBA, MLB, NHL, college football and basketball, the Premier League and 18 other soccer competitions, plus ATP and WTA tennis, PGA and LPGA golf, Formula 1 and UFC. Sports analysts, fantasy and betting tool builders, journalists, app developers and researchers use it to fill spreadsheets, databases and dashboards without copying tables by hand.

- **Eight kinds of data in one Actor.** Games and scores, game details (box scores, team stats, player stats, play-by-play), team schedules, standings, teams, rosters, news and injury reports.
- **Full seasons in one run.** Pick "Whole season" and get every game of a league, for example all 1,401 NBA games of 2025-26 in under 10 seconds.
- **Complete college slates.** College football (FBS) and Division I basketball return every game of the day, not only the 25 featured games ESPN shows by default.
- **Flat, clean output.** One row per game, per player, per standings row or per article, with English field names, ISO dates in UTC and full links. Ready for Excel, Google Sheets or code.
- **No login, no API key, no proxy.** Press Start and get data.
- **Low price.** $1.00 per 1,000 results, no start fee.

### What data can you get?

| Mode | One result is | Main fields |
|---|---|---|
| Games and scores | One game | Teams, scores, status, start time, quarter or half scores, records, venue, TV, betting line (spread, over/under, moneyline), soccer goal scorers, links |
| Game details | One game, plus one row per player (optional: one row per play) | Everything above plus attendance, referees, 25 to 30 team stats per side, game leaders, opening and closing lines, recap headline; player box score lines; play-by-play text with clock and score |
| Team schedule | One game | Every game of the teams you list for a season, finished and upcoming. Soccer clubs include all competitions (league, cups, Champions League) |
| Standings | One team | Position, group, wins, losses, ties, win %, games behind, points, streak, home and away records, playoff seed, note (for example "Champions League"). Tennis gives the ATP or WTA ranking, F1 the driver and constructor standings |
| Teams | One team | Team ID, name, abbreviation, colors, logo, links to the team, roster and schedule pages |
| Rosters | One player | Name, jersey, position, age, birth date, height, weight, birthplace, college, experience, injury status, nationality. Soccer players also get season totals (appearances, goals, assists, cards) |
| News | One article | Headline, summary, publish time, author, teams and players mentioned, image, link |
| Injury reports | One injured player | Team, player, position, status (Out, Day-To-Day, Questionable...), fantasy status, injury, body part, side, expected return date, last update time, short and long ESPN comment |

Tennis matches and UFC fights come as games (the two players or fighters fill the home and away fields). Golf tournaments and F1 sessions come as leaderboard rows, one per player or driver.

### How to use it

1. Click **Try for free**.
2. Choose what you want in **What to get**.
3. Pick one or more **Leagues**, and a date range, team or game where the mode needs one.
4. Click **Start**, then download the results as JSON, CSV or Excel.

### Input examples

NBA and Premier League scores from the last 7 days:

```json
{
    "mode": "games",
    "leagues": ["nba", "eng.1"],
    "dateRange": "last7Days"
}
```

Every game of a full season:

```json
{
    "mode": "games",
    "leagues": ["nba"],
    "dateRange": "season",
    "season": 2026,
    "maxItems": 5000
}
```

Box scores and player stats for every NFL game of a week:

```json
{
    "mode": "gameDetails",
    "leagues": ["nfl"],
    "dateRange": "custom",
    "dateFrom": "2026-10-22",
    "dateTo": "2026-10-28"
}
```

Box score and play-by-play for specific games, by ESPN link:

```json
{
    "mode": "gameDetails",
    "gameIds": [
        "https://www.espn.com/nba/game/_/gameId/401909877/nets-celtics",
        "https://www.espn.com/soccer/match/_/gameId/401879268/leeds-united-arsenal"
    ],
    "includePlays": true
}
```

Full schedules of two teams:

```json
{
    "mode": "teamSchedule",
    "leagues": ["nba", "eng.1"],
    "teams": ["Lakers", "https://www.espn.com/soccer/team/_/id/359/arsenal"]
}
```

Current injury reports of the four major US leagues:

```json
{
    "mode": "injuries",
    "leagues": ["nfl", "nba", "mlb", "nhl"]
}
```

Standings, rosters, news and injury reports work the same way: pick the mode and the leagues, and add teams if you want only some of them.

### Output examples

A game (Premier League):

```json
{
    "type": "game",
    "league": "eng.1",
    "leagueName": "English Premier League",
    "sport": "soccer",
    "gameId": "401879268",
    "name": "Leeds United at Arsenal",
    "startTime": "2026-10-10T11:30:00Z",
    "status": "final",
    "statusDetail": "FT",
    "homeTeamName": "Arsenal",
    "homeTeamAbbreviation": "ARS",
    "homeScore": 2,
    "homeRecord": "5-0-1",
    "homeForm": "DWDWW",
    "awayTeamName": "Leeds United",
    "awayScore": 1,
    "winner": "Arsenal",
    "venueName": "Emirates Stadium",
    "venueCity": "London",
    "attendance": 60315,
    "broadcasts": ["USA Net", "Universo"],
    "headline": "Arsenal come from behind to overcome Leeds",
    "scoringSummary": ["55' James Justin (LEE)", "62' Riccardo Calafiori (ARS)", "70' Bruno Guimarães (ARS)"],
    "gameUrl": "https://www.espn.com/soccer/match/_/gameId/401879268/leeds-united-arsenal",
    "scrapedAt": "2026-10-28T11:48:02Z"
}
```

An upcoming game with betting odds (NFL):

```json
{
    "type": "game",
    "league": "nfl",
    "gameId": "401873023",
    "name": "Carolina Panthers at Green Bay Packers",
    "startTime": "2026-10-30T00:15:00Z",
    "week": 8,
    "status": "scheduled",
    "statusDetail": "Thu, October 29th at 8:15 PM EDT",
    "homeTeamName": "Green Bay Packers",
    "homeRecord": "4-3",
    "awayTeamName": "Carolina Panthers",
    "awayRecord": "3-3",
    "venueName": "Lambeau Field",
    "broadcasts": ["Prime Video"],
    "oddsProvider": "Draft Kings",
    "oddsDetails": "GB -3.5",
    "spread": -3.5,
    "overUnder": 47.5,
    "homeMoneyline": -185,
    "awayMoneyline": 154,
    "openingSpread": -7,
    "openingOverUnder": 45.5,
    "gameUrl": "https://www.espn.com/nfl/game/_/gameId/401873023/panthers-packers"
}
```

Game details (shortened, the real record has about 60 team stat fields such as `homeStatFieldGoalsMade` and `awayStatTotalRebounds`):

```json
{
    "type": "gameDetails",
    "league": "nba",
    "gameId": "401909877",
    "name": "Brooklyn Nets at Boston Celtics",
    "statusDetail": "Final/OT",
    "homeTeamName": "Boston Celtics",
    "homeScore": 125,
    "homeLinescores": [26, 30, 30, 31, 8],
    "awayTeamName": "Brooklyn Nets",
    "awayScore": 124,
    "attendance": 19156,
    "officials": ["John Goble", "Jonathan Sterling", "JD Ralls"],
    "homeStatFieldGoalsMade": 42,
    "homeStatFieldGoalsAttempted": 93,
    "homeStatThreePointFieldGoalPct": 27,
    "homeStatPointsInPaint": 52,
    "leaders": ["BOS Points: Jayson Tatum 40", "BKN Rebounds: Michael Porter Jr. 12"],
    "oddsDetails": "BOS -13.5",
    "openingSpread": -11.5,
    "seriesSummary": "BOS leads series 1-0",
    "recapHeadline": "Jayson Tatum hits a buzzer-beating jumper in OT to give the Celtics a 125-124 win over the Nets"
}
```

A player's box score line:

```json
{
    "type": "playerStats",
    "gameId": "401909877",
    "startTime": "2026-10-27T23:30:00Z",
    "gameName": "Brooklyn Nets at Boston Celtics",
    "teamAbbreviation": "BOS",
    "opponent": "Brooklyn Nets",
    "playerId": "4065648",
    "playerName": "Jayson Tatum",
    "position": "F",
    "starter": true,
    "minutes": 42,
    "points": 40,
    "fieldGoalsMade": 10,
    "fieldGoalsAttempted": 20,
    "freeThrowsMade": 18,
    "freeThrowsAttempted": 22,
    "rebounds": 5,
    "assists": 8,
    "plusMinus": 5,
    "playerUrl": "https://www.espn.com/nba/player/_/id/4065648/jayson-tatum"
}
```

A standings row:

```json
{
    "type": "standing",
    "league": "eng.1",
    "season": 2026,
    "seasonName": "2026-27 English Premier League",
    "position": 1,
    "teamName": "Manchester City",
    "gamesPlayed": 8,
    "wins": 7,
    "ties": 0,
    "losses": 1,
    "points": 21,
    "pointsFor": 20,
    "pointsAgainst": 9,
    "pointDifferential": 11,
    "overallRecord": "7-0-1",
    "note": "Champions League"
}
```

A player from a roster:

```json
{
    "type": "player",
    "league": "nfl",
    "teamName": "Green Bay Packers",
    "playerId": "4242390",
    "fullName": "Aaron Banks",
    "jersey": "65",
    "position": "G",
    "positionName": "Guard",
    "positionGroup": "offense",
    "age": 29,
    "dateOfBirth": "1997-09-03",
    "height": "6' 5\"",
    "weightLbs": 325,
    "birthPlace": "Alameda, CA, USA",
    "college": "Notre Dame",
    "experienceYears": 6,
    "injuryStatus": "Questionable",
    "playerUrl": "https://www.espn.com/nfl/player/_/id/4242390/aaron-banks"
}
```

An injury:

```json
{
    "type": "injury",
    "league": "nba",
    "season": "2026-27",
    "teamName": "Atlanta Hawks",
    "teamAbbreviation": "ATL",
    "playerId": "4712863",
    "playerName": "Mouhamed Gueye",
    "position": "F",
    "status": "Out",
    "fantasyStatus": "OUT",
    "injury": "Foot",
    "bodyPart": "Leg",
    "detail": "Fracture",
    "side": "Left",
    "expectedReturn": "2026-11-20",
    "updatedAt": "2026-10-19T19:38:00Z",
    "shortComment": "Gueye underwent surgery Tuesday to repair a fractured left foot that he suffered during a workout last week...",
    "playerUrl": "https://www.espn.com/nba/player/_/id/4712863/mouhamed-gueye"
}
```

A news article:

```json
{
    "type": "article",
    "league": "nba",
    "headline": "Kyrie Irving has found new purpose in Dallas alongside Cooper Flagg",
    "description": "Irving and the Mavericks host the Oklahoma City Thunder on Wednesday at 9:30 p.m. ET on ESPN.",
    "published": "2026-10-28T11:15:57Z",
    "byline": "Tim MacMahon",
    "teams": ["Dallas Mavericks"],
    "athletes": ["Kyrie Irving", "Cooper Flagg"],
    "url": "https://www.espn.com/nba/story/_/id/50298824/kyrie-irving-cooper-flagg-dallas-mavericks-new-line"
}
```

### How much does it cost?

You pay per saved result: **$1.00 per 1,000 results**. There is no start fee and no monthly rental. Every row counts as one result, whatever its type.

| Run | Results | Cost |
|---|---|---|
| NBA and Premier League scores, last 7 days | 64 | $0.06 |
| Box score of one NBA game with player stats | about 30 | $0.03 |
| Same game with play-by-play added | about 600 | $0.60 |
| Every NBA game of the 2025-26 season | 1,401 | $1.40 |
| Every MLB game of 2026 | 2,953 | $2.95 |
| Current Premier League table | 20 | $0.02 |

Set **Max results** or a maximum charge per run in the run options, and the Actor stops when it is reached.

### Limits you should know

- **This is unofficial.** The Actor reads the public JSON data that ESPN's own website and apps load. It is not made by, endorsed by or connected to ESPN. If ESPN changes these feeds, the Actor may need an update.
- **Dates follow US Eastern time.** ESPN puts a game on the US Eastern calendar day. A Premier League match at 11:30 UTC is on the same day, but a late NBA game at 02:00 UTC belongs to the previous day. `startTime` is always in UTC.
- **Big seasons take a minute or two.** MLB, college football and college basketball are loaded day by day because ESPN's monthly lists are too large or cut off for them. A full MLB season took 97 seconds and a full college football season 104 seconds in our tests. Other leagues load a season in under 10 seconds.
- **Game details are for team sports.** Tennis, golf, F1 and UFC are covered in Games, Standings (tennis rankings, F1 standings) and News, not in box scores. F1 rows give the finishing order of qualifying, sprint and race sessions (practice is skipped), without lap times. Golf rows give score to par and round scores, not hole by hole.
- **Betting odds appear only when ESPN shows them.** That is usually one sportsbook line (DraftKings) for US leagues, close to game time. Soccer games rarely have odds.
- **Soccer player stats are basic.** Goals, assists, shots, saves, fouls and cards per player. US sports have full box score lines.
- **Rosters are current only.** ESPN does not publish past rosters, so the Season field is ignored in Rosters mode.
- **News is the latest 50 articles** per league or per team. There is no archive search.
- **Injury reports are the current list only.** ESPN shows who is injured now, not past injuries, so schedule the Actor daily to build a history. The US leagues (NFL, NBA, WNBA, MLB, NHL, college football and basketball) have full reports; soccer leagues usually return none.
- **Season numbers follow ESPN.** NBA, NHL and college basketball use the year the season ends (2025-26 = 2026). Soccer uses the year it starts (2025-26 = 2025). NFL, MLB, WNBA and college football use the calendar year.
- **Records in soccer are wins-draws-losses** ("5-0-1" means 5 wins, 0 draws, 1 loss), as ESPN writes them.

### Tips

- **Any league ESPN has works.** Type its ESPN path in **Other leagues**, for example `soccer/jpn.1` (J1 League), `soccer/arg.1` or `basketball/nbl`. You find the path in the address of the league's page on espn.com.
- **Box scores for a whole day or week.** In Game details, leave **Game IDs or URLs** empty and pick leagues and dates. The Actor loads every started or finished game.
- **Join the data.** `gameId`, `teamId` and `playerId` are ESPN's own IDs, so player rows, game rows and standings rows can be joined in a spreadsheet or database.
- **Run it on a schedule.** Run "Yesterday" every morning to keep a results table up to date.

### FAQ

**Is it legal?** The Actor collects only public data that ESPN shows to every visitor without login. Scores and statistics are facts. Results contain names of public figures such as players, coaches and authors, so make sure you have a legitimate reason to process them, as required by the GDPR and similar laws. If you republish article text or images, respect ESPN's terms.

**Do I need an ESPN account or API key?** No.

**Why did I get 0 results?** The league had no games in the dates you chose (for example the off-season), or a team name did not match. The run log names every team or game it could not find.

**Something is broken or missing?** Open a ticket in the Issues tab. Issues are usually answered within a day.

# Actor input Schema

## `mode` (type: `string`):

Games: scores and schedules for the chosen leagues and dates (one result per game). Game details: box score, team stats and player stats for finished games. Team schedule: every game of the teams you list. Standings: one row per team. Teams: team list with IDs. Rosters: one row per player. News: latest articles. Injury reports: current injuries per player with status, body part, expected return date and ESPN comments.

## `leagues` (type: `array`):

One or more leagues. College leagues cover the whole top division (FBS football, Division I basketball), not only ranked teams.

## `customLeagues` (type: `array`):

Any other league ESPN covers, written as sport/league the way ESPN's site uses it, for example "soccer/jpn.1", "soccer/arg.1" or "basketball/nbl".

## `dateRange` (type: `string`):

Which games to get in Games and Game details modes. Dates follow ESPN's US Eastern calendar. "Whole season" uses the Season field below, or the current season if it is empty.

## `dateFrom` (type: `string`):

For custom dates. Format YYYY-MM-DD.

## `dateTo` (type: `string`):

For custom dates. Leave empty for a single day.

## `season` (type: `integer`):

Season year as ESPN numbers it. NBA, NHL and college basketball use the year the season ends (2025-26 = 2026). Soccer uses the year it starts (2025-26 = 2025). NFL, MLB, WNBA and college football use the calendar year. Used by Whole season, Team schedule and Standings. Leave empty for the current season.

## `seasonType` (type: `string`):

Keep only preseason, regular season or playoff games (US leagues).

## `gameStatus` (type: `string`):

Keep only games that have not started, are live, or have finished.

## `teams` (type: `array`):

Team names, abbreviations, ESPN team IDs or ESPN team page URLs, for example "Lakers", "BOS", "Arsenal" or https://www.espn.com/nba/team/\_/name/lal/los-angeles-lakers . Needed for Team schedule. In Games mode it keeps only games of these teams. In Rosters, News and Injury reports it limits the run to these teams.

## `gameIds` (type: `array`):

For Game details. ESPN game IDs or game page URLs, for example https://www.espn.com/nba/game/\_/gameId/401809234 . Leave empty to get box scores for every finished game in the chosen leagues and dates.

## `includePlayerStats` (type: `boolean`):

Game details mode: add one result per player per game with their box score line (points, rebounds, passing yards, goals and so on).

## `includePlays` (type: `boolean`):

Game details mode: add one result per play. An NBA game has about 450 plays and an NFL game about 180, so this adds many results.

## `standingsGroup` (type: `string`):

How standings are split. Default is the way ESPN shows them (for example conferences for the NBA, divisions for MLB).

## `maxItems` (type: `integer`):

Maximum number of results to save. The run stops when this is reached.

## `proxyConfiguration` (type: `object`):

Optional. ESPN's public data works without a proxy. Set one only if runs keep failing.

## Actor input object example

```json
{
  "mode": "games",
  "leagues": [
    "nba",
    "eng.1"
  ],
  "customLeagues": [
    "soccer/jpn.1"
  ],
  "dateRange": "last7Days",
  "seasonType": "all",
  "gameStatus": "all",
  "teams": [
    "Lakers",
    "Arsenal"
  ],
  "gameIds": [
    "https://www.espn.com/nba/game/_/gameId/401809234"
  ],
  "includePlayerStats": true,
  "includePlays": false,
  "standingsGroup": "default",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Games, box scores, standings, players or news articles saved by the run, one item per result.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leagues": [
        "nba",
        "eng.1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pipiagent/espn-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "leagues": [
        "nba",
        "eng.1",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pipiagent/espn-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leagues": [
    "nba",
    "eng.1"
  ]
}' |
apify call pipiagent/espn-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pipiagent/espn-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/V6Z1N1O0EGcdQcqud/builds/Z0Jw3jBe5NjbW1HSy/openapi.json
