Skip to content
EndzoneAPI

Documentation

23 football data endpoints over REST and MCP. One key, credits per call.

Coming from ESPN's endpoints or nflverse? See how they compare.

Your first call

Sign up for a free key (500 credits every month, no card), swap it in for YOUR_API_KEY, and send this. get_standings costs 2 credits.

Request

curl -X POST https://mcp.endzoneapi.com/v1/get_standings \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
  "season": 2025,
  "division": "AFC West"
}'

Response

json
{
  "season": 2025,
  "standings": [
    {
      "team": "DEN",
      "name": "Denver Broncos",
      "conference": "AFC",
      "division": "AFC West",
      "division_rank": 1,
      "conference_rank": 1,
      "division_tiebreaker": "record",
      "conference_tiebreaker": "common games",
      "wins": 14,
      "losses": 3,
  ...

First 14 lines. Full response and every field

REST / cURL

POST to /v1/{tool_name} with your params as JSON body. No MCP client needed:

bash
curl -X POST https://mcp.endzoneapi.com/v1/list_teams \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY"

With parameters:

bash
curl -X POST https://mcp.endzoneapi.com/v1/get_standings \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{"season":2025,"division":"AFC West"}'

Save the raw JSON

Keep your key in an environment variable so it never sits in a script or a chat, and write each response to a file:

bash
export ENDZONEAPI_API_KEY="your key here"

curl -s -X POST https://mcp.endzoneapi.com/v1/get_standings \
  -H "Content-Type: application/json" \
  -H "x-api-key: $ENDZONEAPI_API_KEY" \
  -d '{"season":2025,"division":"AFC West"}' \
  -o get_standings.json

The file holds exactly what the API returned. Tools that page their results return a next_offset; send it back as offset for the next page.

ChatGPT and Claude

Both connect to the MCP server with a sign-in instead of a key: you sign in to EndzoneAPI once and press Allow. Step-by-step for ChatGPT and Claude.

Python

The official client is on PyPI. It has no required dependencies. Set ENDZONEAPI_API_KEY to your key and it is picked up automatically:

bash
pip install endzoneapi

Then call any endpoint as a method (the example uses pandas, pip install "endzoneapi[pandas]"):

python
from endzoneapi import Client, to_dataframe

client = Client()

print(client.get_player_props(game_id="2025_01_KC_LAC", estimate_only=True))

props = client.get_player_props(
    game_id="2025_01_KC_LAC",
    market="player_pass_yds",
    bookmaker="draftkings",
)
df = to_dataframe(props, key="props")
print(df[["player_name", "line", "over_odds", "under_odds"]])

Claude Desktop

Add to your claude_desktop_config.json:

json
{
  "mcpServers": {
    "endzoneapi": {
      "url": "https://mcp.endzoneapi.com/mcp?key=YOUR_API_KEY"
    }
  }
}

Claude Code

One command:

bash
claude mcp add endzoneapi https://mcp.endzoneapi.com/mcp?key=YOUR_API_KEY --transport streamable-http

Find the right call

All 27 questions

What timestamps mean, whether lines are pre-game, and what you can do with the data: data timing and rights.

Working Python, JavaScript and cURL for common questions, each run against the live API.

Endpoints

23 endpoints by category. Each page has parameters, requests in three formats, a full example response and every response field.

Reference

Authentication

Every request requires an API key. Pass it via header or query parameter:

bash
x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY
# or (MCP only)
?key=YOUR_API_KEY

Verify your email, then create an API key from the dashboard. Free accounts get 500 credits every month.

Base URL

text
https://mcp.endzoneapi.com

REST API: POST /v1/{tool} with JSON body. Works with cURL, Python, any HTTP client.

MCP: POST /mcp via Streamable HTTP. Works with Claude Desktop, Claude Code, Cursor, and any MCP client.

Rate limits

Credit balanceRate limit
100 credits or more60 req/min
Under 100 credits10 req/min

The limit is the same on every plan. It is burst protection, not the spend boundary; credits are that, and they are enforced per request. Running low slows you down so you notice before the balance reaches zero.

Error handling

CodeMeaningWhat to do
400Invalid parametersCheck required fields and value types
401Invalid or missing API keyCheck your x-api-key header
402Insufficient creditsTop up your wallet or upgrade your plan
429Rate limit exceededWait and retry (see limits above)
500Server errorRetry with idempotency key. Credits auto-refund on server errors.

Pass x-idempotency-key or x-request-id headers to make retries duplicate-safe.

Data coverage

NCAA FBS college football (NCAAF)

EndzoneAPI also serves the NCAAF. Pass "league": "ncaaf" to any tool that lists it, or connect to https://mcp.endzoneapi.com/mcp/ncaaf. NCAAF API coverage.

NCAA FCS college football (FCS)

EndzoneAPI also serves the FCS. Pass "league": "fcs" to any tool that lists it, or connect to https://mcp.endzoneapi.com/mcp/fcs. FCS API coverage.

DataStatusCoverageVolume
Games and schedules
Scores, kickoff (UTC), venue, surface, weather, rest days, starting QBs, coaches, referee, and the consensus closing spread, total, and moneylines.
Available1999 to current7,500+ games
Standings
Computed from final scores: record, points, home/away/division/conference splits, streak, division rank, and conference playoff seed.
Ranks apply the NFL tiebreaking procedure and report which step decided each position; conference_rank is the playoff seed, so division winners hold seeds 1-4. Net touchdowns and the coin toss, the ladder's last two steps, are not applied.
Available1999 to currentOne row per team per season
Weekly player stats
150 columns per player-week: passing, rushing, receiving, defense, kicking, punting, returns, fantasy points.
Available1999 to current470,000+ stat lines
Weekly team stats
The same stat set aggregated per team and game, plus EPA and success.
Available1999 to current14,000+ team-weeks
Play-by-play
160 columns per play: situation, result, EPA, WPA, win probability, CPOE, xPass, players involved, drive context.
Available1999 to current1,200,000+ plays
Injury reports
Official weekly report: game status and practice participation with the injury named.
Available2009 to current4,500 to 6,200 rows per season
Depth charts
Weekly depth chart per team, formation, position, and rank.
2025 onwards is a daily source; the last snapshot before each week's kickoff is kept.
Available2001 to current27,000 to 41,000 rows per season
Snap counts
Offensive, defensive, and special-teams snaps and shares per player per game.
Keyed by PFR player id.
Available2013 to current23,000+ rows per season
Odds and line movement
Moneyline, spread, and total per bookmaker with opening, closing, and hourly history.
For 2014-2019, each book's final pregame line, about 4-9 books a game (Westgate, Caesars, 5Dimes, Wynn, Unibet and others; no opening line, and Pinnacle only in part of 2015). From 2020, up to four game-day snapshots per game (closing is the last one before kickoff, usually within five hours of it), hourly from 2026: 7 books for 2020-2022, 7 or 8 in 2023, 8 from 2024 including Pinnacle. Alternate spreads and totals from 2023, the current season included (2023-2025 from 6 books; 2026 captured with each props snapshot from 7).
PartialConsensus closing spread and total 1999 to current (moneylines from 2006); per-book closing lines from 2014; opening and closing from 2020; player props from 2023; alternate lines from 2023, the current season includedHourly snapshots in-season
Next Gen Stats and PFR advanced
Tracking and advanced metrics the box score does not carry: time to throw, air yards, completion percentage above expectation, separation, cushion, rush yards over expected, plus pressures, hurries, blitzes, drops, bad throws, missed tackles, and coverage yards allowed.
NGS rows key on GSIS player id, PFR rows on PFR id; week 0 on an NGS row is that season's aggregate.
AvailableNGS 2016 to current, PFR 2018 to current149,000+ player-weeks

Coverage describes the datasets EndzoneAPI supports. Freshness and operational health are tracked separately.

Odds snapshot definitions

opening: The first per-book price captured for a game: from 2026 the first hourly snapshot; for 2020-2025, the earliest of up to four game-day snapshots (morning, midday, evening UTC) taken before kickoff.

closing: The last per-book price before kickoff. For every game since 1999, the consensus closing spread and total are on the game itself (get_games), and the moneyline for every game since 2010 (most from 2006).

Odds coverage currently documents DraftKings, FanDuel, BetMGM, ESPN BET and Pinnacle, plus three more books, hourly in season (Pinnacle and those three were not captured from February 9 to October 6 2026). Per-bookmaker lines start with the 2014 season (closing only, 4-9 books) and gain opening lines and these eight books in 2020; earlier games carry the consensus closing line only. Per-book lines start with the 2014 season: for 2014-2019 each book's final pregame line (4-9 books, closing only); for 2020-2025 up to four snapshots per game day (only those taken before kickoff); hourly from 2026. Earlier games carry the consensus closing line only.

Response format

REST API

All successful REST responses wrap the result in a data key:

json
{ "data": { "teams": [...], "count": 32 } }

Error responses return:

json
{ "error": "Insufficient credits", "message": "This tool costs 5 credits, you have 2" }

MCP Protocol

MCP responses follow the standard MCP tool result format. The data is returned directly (no data wrapper). Both access methods return identical data, just different envelopes.

Conventions

Seasons: 4-digit season year, the year the regular season starts (2025 for the 2025-26 season). Example: 2025.

Game IDs: season_week_away_home, e.g. 2025_01_KC_BUF (season_week_away_home). Get them from get_games or get_schedule.

Team abbreviations: Standard codes (KC, BUF, PHI, SF). Use list_teams if unsure.

Pagination: Endpoints use a limit parameter. No cursor or offset. Narrow your filters to get different slices of data.

Credits: Deducted before the request executes. Automatically refunded on server errors. Monthly credits are used first, then wallet balance.

Ready to start?

500 free credits every month. No credit card required.

Get a free key