# ESPN Scraper — Scores, Schedules, Standings, Rosters & News (`technicaldost/espn-scraper-scores-stats-news`) Actor

Scrape ESPN scores, schedules, standings, teams, rosters and news for NFL, NBA, MLB, NHL, college sports, soccer, F1, golf and UFC. Any date range, including the ranges ESPN's API now rejects with HTTP 400. $0.50 per 1,000 rows.

- **URL**: https://apify.com/technicaldost/espn-scraper-scores-stats-news.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 gets **structured sports data from ESPN** for **19 leagues**: NFL, NBA, MLB, NHL, WNBA, college football and basketball, Premier League, LaLiga, Bundesliga, Serie A, Ligue 1, MLS, Liga MX, Champions League, Formula 1, PGA Tour and UFC. Choose what you need: **games** (scores, schedules, line scores, records, venue, attendance, TV, betting line, headline), **standings**, **teams**, **player rosters** (position, jersey, age, height, weight, college, headshot) and **news** articles. Pick any **date range** (or relative dates like `-7` to `+7` for scheduled runs) and filter by team. No API key, no login.

> **ESPN API date range returning 400?** ESPN's scoreboard endpoint stopped accepting `dates=YYYYMMDD-YYYYMMDD` ranges ("Failed to get events endpoint"), which breaks most scripts that pull a week or a season of games. This Actor requests one day at a time in parallel and merges the results, so any range up to a year works.

### What you get

- 19 leagues across football, basketball, baseball, hockey, soccer, F1, golf and MMA.
- Games: scores, status, quarter/period line scores, team records, venue, attendance, broadcasters, betting line (for upcoming games) and recap headline.
- Any date range up to a year, or relative dates (-7, +7, today) that stay valid in scheduled runs.
- Standings by conference/division with wins, losses, win %, games behind, streak and all ESPN stat columns.
- Rosters with position, jersey, age, height, weight, birth date and place, college, experience and headshot.
- Team filter by code, nickname or full name (e.g. KC, Lakers, Real Madrid). News articles with teams and athletes tagged.

### How to use ESPN Scraper

1. Pick **Leagues** and **Data types** (games, standings, teams, rosters, news).
2. For games, set **Start date** and **End date** (YYYY-MM-DD, or -7 / +7 / today).
3. Optionally add **Teams** to filter (e.g. `KC`, `Lakers`).
4. Run and export to JSON, CSV or Excel, or feed Google Sheets, a dashboard, a betting model or an AI agent.

### Input example

```json
{
  "leagues": [
    "nfl",
    "nba"
  ],
  "dataTypes": [
    "games",
    "standings"
  ],
  "startDate": "-7",
  "endDate": "+7"
}
```

All fields are described in the **Input** tab.

### Output example

```json
{
  "type": "game",
  "league": "nfl",
  "gameId": "401873023",
  "date": "2026-10-30T00:15Z",
  "name": "Carolina Panthers at Green Bay Packers",
  "shortName": "CAR @ GB",
  "season": 2026,
  "seasonType": "regular-season",
  "status": "Final",
  "statusDetail": "Final",
  "completed": true,
  "homeTeam": {
    "id": "9",
    "name": "Green Bay Packers",
    "abbreviation": "GB",
    "score": 27,
    "winner": true,
    "record": "5-3",
    "linescores": [
      6,
      14,
      7,
      0
    ],
    "leaders": []
  },
  "awayTeam": {
    "id": "29",
    "name": "Carolina Panthers",
    "abbreviation": "CAR",
    "score": 19,
    "winner": false,
    "record": "3-4",
    "linescores": [
      3,
      7,
      3,
      6
    ],
    "leaders": []
  },
  "participants": [],
  "venue": "Lambeau Field",
  "venueCity": "Green Bay",
  "venueState": "WI",
  "attendance": 76957,
  "broadcasts": [
    "Prime Video"
  ],
  "odds": null,
  "headline": "Love throws 3 TD passes as the Packers beat the Panthers 27-19",
  "url": "https://www.espn.com/nfl/game/_/gameId/401873023/panthers-packers",
  "scrapedAt": "2026-11-01T20:47:19.364Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `type` | game, team, player, standing or article. |
| `league` | League key, e.g. nfl, eng.1. |
| `gameId` | ESPN game ID. |
| `date` | Start time (UTC). |
| `name` | Game, team or player name. |
| `shortName` | Short game name, e.g. CAR @ GB. |
| `season` | Season year. |
| `seasonType` | regular-season, post-season... |
| `status` | Scheduled, In Progress, Final... |
| `statusDetail` | Detail, e.g. Final/OT or 7:30 PM ET. |
| `completed` | Game finished. |
| `homeTeam` | Home team: id, name, abbreviation, score, winner, record, line scores, leaders. |
| `awayTeam` | Away team (same fields). |
| `participants` | Participants for F1, golf and UFC events. |
| `venue` | Venue. |
| `venueCity` | Venue city. |
| `venueState` | Venue state/country. |
| `attendance` | Attendance. |
| `broadcasts` | TV/streaming. |
| `odds` | Betting line (details, over/under, spread) when shown. |
| `headline` | Recap/preview headline. |
| `url` | ESPN page URL. |
| `teamId` | ESPN team ID. |
| `abbreviation` | Team code. |
| `location` | Team location. |
| `nickname` | Team nickname. |
| `color` | Team color. |
| `alternateColor` | Alternate color. |
| `logoUrl` | Team logo. |
| `playerId` | ESPN player ID. |
| `teamName` | Team name. |
| `position` | Position. |
| `jersey` | Jersey number. |
| `age` | Age. |
| `height` | Height. |
| `weight` | Weight. |
| `birthDate` | Birth date. |
| `birthPlace` | Birthplace. |
| `experienceYears` | Years of experience. |
| `college` | College. |
| `headshotUrl` | Player photo. |
| `group` | Conference/division/group. |
| `rank` | Rank or seed. |
| `wins` | Wins. |
| `losses` | Losses. |
| `ties` | Ties/draws. |
| `winPercent` | Win %. |
| `gamesBehind` | Games behind. |
| `points` | Points (soccer/hockey). |
| `streak` | Streak. |
| `stats` | All ESPN standings columns. |
| `articleId` | Article ID. |
| `description` | Article summary. |
| `published` | Publish time. |
| `articleType` | Story, Recap... |
| `byline` | Author. |
| `teams` | Teams tagged in the article. |
| `athletes` | Athletes tagged in the article. |
| `imageUrl` | Article image. |
| `scrapedAt` | When the row was scraped. |

Export results as JSON, CSV, Excel, XML or HTML, or read them with the API.

### Use cases

- Sports apps, Discord bots and newsletters: daily scores, schedules and headlines.
- Fantasy sports and betting models: results, line scores, standings and rosters.
- Media and data journalism: season datasets for any league.
- Dashboards: schedule a run with relative dates for a rolling week of games.
- AI agents: give an assistant fresh, structured sports facts.

### How much does ESPN Scraper cost?

This Actor uses **pay-per-event** pricing: **$0.0005 per row** ($0.5 per 1,000). Platform usage is included. There is no start fee. Leagues or dates with no data cost nothing.

Set **Maximum cost per run** in the run options to cap your spend; the Actor stops when the limit is reached.

### Use ESPN Scraper with AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP client this Actor as a tool through the hosted [Apify MCP server](https://mcp.apify.com):

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=technicaldost/espn-scraper-scores-stats-news" --header "Authorization: Bearer YOUR_APIFY_TOKEN"
```

Or in a JSON MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=technicaldost/espn-scraper-scores-stats-news",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

The tool is named `technicaldost--espn-scraper-scores-stats-news`. Ask your agent, for example, to *"run ESPN Scraper with {"leagues": \["nfl", "nba"], "dataTypes": \["games", "standings"], "startDate": "-7", "endDate": "+7"}"*.

### Run ESPN Scraper via API

```bash
curl -X POST "https://api.apify.com/v2/acts/technicaldost~espn-scraper-scores-stats-news/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"leagues": ["nfl", "nba"], "dataTypes": ["games", "standings"], "startDate": "-7", "endDate": "+7"}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("technicaldost/espn-scraper-scores-stats-news").call(run_input={"leagues": ["nfl", "nba"], "dataTypes": ["games", "standings"], "startDate": "-7", "endDate": "+7"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('technicaldost/espn-scraper-scores-stats-news').call({"leagues": ["nfl", "nba"], "dataTypes": ["games", "standings"], "startDate": "-7", "endDate": "+7"});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Integrations

Schedule runs (daily, hourly) in Apify Console and send results to Google Sheets, Slack, Make, Zapier, n8n, Airbyte or your own webhook.

### FAQ

#### Where does the data come from?

From the same public ESPN endpoints espn.com's own pages load. No API key or account.

#### How far back can I go?

Any date ESPN has a scoreboard for, up to one year per run. The Actor reads the scoreboard day by day, because ESPN no longer answers date ranges in one request (that is why some other ESPN scrapers return nothing).

#### Does it include live scores?

Yes. Games in progress have status In Progress with the current score and period; run it on a schedule for updates.

#### Why are odds empty?

ESPN shows the betting line only for upcoming games in some leagues.

#### What about F1, golf and UFC?

They have games (events with participants) and news; ESPN has no team lists, rosters or standings for them.

#### How is it priced?

$0.50 per 1,000 rows (a game, team, player, standing or article). No start fee.

#### Is it legal to scrape this data?

The Actor collects publicly available information only and does not log in or bypass access controls. Use the data in line with the website's terms and the laws that apply to you, especially when processing personal data.

### Related Actors

More tools from the same developer that work well together with this one:

- [Google News Article Scraper](https://apify.com/technicaldost/google-news-scraper): Search Google News by topic and export structured articles: title, source, publish date, URL and snippet.
- [RSS Feed Scraper - RSS & Atom to JSON](https://apify.com/technicaldost/rss-feed-scraper): Convert public RSS and Atom feeds to JSON or CSV, or paste any website and the Actor finds its feed.
- [Reddit Post Scraper](https://apify.com/technicaldost/reddit-public-content-scraper): Get the newest public Reddit posts from any subreddit, user, search or post URL: title, text, author, subreddit, link, flair and date.
- [Google Trends Scraper — Interest, Regions & Related Queries](https://apify.com/technicaldost/google-trends-explorer-interest-related-queries): Google Trends data as JSON: interest over time, interest by country/state/city and related queries (top and rising) for any keywords.

# Actor input Schema

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

Leagues to scrape.

## `dataTypes` (type: `array`):

Games (scores and schedules), standings, teams, rosters (players) and news.

## `startDate` (type: `string`):

For games: YYYY-MM-DD, or -N / +N days from today, or today.

## `endDate` (type: `string`):

For games: YYYY-MM-DD, or -N / +N days from today, or today. Up to one year after the start.

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

Optional filter: team codes, nicknames or names, e.g. KC, Lakers, Arsenal.

## `maxNewsPerLeague` (type: `integer`):

Up to 100.

## Actor input object example

```json
{
  "leagues": [
    "nba",
    "nfl"
  ],
  "dataTypes": [
    "games",
    "news"
  ],
  "startDate": "-3",
  "endDate": "+3",
  "maxNewsPerLeague": 25
}
```

# Actor output Schema

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

No description

# 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",
        "nfl"
    ],
    "dataTypes": [
        "games",
        "news"
    ],
    "startDate": "-3",
    "endDate": "+3"
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/espn-scraper-scores-stats-news").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",
        "nfl",
    ],
    "dataTypes": [
        "games",
        "news",
    ],
    "startDate": "-3",
    "endDate": "+3",
}

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/espn-scraper-scores-stats-news").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",
    "nfl"
  ],
  "dataTypes": [
    "games",
    "news"
  ],
  "startDate": "-3",
  "endDate": "+3"
}' |
apify call technicaldost/espn-scraper-scores-stats-news --silent --output-dataset

```

## MCP server setup

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

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/uPGuFKoFuvuDSZpOX/builds/9q32C46sdZUQfM9R4/openapi.json
