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
{
"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:
curl -X POST https://mcp.endzoneapi.com/v1/list_teams \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY"With parameters:
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:
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.jsonThe 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:
pip install endzoneapiThen call any endpoint as a method (the example uses pandas, pip install "endzoneapi[pandas]"):
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:
{
"mcpServers": {
"endzoneapi": {
"url": "https://mcp.endzoneapi.com/mcp?key=YOUR_API_KEY"
}
}
}Claude Code
One command:
claude mcp add endzoneapi https://mcp.endzoneapi.com/mcp?key=YOUR_API_KEY --transport streamable-httpFind the right call
All 27 questions- I want a list of all teams and their codeslist_teams
- Who is leading the AFC East?get_standings
- What games are on this week?get_schedule
- Give me every game from the 2024 season with closing linesget_games
- What happened in the Chiefs vs Chargers opener?get_game_detail
- How have the Bills done against the Chiefs recently?get_head_to_head
What timestamps mean, whether lines are pre-game, and what you can do with the data: data timing and rights.
Guides
All guidesWorking Python, JavaScript and cURL for common questions, each run against the live API.
- How do I see how an NFL player prop line moved before kickoff in Python?get_prop_movement
- How do I backtest NFL closing lines in Python?get_games
- How do I calculate NFL EPA per play in Python?get_plays
- How do I get an NFL player's weekly stats in Python?get_player_stats
- How do I get NFL Next Gen Stats in Python?get_advanced_stats
- How do I compare NFL player prop lines across sportsbooks?get_player_props
- How do I track NFL spread and total movement in Python?get_line_movement
- How often does an NFL quarterback go over his passing yards line?get_prop_history
- How do I get NFL scores and the schedule for a week in Python?get_schedule
- How do I get NFL standings in Python?get_standings
- How do I get the NFL injury report in Python?get_injuries
- How often does an NFL receiver go over his receiving yards line?get_prop_history
- How often does an NFL player score when he is priced to?get_prop_history
- How often does an NFL running back go over his rushing yards line?get_prop_history
- How often does an NFL receiver go over his receptions line?get_prop_history
- How often does an NFL quarterback go over his passing touchdowns line?get_prop_history
- How do I get first half NFL odds history in Python?get_market_odds
Endpoints
23 endpoints by category. Each page has parameters, requests in three formats, a full example response and every response field.
Static reference1 credit/call
Basic lookup2 credits/call
- get_standings2 creditsStandings and playoff seeding by the NFL tiebreaking procedure, with the step that decided each rank
- get_schedule2 creditsUpcoming games by week or for the next N days
- search_players2 creditsFind players by name, team, or position
- get_injuries2 creditsInjury report by team and week with practice and game status
- get_depth_chart2 creditsTeam depth chart by week
Stats + aggregation5 credits/call
- get_team_stats5 creditsTeam totals and per-week lines with EPA, success rate, and situational splits
- get_games5 creditsQuery games by season, week, team, date, type, or status, with closing lines
- get_player_stats5 creditsWeekly and season stat lines for one player: passing, rushing, receiving, defense, kicking, fantasy
- get_player_leaders5 creditsLeaderboard for any stat, filtered by position, team, and season
- get_snap_counts5 creditsOffensive, defensive, and special-teams snaps and shares by game or player
- get_advanced_stats5 creditsNext Gen Stats tracking metrics and Pro Football Reference advanced stats
Multi-table10 credits/call
- get_game_detail10 creditsFull game detail with team stats, starting QBs, odds, weather, and officials
- get_head_to_head10 creditsMatchup history with win/loss records and margins
- get_plays10 creditsPlay-by-play with EPA, win probability, situation filters
- get_odds10 creditsOdds by game with bookmaker filters
- get_player_props10 creditsPlayer prop lines by sportsbook, opening and closing
- get_prop_history10 creditsA player's prop lines against the result, game by game
- get_prop_movement10 creditsHow one player's prop line moved before a game, every capture by sportsbook
- get_alt_lines10 creditsAlternate spreads and totals by sportsbook: every point on the ladder, opening and closing, from the 2023 season to the current one
- get_alt_player_props10 creditsAlternate player prop ladders by sportsbook: every passing, rushing and receiving line a book posted for a player (history from the 2023 season)
- get_market_odds10 creditsOpening and closing lines by sportsbook for the half and quarter markets (history from the 2023 season)
Time-series25 credits/call
Reference
Authentication
Every request requires an API key. Pass it via header or query parameter:
x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY
# or (MCP only)
?key=YOUR_API_KEYVerify your email, then create an API key from the dashboard. Free accounts get 500 credits every month.
Base URL
https://mcp.endzoneapi.comREST 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 balance | Rate limit |
|---|---|
| 100 credits or more | 60 req/min |
| Under 100 credits | 10 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
| Code | Meaning | What to do |
|---|---|---|
| 400 | Invalid parameters | Check required fields and value types |
| 401 | Invalid or missing API key | Check your x-api-key header |
| 402 | Insufficient credits | Top up your wallet or upgrade your plan |
| 429 | Rate limit exceeded | Wait and retry (see limits above) |
| 500 | Server error | Retry 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.
| Data | Status | Coverage | Volume |
|---|---|---|---|
Games and schedules Scores, kickoff (UTC), venue, surface, weather, rest days, starting QBs, coaches, referee, and the consensus closing spread, total, and moneylines. | Available | 1999 to current | 7,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. | Available | 1999 to current | One row per team per season |
Weekly player stats 150 columns per player-week: passing, rushing, receiving, defense, kicking, punting, returns, fantasy points. | Available | 1999 to current | 470,000+ stat lines |
Weekly team stats The same stat set aggregated per team and game, plus EPA and success. | Available | 1999 to current | 14,000+ team-weeks |
Play-by-play 160 columns per play: situation, result, EPA, WPA, win probability, CPOE, xPass, players involved, drive context. | Available | 1999 to current | 1,200,000+ plays |
Injury reports Official weekly report: game status and practice participation with the injury named. | Available | 2009 to current | 4,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. | Available | 2001 to current | 27,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. | Available | 2013 to current | 23,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). | Partial | Consensus 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 included | Hourly 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. | Available | NGS 2016 to current, PFR 2018 to current | 149,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:
{ "data": { "teams": [...], "count": 32 } }Error responses return:
{ "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.