# NFL Stats and Play-by-Play Scraper (`parselab/nfl-football-stats-scraper`) Actor

Get NFL player and team stats by week or season, play-by-play with EPA and win probability, snap counts, injury reports, rosters, depth charts, betting lines, weather and draft picks. Weekly player rows include snap share and injury status. Any season since 1999. Export to CSV or Excel.

- **URL**: https://apify.com/parselab/nfl-football-stats-scraper.md
- **Developed by:** [ParseLab](https://apify.com/parselab) (community)
- **Categories:** Sports, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 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

## NFL Stats and Play-by-Play Scraper

This NFL scraper returns player stats, team stats, play-by-play, snap counts, injury reports, rosters, depth charts, schedules with betting lines and weather, draft picks and combine results as clean rows. Pick a season, add filters for teams, weeks, positions or player names and export the result. Data goes back to 1999.

The weekly player rows are built for fantasy football and modeling. Each row has the full stat line (passing, rushing, receiving, defense, kicking), advanced numbers such as EPA, CPOE, target share, air yards share and WOPR, three fantasy point columns (standard, half PPR, full PPR), plus the player's snap counts and share and the injury report status for that same week. You get what usually takes four separate downloads in one table.

Fantasy players, betting analysts, sports journalists, data scientists and students use it to rank players, build models and write about the game.

### What can you do with this NFL scraper?

- Get weekly stats for every NFL player in a season
- Rank running backs and receivers by snap share and target share
- Find players who were listed as questionable or out on the injury report
- Pull play-by-play with EPA, win probability and success rate
- Download every pass play of one team in one week
- Get schedules with spread, total, moneylines, roof, surface, temperature and wind
- Compare teams by offensive and defensive EPA per week
- See passing drops, pressures and broken tackles from advanced reports
- List draft picks and combine results by year
- Export NFL data to CSV or Excel

### What data can you extract from the NFL?

| Mode | One row is | Highlights |
|---|---|---|
| Player stats | One player and week, or season | Passing, rushing, receiving, defense, kicking, EPA, CPOE, target share, WOPR, fantasy points, snap share, injury status |
| Team stats | One team and week, or season | Team totals for offense and defense with EPA |
| Games | One game | Score, spread, total, moneylines, rest days, roof, surface, temperature, wind, quarterbacks, coaches, referee, stadium |
| Play-by-play | One play | Down, distance, field position, play type, description, EPA, win probability, players involved, scores |
| Injuries | One player and week | Report status, injury, practice status |
| Snap counts | One player and game | Offense, defense and special teams snaps and shares |
| Rosters and depth charts | One player | Position, jersey number, height, weight, college, IDs, depth chart slot |
| Advanced stats | One player and week | Drops, bad throws, pressures, blitzes, broken tackles, yards after contact |
| Draft picks and combine | One player | Round, pick, team, career value, forty time, vertical, bench |
| Player directory | One player | Birth date, position, college, latest team, IDs across sites |

### How to scrape NFL stats

1. Choose **What to collect**, for example Player stats.
2. Enter a season such as `2024`. Leave it empty for the latest season with data.
3. Add optional filters: weeks, teams, positions or player names.
4. Set **Max Items** and click **Start**.
5. Export the dataset as CSV, Excel or from the Apify console.

### Input example

```json
{
  "mode": "playerstats",
  "seasons": ["2024"],
  "weeks": ["1"],
  "positions": ["QB"],
  "level": "week",
  "includeContext": true,
  "maxItems": 50
}
```

### Player stats output example

```json
{
  "playerDisplayName": "Patrick Mahomes",
  "position": "QB",
  "season": 2024,
  "week": 1,
  "team": "KC",
  "opponentTeam": "BAL",
  "completions": 20,
  "attempts": 28,
  "passingYards": 291,
  "passingTds": 1,
  "passingInterceptions": 1,
  "passingEpa": 11.08,
  "passingCpoe": 4.19,
  "fantasyPoints": 14.14,
  "fantasyPointsHalfPpr": 14.64,
  "fantasyPointsPpr": 15.14,
  "offenseSnaps": 54,
  "offenseSnapPct": 1
}
```

### Play-by-play output example

```json
{
  "gameId": "2024_01_BAL_KC",
  "posteam": "BAL",
  "defteam": "KC",
  "qtr": 1,
  "down": 2,
  "ydstogo": 13,
  "playType": "pass",
  "desc": "(13:55) (Shotgun) 8-L.Jackson pass short right to 43-J.Hill pushed ob at BAL 29 for 2 yards (27-C.Conner).",
  "yardsGained": 2,
  "epa": -0.39,
  "wp": 0.404,
  "passerPlayerName": "L.Jackson",
  "receiverPlayerName": "J.Hill"
}
```

### How much does it cost to scrape the NFL?

You pay per result: $20 per 1,000 rows plus a tiny start fee. The free plan returns up to 10 rows per run. A full season of weekly player stats is about 19,000 rows and a full season of play-by-play is about 49,000 plays.

### Tips for better results

- For play-by-play, use the play type and team filters to keep the dataset small. The default returns about 70 useful columns. Switch to all columns to get every one of the 370.
- Snap share and injury status are added to weekly player rows by default. Turn that off if you only need the stat line.
- Playoff weeks continue the numbering after the regular season, so in recent seasons week 19 is the first playoff round.
- Names accept partial matches, so `Mahomes` finds Patrick Mahomes.
- Very recent games can take a day or two to appear.

### Who uses NFL data?

- **Fantasy football players** rank players by usage, not just points.
- **Betting analysts** build models from EPA, lines and weather.
- **Writers and podcasters** back up their takes with numbers.
- **Students and data scientists** practice on clean, complete play-by-play.

### Automate and connect

Schedule the Actor every Tuesday during the season to pull the latest week. Send finished datasets to Google Sheets, Zapier, Make or n8n, or trigger a webhook when a run ends.

### FAQ

**Do I need an NFL account?**
No. The Actor works without any login.

**Where does the data come from?**
It is compiled by the open nflverse project and shared under the Creative Commons Attribution 4.0 license. Credit nflverse if you publish the data.

**How far back does it go?**
Player stats, team stats and play-by-play start in 1999. Some reports, such as snap counts and injuries, start in later seasons.

**Does it include college football?**
No. This Actor covers the NFL only.

**Can I get live scores during a game?**
No. Data is published after games finish.

### Legal note

This Actor collects information that is publicly visible on the website. Check the source site's terms and your local rules before using the data. Nothing here is betting or financial advice.

### Support

Missing a field or found a bug? Open an issue from the Actor page.

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

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

Player stats give one row per player and week (or season). Team stats give one row per team and week. Games gives schedule, scores, betting lines and weather. Play-by-play gives one row per play. Injuries, snap counts, rosters, depth charts and advanced stats come from the weekly reports. Draft picks, combine results and the player directory are also available.

## `seasons` (type: `array`):

Seasons to collect, for example 2024 or 2025. Leave empty for the latest season with data. Player and team stats start in 1999, play-by-play in 1999.

## `weeks` (type: `array`):

Weeks to keep, for example 1, 2, 3. Playoff weeks continue the numbering after the regular season. Leave empty for all weeks.

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

Regular season, playoffs or both.

## `level` (type: `string`):

Week gives one row per game played. Season gives season totals.

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

Team abbreviations such as KC, SF, BUF, DAL. Leave empty for all teams.

## `positions` (type: `array`):

Positions to keep, for example QB, RB, WR, TE, K.

## `playerNames` (type: `array`):

Keep only rows that match these names, for example Mahomes or Travis Kelce. Partial names work.

## `includeContext` (type: `boolean`):

For weekly player stats, add offensive and defensive snap counts and shares plus the injury report status of the same week.

## `advType` (type: `string`):

Which advanced report to return in advanced stats mode.

## `playTypes` (type: `array`):

Keep only these play types in play-by-play mode, for example pass, run, field\_goal, punt, kickoff.

## `pbpColumns` (type: `string`):

Essential returns about 70 useful columns per play. All returns every one of the 370 columns.

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

Game IDs such as 2024\_01\_BAL\_KC to limit play-by-play to specific games.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "playerstats",
  "seasons": [
    "2024"
  ],
  "seasonType": "all",
  "level": "week",
  "includeContext": true,
  "advType": "pass",
  "pbpColumns": "essential"
}
```

# Actor output Schema

## `overview` (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 = {
    "maxItems": 10,
    "seasons": [
        "2024"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parselab/nfl-football-stats-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 = {
    "maxItems": 10,
    "seasons": ["2024"],
}

# Run the Actor and wait for it to finish
run = client.actor("parselab/nfl-football-stats-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 '{
  "maxItems": 10,
  "seasons": [
    "2024"
  ]
}' |
apify call parselab/nfl-football-stats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parselab/nfl-football-stats-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/4YW0HQOaaNUlCmBZz/builds/eoQUbSQOZ5X5ww6kv/openapi.json
