# ESPN Sports Scores Scraper 🏀 (games, odds, box scores) (`tagadanar/espn-sports-scraper`) Actor

ESPN scores, schedules, betting odds, box scores, standings, rosters and news for the NFL, NBA, MLB, NHL, NCAA, soccer, UFC, F1, tennis and golf. One flat row per game or player. No API key, no login.

- **URL**: https://apify.com/tagadanar/espn-sports-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** News, Integrations, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 games

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 Sports Scores Scraper: games, odds, box scores, standings

Get ESPN data as clean, flat rows: live and final scores, schedules, betting odds, box scores with one row per player, standings, rosters and news. It covers the NFL, NBA, WNBA, MLB, NHL, NCAA football and basketball, MLS and the big European soccer leagues, UFC, Formula 1, tennis and golf. No API key, no login.

Every row has a `type` field (`game`, `gameDetail`, `playerStat`, `standing`, `team`, `player`, `news`) so one dataset can feed a spreadsheet, a database or a betting model without reshaping.

### What you can do with it

- **Scores and schedule**: pick leagues and a day (or a range of days) and get one row per game with status (scheduled, live, final), score, quarter or period scores, venue, TV channels, records and the betting lines.
- **Odds for bettors**: spread, over/under and moneyline with the provider, plus the opening line next to the closing line, so you can see line movement. Soccer rows include the draw price.
- **Game details**: paste ESPN game links and get the full box score. One `gameDetail` row (team stats, odds from every provider, injuries, win probability, scoring plays or goals and cards) and one flat `playerStat` row per player.
- **Standings**: full tables by conference and division, for the current or a past season.
- **Teams, rosters, team schedules**: every team of a league, players with age, height, college and position, and a team's whole season of games.
- **News**: the latest ESPN headlines for a league.

### Example inputs

Today's NBA and Premier League games with odds:

```json
{ "mode": "scores", "leagues": ["nba", "epl"] }
```

All finished NFL games of one week:

```json
{ "mode": "scores", "leagues": ["nfl"], "date": "2026-10-04", "dateTo": "2026-10-10", "gameStatus": "final" }
```

A full box score from a link:

```json
{ "mode": "gameDetails", "urls": ["https://www.espn.com/nba/game/_/gameId/401810397/timberwolves-cavaliers"] }
```

Every box score of a day (all games of the NBA on January 10):

```json
{ "mode": "gameDetails", "leagues": ["nba"], "date": "2026-01-10" }
```

Standings, a roster and a team's schedule:

```json
{ "mode": "standings", "leagues": ["nfl"] }
```

```json
{ "mode": "rosters", "leagues": ["nba"], "teams": ["Heat", "LAL"] }
```

```json
{ "mode": "schedules", "leagues": ["nfl"], "teams": ["Patriots"], "season": 2025 }
```

### Input

| Field | What it does |
| --- | --- |
| What do you want | Scores and schedule, Game details, Standings, Teams, Rosters, Team schedules, News |
| Leagues | One or more of 52 leagues (list in the input form) |
| Date and Last date | One day or a range, like `2026-01-05` to `2026-01-12`. Empty means ESPN's current scoreboard. Up to 92 days per run |
| Games to keep | All, upcoming only, live only or finished only |
| ESPN links or game IDs | Paste espn.com game, team, scoreboard or standings links. A bare game ID needs its league, like `nba/401810397` |
| Teams | Team names, abbreviations or IDs for Rosters and Team schedules |
| Season | For Standings and Team schedules. 2025 is the 2025-26 season |
| Include player box score rows | Game details: one row per player per game |
| Max results | Stops the run after this many rows |

### Output

Every row has `type`, `league` and `capturedAt`. A `game` row looks like this (shortened):

```json
{
  "type": "game",
  "league": "nba",
  "gameId": "401898406",
  "name": "Miami Heat at Orlando Magic",
  "date": "2026-10-16T23:00:00.000Z",
  "status": "scheduled",
  "homeTeam": "Orlando Magic", "homeScore": null, "homeRecord": "2-1",
  "awayTeam": "Miami Heat", "awayScore": null, "awayRecord": "3-1",
  "venue": "Kia Center", "broadcasts": [],
  "oddsProvider": "DraftKings", "favorite": "home",
  "homeSpread": -2.5, "awaySpread": 2.5, "overUnder": 234.5, "overUnderOpen": 233.5,
  "homeMoneyline": -142, "awayMoneyline": 120
}
```

- Dates are ISO 8601 in UTC. `status` is `scheduled`, `live`, `final`, `postponed`, `canceled`, `delayed` or `suspended`.
- Scores are `null` until a game has started. Odds fields are `null` when ESPN lists no line for that game. ESPN drops the line from a scoreboard once a game is over, so for the closing line of finished games use Game details, which keeps it.
- `season` is the number ESPN uses (the NBA 2026-27 season is 2027).
- UFC rows are one per bout, Formula 1 rows are one per session of a race weekend (no home or away), tennis rows are one per match with sets won and games per set. For fights and tennis, "home" is the competitor ESPN lists first.
- Tennis scoreboards list the whole tournament, so a tennis run returns the tournament's matches rather than only the day you typed.

### Prices

You pay per row delivered, plus a small start fee per run. Volume discounts apply on higher Apify plans.

| Row | Price per 1,000 |
| --- | --- |
| Game (scores, schedule, odds) | $1.50 |
| Game detail (box score, team stats, odds by provider) | $4.00 |
| Player box score line | $0.30 |
| Standing | $1.50 |
| Team, player or news item | $1.00 |

A run start costs $0.001. A date with no games costs only the start fee, and the status message says why nothing came back.

### Good to know

- A day with no games returns zero rows and the run succeeds. The status message says "ESPN lists no games on ..." together with the season dates ESPN gives for that league, so you can tell an off-season date from a quiet day.
- If ESPN refuses a day or a game, the status message names it instead of reporting zero results.
- Schedule it daily to keep a table of fresh scores, or run it once for a backfill.

### FAQ

**Which leagues are included?** NFL, NBA, WNBA, MLB, NHL, NCAA football, men's and women's basketball, baseball and hockey, UFL, CFL, G League, MLS, NWSL, the English, Spanish, German, Italian, French, Dutch, Portuguese, Scottish, Turkish, Mexican, Brazilian, Argentine, Saudi, Japanese and Australian leagues, the main cups, Champions League, Europa League, Conference League, Copa Libertadores, the World Cup, UFC, PFL, Formula 1, NASCAR, IndyCar, ATP, WTA, PGA, LPGA, DP World Tour and the Premier Lacrosse League.

**Can I get betting odds history?** Each game row carries the opening and closing spread, total and moneyline from the first provider ESPN lists. Game details lists every provider.

**Can I get box scores for a whole season?** Run Team schedules for a team, or Scores for a date range, then Game details with the game links or a date. Player rows come out one per player per game.

**Does it need an ESPN account or an API key?** No.

**How do I get fantasy or analytics data?** Use Game details with player box score rows: stats are named columns like `points`, `rebounds`, `passingYards`, `totalShots`.

Keywords: ESPN scraper, ESPN API, sports scores API, NFL scores, NBA box score, soccer scores, sports odds data, standings, fantasy sports data.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/espn-sports-scraper/changelog.md

# Actor input Schema

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

Scores and schedule: one row per game with score, status, venue, TV and betting odds. Game details: box score, team stats, player stats, odds from every provider, injuries, win probability. Standings: league tables. Teams, Rosters, Team schedules and News cover the rest.

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

Pick one or more leagues. Soccer, college sports, UFC, Formula 1, tennis and golf are included. With nothing picked, paste ESPN links below instead.

## `date` (type: `string`):

A day like 2026-01-05, or today, tomorrow, yesterday. Leave empty for ESPN's current scoreboard (today's games, or this week's for the NFL). Used by Scores and Game details.

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

Fill it to read every day from Date to this day, e.g. 2026-01-12. Up to 92 days per run.

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

Keep only games that are still to be played, are live right now, or are finished.

## `urls` (type: `array`):

Paste espn.com links: a game or match page, a team page, or a scoreboard or standings page. A bare game ID needs its league in front, like nba/401810397. Links work in every mode.

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

Team names, abbreviations or ESPN team IDs, one per line, e.g. Lakers, BOS, 14. They are looked up in each league you picked. Leave empty to read every team of the league.

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

Standings and Team schedules only. The season year ESPN uses (2025 is the 2025-26 season for the NBA, NHL and European soccer). Leave empty for the current season.

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

Game details only. Adds one row per player per game (minutes, points, yards, shots and so on). Turn it off if you only want the game-level row.

## `maxResults` (type: `integer`):

Stops the run after this many rows (all row types together). You only pay for rows delivered.

## Actor input object example

```json
{
  "mode": "scores",
  "leagues": [
    "nba",
    "epl",
    "mlb",
    "mls"
  ],
  "gameStatus": "all",
  "includePlayerStats": true,
  "maxResults": 1000
}
```

# Actor output Schema

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

One item per game, game detail, player stat line, standing, team, player or news article in the default dataset (see the type field).

# 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",
        "epl",
        "mlb",
        "mls"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/espn-sports-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",
        "epl",
        "mlb",
        "mls",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/espn-sports-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",
    "epl",
    "mlb",
    "mls"
  ]
}' |
apify call tagadanar/espn-sports-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/espn-sports-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/JNb9UUhyA3ftSUgqZ/builds/rnjdn3tOXbYlrEYEO/openapi.json
