API Documentation
Quick answer: The GridIron Data API is a REST API for fantasy football data at https://api.gridirondata.com/api/v1. You send your key in the x-api-key header and get JSON back. It covers players, projections, 2020–2026 actuals, deviations, snap share, news, matchups and a Pro injury changes feed. A free key allows 50 requests/month with no credit card.
How do I make my first call?
- Create a free account and confirm your email. No credit card is needed.
- Copy your API key from the dashboard.
- Send the key in the
x-api-keyheader on every request. - Cache responses: projections and stats refresh once a day.
curl -H "x-api-key: YOUR_API_KEY" \ "https://api.gridirondata.com/api/v1/players?name=Josh%20Allen&position=QB"
How do I authenticate?
All API requests require an API key passed in the
x-api-key header.
Send the header name in lowercase — x-api-key — for the widest client
compatibility.
curl -H "x-api-key: YOUR_API_KEY" \ "https://api.gridirondata.com/api/v1/health"
What are the rate limits?
Limits depend on your plan and apply per API key. See pricing for the full comparison.
| Plan | Requests | Per minute | Injury changes feed |
|---|---|---|---|
| Free ($0, no card) | 50 per month (resets on the 1st, 00:00 UTC) | 10 | No |
| Basic ($5/month) | 5,000 per month | 30 | No |
| Pro ($29/month) | 50,000 per month | 100 | Yes |
| Enterprise | Custom | Custom | Yes |
What happens when I hit a limit?
The API answers 429 Too Many Requests. The reason field says which limit you hit: free_monthly_quota, quota_exceeded or rate_limited. For the quotas, upgrade_url links to the pricing page. Back off and retry after the minute for rate_limited.
{
"error": "Free plan limit reached: you've used all 50 requests for this month (resets on the 1st, 00:00 UTC). Basic is $5/month for 5,000 requests/month, and Pro is $29/month for 50,000 plus the game-day injury changes feed. Your key stays the same when you upgrade: https://www.gridirondata.com/pages/pricing.html",
"reason": "free_monthly_quota",
"upgrade_url": "https://www.gridirondata.com/pages/pricing.html"
}
Base URL
Default season. Calls that omit ?season= use the current season, 2026. It stays 2026 through the off-season and moves to 2027 once 2027 data is loaded, so a season-less call never returns an empty spring. GET /health reports it as default_season.
Team codes. Every response uses one code per team: LAR (Rams), WAS (Washington) and JAX (Jacksonville). Older source rows spelled these LA, WSH and JAC; they are folded together, including matchup history. Filters and paths accept either spelling.
Example Data
See the rich fantasy data you'll have access to. All examples show real data from our database.
Player Profile with Historical Data
Each player includes historical stats from 2020 through the current 2026 season and matchup history against every team. Weekly actuals and season totals carry all three scoring formats: the base fantasy_points / MISC_FPTS is standard, with _ppr / _half (weekly) and _PPR / _HALF (totals) variants alongside. Use ?scoring= on /stats to have the API resolve them for you (default ppr).
{
"player_id": "Jared Goff#QB",
"player_name": "Jared Goff",
"position": "QB",
"team": "DET",
"seasons": {
"2024": {
"weekly_stats": {
"1": {
"opponent": "LA",
"fantasy_points": 18.56, // standard
"fantasy_points_ppr": 18.56, // QBs rarely catch passes, so equal here
"fantasy_points_half": 18.56
},
"2": {
"opponent": "TB",
"fantasy_points": 29.08,
"fantasy_points_ppr": 29.08,
"fantasy_points_half": 29.08
}
// ... weeks 3-17
},
"season_totals": {
"MISC_FPTS": 372.5, // standard
"MISC_FPTS_PPR": 372.5,
"MISC_FPTS_HALF": 372.5,
"Rank": 5, "Rank_PPR": 6, "Rank_HALF": 6
// ... passing/rushing counting stats
}
},
"2023": { /* Full season data */ },
"2022": { /* Full season data */ },
"2021": { /* Full season data */ },
"2020": { /* Full season data */ }
},
"vs_opponent": {
"GB": {
"games": 8,
"avg_points": 19.42,
"total_points": 155.36,
"high": 28.64,
"low": 8.12
},
"CHI": {
"games": 8,
"avg_points": 22.87,
"total_points": 182.96,
"high": 31.24,
"low": 14.56
},
"MIN": {
"games": 8,
"avg_points": 17.65,
"total_points": 141.2,
"high": 26.88,
"low": 9.44
},
"DAL": {
"games": 3,
"avg_points": 24.12,
"total_points": 72.36,
"high": 30.48,
"low": 18.24
}
// ... all 32 teams
}
}
Matchup Analysis
Get historical performance data when a player faces a specific opponent. Perfect for start/sit decisions.
GET /matchups/Amon-Ra%20St.%20Brown%23WR/GB
{
"player_id": "Amon-Ra St. Brown#WR",
"player_name": "Amon-Ra St. Brown",
"position": "WR",
"opponent": "GB",
"stats": {
"games": 6,
"avg_points": 21.45,
"total_points": 128.7,
"high": 32.4,
"low": 11.2
}
}
// Use case: Amon-Ra averages 21.4 pts vs GB (6 games)
// but only 15.8 pts vs MIN (6 games) - start him vs GB!
Snap Share Trend
Catch a role change before the box score shows it. Compare a player’s recent snap share to his season average.
GET /snaps/Bucky%20Irving%23RB?season=2024&trend=4
{
"player_id": "Bucky Irving#RB",
"season": "2024",
"season_snap_pct_avg": 44.4,
"recent_snap_pct_avg": 57.0,
"trend_delta": 12.6
}
// Use case: +12.6 over the last 4 weeks means Irving is taking over
// the Tampa Bay backfield. Buy before the points catch up.
Projection Deviation Analysis
Identify boom/bust candidates by seeing how players perform vs their projections.
GET /deviations/Jahmyr%20Gibbs%23RB
{
"player_id": "Jahmyr Gibbs#RB",
"player_name": "Jahmyr Gibbs",
"position": "RB",
"season": "2024",
"avg_deviation": 3.2,
"weeks_analyzed": 16,
"weekly_deviations": [
{
"week": 1,
"actual_points": 22.4,
"projected_points": 14.5,
"deviation": 7.9,
"deviation_percentage": 54.5,
"opponent": "LA"
},
{
"week": 2,
"actual_points": 8.6,
"projected_points": 15.2,
"deviation": -6.6,
"deviation_percentage": -43.4,
"opponent": "TB"
}
]
}
// Use case: Moderate deviation = consistent player
// Gibbs ranges from 8.6 to 22.4 pts - reliable floor
Weekly Projections
Get fantasy point projections for all players, sorted by projected points.
GET /projections/12?position=TE
{
"week": "12",
"season": "2025",
"projections": [
{
"player_id": "Sam LaPorta#TE",
"player_name": "Sam LaPorta",
"position": "TE",
"team": "DET",
"week": "12",
"projected_points": 12.8,
"injury_status": "Healthy"
},
{
"player_id": "Travis Kelce#TE",
"player_name": "Travis Kelce",
"position": "TE",
"team": "KC",
"week": "12",
"projected_points": 11.4,
"injury_status": "Healthy"
},
{
"player_id": "George Kittle#TE",
"player_name": "George Kittle",
"position": "TE",
"team": "SF",
"week": "12",
"projected_points": 10.9,
"injury_status": "Questionable"
}
],
"count": 64
}
Historical data for backtesting (2020–2026)
Every week of every fantasy-relevant player from 2020 through the current 2026 season: weekly actuals in PPR, half and standard, snap share, matchup history, and actual-vs-projected deviations. It works all year, off-season included, which makes it a base for model builders: backtest a start/sit rule, measure how sticky production is from one season to the next, or check whether a player's usage predicted his breakout.
| What | Endpoint | Seasons |
|---|---|---|
| Weekly actuals + season totals (all three scorings, snap share joined per week) | /stats/{player_id}/{season} | 2020–2026 |
| Per-week snap share, trailing trend | /snaps/{player_id}?season= | 2020–2026 |
| History vs one opponent, split by season | /matchups/{player_id}/{opponent} | 2020–2026 |
| Weekly actual vs projected (boom/bust) | /deviations/{player_id}?season= | 2025–2026 |
| Everything for one player in one response | /players/{player_id} | 2020–2026 |
Example: how sticky is points per game from one season to the next?
Pull a player's weekly actuals for consecutive seasons and compare two forecasts of next season: last season as-is, and last season pulled 30% of the way back toward the position average. A dozen players over 2021–2025 is about 60 requests, more than the free plan's 50 a month: try it with about eight players on the free plan, or run the full set on Basic.
import os, statistics, requests
from urllib.parse import quote
API = "https://api.gridirondata.com/api/v1"
H = {"x-api-key": os.environ["GRIDIRON_API_KEY"]}
def ppg(player_id, season):
r = requests.get(f"{API}/stats/{quote(player_id, safe='')}/{season}", headers=H)
if r.status_code == 404:
return None # no data for that season
weeks = [w["points"] for w in r.json()["weekly_stats"].values()
if isinstance(w, dict) and w.get("points") is not None]
return sum(weeks) / len(weeks) if len(weeks) >= 8 else None
roster = ["Justin Jefferson#WR", "CeeDee Lamb#WR", "Davante Adams#WR", "Mike Evans#WR"]
seasons = range(2021, 2026)
table = {(p, s): ppg(p, s) for p in roster for s in seasons}
naive, shrunk = [], []
for s in seasons[:-1]:
this = {p: table[(p, s)] for p in roster if table[(p, s)] and table.get((p, s + 1))}
if not this:
continue
mean = statistics.mean(this.values())
for p, v in this.items():
nxt = table[(p, s + 1)]
naive.append(abs(v - nxt))
shrunk.append(abs(0.7 * v + 0.3 * mean - nxt))
print(f"naive MAE {statistics.mean(naive):.2f} shrunk MAE {statistics.mean(shrunk):.2f}")
On a 12-player roster across positions, 2021–2025, shrinking cut the average miss from 3.05 to 2.75 PPR points per game, most of it at RB and WR. The fuller script, with per-position results, the biggest year-over-year moves and a /deviations check of whether projection-beaters keep beating projections, is backtest.py in our examples.
To grade weekly projections against actuals across the whole league, see the Backtest Fantasy Projections Against Actuals guide.
Players
GET Get Player by ID
Retrieve detailed information for a specific player.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID in format: First Last#POSITION (e.g., Josh Allen#QB; defense: Houston Texans#DST). URL-encode the space and #. |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| season | string | Filter to specific season (e.g., "2026") |
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/players/Josh%20Allen%23QB"
GET Search Players
Search for players by name, position, or team.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| name | string | Partial or full player name. Defenses also match by team code, nickname, or a DST suffix (TB, Bucs, Tampa Bay DST). |
| position | string | Position: QB, RB, WR, TE, K, DST |
| team | string | Team abbreviation (e.g., BUF, KC). Matches the player's current-season team; JAC/JAX, WSH/WAS and LA/LAR are interchangeable. |
| limit | integer | Max results (default: 50, max: 100) |
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/players/search?name=Allen&position=QB"
GET Get Player (Exact Match)
Get a specific player by exact name and position match.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| name required | string | Exact player name |
| position required | string | Position: QB, RB, WR, TE, K, DST |
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/players?name=Josh%20Allen&position=QB"
GET List Players
List all players with pagination.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| position | string | Filter by position |
| team | string | Filter by team, e.g. LAR (LA works too) |
| limit | integer | Results per page (default: 50, max: 100) |
| cursor | string | Pagination cursor from previous response |
Projections
GET Get Weekly Projections
Get fantasy point projections for all players for a specific week. Provider weekly projections are published as each week approaches, so for weeks that aren't out yet the API returns a prorated season-long projection (season points ÷ games) for every player. The projection_source field tells you which was used — weekly (real per-week number) or season_prorated (estimate) — and real weekly values replace the estimate automatically once published.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| week required | integer | NFL week number (1-18) |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| position | string | Filter by position |
| team | string | Filter by team, e.g. LAR (LA works too) |
| season | string | Season year (default: current NFL season) |
| source | string | Pass weekly to return ONLY real per-week projections (no season-prorated fallback) |
| scoring | string | Scoring format for projected_points: ppr (default), half, or standard. The echoed scoring field confirms which was applied. |
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/projections/12?position=QB&scoring=half"
Example Response
{
"week": "12",
"season": "2026",
"scoring": "half",
"projections": [
{
"player_id": "Josh Allen#QB",
"player_name": "Josh Allen",
"position": "QB",
"team": "BUF",
"week": "12",
"projected_points": 24.5,
"projection_source": "season_prorated",
"injury_status": "Healthy"
}
],
"count": 32,
"prorated_count": 32
}
Stats
GET Get Player Stats
Get historical stats for a player in a specific season.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID |
| season | string | Season year (default: current NFL season) |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| scoring | string | Scoring format: ppr (default), half, or standard. Sets the resolved points on each week and the top-level season_points. The raw fantasy_points (standard) plus fantasy_points_ppr / fantasy_points_half variants are always present too. |
Alternative: You can also query by name and position:
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/stats?name=Josh%20Allen&position=QB&season=2024&scoring=ppr"
Example Response
{
"player_id": "Justin Jefferson#WR",
"season": "2024",
"scoring": "ppr",
"season_points": 227.9,
"weekly_stats": {
"1": {
"opponent": "NYG",
"fantasy_points": 11.9, // standard (base)
"fantasy_points_ppr": 15.9,
"fantasy_points_half": 13.9,
"points": 15.9 // resolved for scoring=ppr
}
},
"season_totals": {
"MISC_FPTS": 149.9, // standard
"MISC_FPTS_PPR": 227.9,
"MISC_FPTS_HALF": 188.9,
"Rank": 8, "Rank_PPR": 3, "Rank_HALF": 5
}
}
Deviations
GET Get Projection Deviations
Analyze how a player performs vs their projections. Useful for identifying boom/bust candidates.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| season | string | Season year (default: current NFL season) |
Alternative: Query by name and position:
Example Response
{
"player_id": "Josh Allen#QB",
"player_name": "Josh Allen",
"position": "QB",
"season": "2025",
"avg_deviation": 3.2,
"weeks_analyzed": 11,
"weekly_deviations": [
{
"week": 1,
"actual_points": 28.4,
"projected_points": 24.5,
"deviation": 3.9,
"deviation_percentage": 15.9,
"opponent": "ARI"
}
]
}
Snap Counts
GET Get Snap Share
Per-week snap share — the percentage of his team’s offensive plays a player was on the field for — plus special-teams snaps, a season average, and a trailing trend. Snap share moves before box-score production does, so it is the earliest reliable signal of a role change.
Data is sourced from nflverse / Pro-Football-Reference game-level snap counts. Percentages are
returned as 0–100. Seasons 2020–2026 are available
(the current season updates weekly); regular season (weeks 1–18) only.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID (First Last#POS, URL-encoded) |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| season | string | Season year (default: current NFL season) |
| trend | integer | Weeks in the trailing average, 1–18 (default: 4) |
Alternative: Query by name and position:
Response Fields
| Field | Type | Description |
|---|---|---|
| season_snap_pct_avg | number | Average snap share across every week he took a snap |
| recent_snap_pct_avg | number | Average over the most recent trend weeks played |
| trend_delta | number | Recent minus season. Positive = trending up (role growing) |
| games_with_snaps | integer | Weeks with a non-zero snap share. Zero-snap weeks are excluded from averages |
| weekly_snaps[] | array | Per week: snap_pct, offense_snaps, st_snaps, st_pct, team, opponent |
Example Response
GET /snaps/Bucky%20Irving%23RB?season=2024&trend=4
{
"player_id": "Bucky Irving#RB",
"player_name": "Bucky Irving",
"position": "RB",
"season": "2024",
"games": 17,
"games_with_snaps": 17,
"season_snap_pct_avg": 44.4,
"recent_snap_pct_avg": 57.0,
"trend_weeks": 4,
"trend_delta": 12.6,
"totals": {
"games": 17,
"offense_snaps": 516,
"offense_pct_avg": 44.4,
"st_snaps": 41,
"st_pct_avg": 8.6
},
"weekly_snaps": [
{ "week": 1, "offense_snaps": 20, "snap_pct": 31.0, "st_snaps": 8, "st_pct": 30.0, "team": "TB", "opponent": "WAS" },
{ "week": 18, "offense_snaps": 48, "snap_pct": 72.0, "st_snaps": 0, "st_pct": 0.0, "team": "TB", "opponent": "NO" }
],
"source": "nflverse / Pro-Football-Reference game-level snap counts"
}
// Irving opened 2024 at 31% of Tampa Bay's snaps and finished at 72%.
// trend_delta of +12.6 flags the takeover while it is still happening.
Snap share on /stats
Snap data is also joined onto the stats endpoint, so you can read production and playing time
together without a second request. Each weekly entry gains snap_pct and
offense_snaps, and the response carries a snap_counts block.
GET /stats/Bucky%20Irving%23RB/2024
{
"weekly_stats": {
"1": { "points": 12.6, "opponent": "WAS", "snap_pct": 31.0, "offense_snaps": 20 }
},
"snap_counts": {
"weekly": { ... },
"totals": { "games": 17, "offense_snaps": 516, "offense_pct_avg": 44.4 }
}
}
Note: weeks played and weeks with snaps are not always the same set — a blocking tight end can log snaps with no fantasy line. Weeks missing from one side simply omit the corresponding fields rather than reporting zero.
News
GET League-wide News Feed
Recent news across every tracked player, newest first, in one call: signings, trades, releases, injuries and depth-chart moves. Use it through free agency (March) and the NFL Draft (April) instead of polling player by player. The scrapers run year-round.
Plans: Basic and above get the full feed: 90 days of history, filters and paging. Free keys get a preview of the 5 newest headlines from the last 24 hours, marked "teaser": true with an upgrade_url.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| since | string | ISO-8601 (2027-03-09T00:00:00Z) or unix seconds. Default: days ago. Maximum lookback: 90 days. |
| days | integer | Lookback when since is omitted (default 7, max 90) |
| impact | string | injury, transaction, role or general; comma-separate several (transaction,role) |
| position | string | QB, RB, WR, TE; comma-separate several |
| team | string | Player's current team, e.g. LAR (LA works too) |
| limit | integer | Items per page (default 25, max 100) |
| cursor | string | The next_cursor from the previous page. Absent on the last page. |
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/news/latest?since=2027-03-09T00:00:00Z&impact=transaction&position=WR"
Example Response
{
"since": "2027-03-09T00:00:00Z",
"until": "2027-03-11T14:02:10Z",
"count": 1,
"filters": {"impact": ["transaction"], "position": ["WR"]},
"news": [
{
"player_id": "Davante Adams#WR",
"player_name": "Davante Adams",
"position": "WR",
"team": "LAR",
"headline": "Davante Adams expected at start of Rams offseason program",
"summary": "",
"impact": "transaction",
"source": "pft-nbc",
"url": "https://profootballtalk.nbcsports.com/...",
"published_at": "2027-03-10T19:41:00Z"
}
],
"next_cursor": "WyIyMDI3LTAzLTEwVDE5OjQxOjAwWiIs..."
}
One headline about two players appears once per player, so a position or team filter still catches it.
GET Get Player News
Recent NFL news headlines for a player, newest first. Each item is tagged with an impact category (injury, transaction, role, or general) to help surface start/sit-relevant updates. Items are refreshed throughout the day, all year, and roll off after 90 days. For every player at once, use /news/latest.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID (e.g. Malik Nabers#WR) |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| days | integer | Lookback window in days (default: 14, max: 90) |
| limit | integer | Max headlines to return (default: 10, max: 50) |
| impact | string | Filter by category: injury, transaction, role, or general |
Alternative: Query by name and position:
Example Response
{
"player_id": "Malik Nabers#WR",
"days": 14,
"count": 2,
"news": [
{
"headline": "Nabers (knee) full participant at Wednesday practice",
"summary": "Giants WR Malik Nabers practiced fully and is trending toward playing Sunday.",
"impact": "injury",
"source": "espn-nfl",
"url": "https://www.espn.com/nfl/story/_/id/00000000",
"published_at": "2026-09-10T17:22:00Z"
},
{
"headline": "Nabers feeling 'good' but mum on playing Week 1",
"summary": "",
"impact": "general",
"source": "espn-nfl",
"url": "https://www.espn.com/nfl/story/_/id/00000001",
"published_at": "2026-09-01T03:21:40Z"
}
]
}
No news yet? When a player has no recent news, the response includes a request_scrape link you can call to queue an on-demand scrape (see next endpoint):
{
"player_id": "Max Bredeson#RB",
"days": 14,
"count": 0,
"news": [],
"message": "No news found for Max Bredeson#RB in the last 14 days.",
"request_scrape": {
"method": "POST",
"href": "https://api.gridirondata.com/api/v1/news/Max%20Bredeson%23RB/request",
"description": "No news yet — POST to this link to request a fresh scrape for this player."
}
}
POST Request a News Scrape
Queue an on-demand news scrape for a specific player — useful when GET /news/{player_id} returns no results and you want the latest sources checked immediately. The request is accepted and processed asynchronously; poll GET /news/{player_id} shortly after to see any new headlines. No request body is required.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID (e.g. Max Bredeson#RB) |
Example Response (202 Accepted)
{
"player_id": "Max Bredeson#RB",
"status": "accepted",
"message": "Scrape requested. New headlines (if any are found in current sources) will appear shortly.",
"poll": {
"method": "GET",
"href": "https://api.gridirondata.com/api/v1/news/Max%20Bredeson%23RB"
}
}
Injury Changes (Pro)
GET Get Injury Status Changes
Returns every player whose injury status changed since since. This is a Pro plan feature; Free and Basic keys get 403 with "reason": "pro_required", an upgrade_url and a pro_includes list of what the plan adds.
GridIron refreshes injury status every day at 11:00 ET. On game days it refreshes again after inactives: Sunday around 12:45 pm, 3:50 pm and 7:45 pm ET, and Thursday and Monday around 7:15 pm ET. About ten minutes after each refresh, changes are recorded with a detected_at time. Poll with the next_since value from your last response to get only new changes.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| since | string | ISO-8601 (2026-09-27T16:00:00Z) or unix seconds. Default: 24 hours ago. Maximum lookback: 14 days. Exclusive. |
| position | string | Filter by position, e.g. WR |
| team | string | Filter by team, e.g. BUF |
| limit | integer | Maximum changes returned (default 500, max 1000). A refresh run is never split across responses. |
| season | string | Season year (default: current NFL season) |
Example Request
curl -H "x-api-key: YOUR_PRO_KEY" \ "https://api.gridirondata.com/api/v1/injuries/changes?since=2026-09-27T16:00:00Z"
Example Response
{
"season": "2026",
"since": "2026-09-27T16:00:00Z",
"until": "2026-09-27T17:05:41Z",
"count": 1,
"changes": [
{
"player_id": "Josh Allen#QB",
"player_name": "Josh Allen",
"position": "QB",
"team": "BUF",
"previous_status": "Questionable",
"status": "Out",
"detected_at": "2026-09-27T16:55:12Z"
}
],
"next_since": "2026-09-27T16:55:12Z",
"last_checked_at": "2026-09-27T16:55:12Z",
"truncated": false
}
Matchups
GET Get vs Opponent History
Get historical performance data for a player against a specific opponent.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| player_id required | string | Player ID |
| opponent required | string | Opponent team abbreviation (e.g., KC, NE) |
Alternative: Query by name and position:
Example Request
curl -H "x-api-key: YOUR_KEY" \ "https://api.gridirondata.com/api/v1/matchups/Josh%20Allen%23QB/KC"
Health Check
GET Health Check
Check API status and version.
Example Response
{
"status": "healthy",
"version": "1.0.0",
"default_season": "2026"
}
Error Codes
| Code | Description |
|---|---|
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid or missing API key |
| 403 | Forbidden - The endpoint needs a higher plan ("reason": "pro_required", with an upgrade_url), or the key's subscription isn't active: subscription_canceled (with a signup_url; sign up again with the same email to get the same key back), payment_failed or subscription_inactive (with a billing_url to update your card), or paused ("reason": "subscription_paused", with resumes_at, resume_url and resume_steps). A paused plan turns back on by itself on August 1; to resume sooner, click "Resume now" under Billing & Subscription on your dashboard. |
| 404 | Not Found - Resource doesn't exist |
| 409 | Conflict - Multiple matches found (use player_id for exact match) |
| 429 | Too Many Requests - A rate limit or quota was hit. See reason and upgrade_url in the body. |
| 500 | Internal Server Error |
Frequently asked questions
How do I authenticate with the GridIron Data API?
Send your key in the x-api-key header on every request to https://api.gridirondata.com/api/v1. A free key allows 50 requests a month with no credit card.
What are the rate limits?
Free: 50 requests/month at 10 per minute. Basic: 5,000 requests/month at 30 per minute. Pro: 50,000 requests/month at 100 per minute. Enterprise: custom.
What happens when I hit a limit?
The API returns HTTP 429 with a JSON body. The reason field says which limit you hit (free_monthly_quota, quota_exceeded or rate_limited) and upgrade_url links to the pricing page.
How do I get injury changes on game day?
Pro keys can call GET /api/v1/injuries/changes with ?since= set to an ISO-8601 or unix timestamp. It returns each player whose injury status changed since that time, with the old and new status.
Which scoring formats are supported?
PPR is the default. Add ?scoring=half or ?scoring=standard to /projections and /stats.
What can I do with the API in the off-season?
Historical data from 2020 through 2026 (weekly actuals, snap share, matchup history and deviations) works all year for backtesting and dynasty research; see Historical data. News keeps flowing through free agency and the draft: GET /api/v1/news/latest returns it league-wide on Basic and above. Season-less calls keep answering with the 2026 season until 2027 data is loaded.