Guide · Pro
Offensive line injury data: every center, guard and tackle
Quick answer: On the Pro plan, GridIron Data carries every NFL center, guard and tackle on a team's roster or reserve list (356 players on October 27, 2026) with team, jersey number and injury status. List them with /players?position=C, G or OT (6 requests for all of them), find one by name with /players/search, and follow status changes in /injuries/changes and injury webhooks. Statuses are checked against ESPN's injury report every 2 minutes from 8 am to 1 am ET.
- Positions
- C, G, OT
- Plan
- Pro
- Players
- 356
- Status checks
- Every 2 min, 8 am–1 am ET
Why would a fantasy app need offensive line injuries?
Nobody starts a left guard in a standard league, but the line decides a lot of what the players you do start can produce. A running back behind three backup linemen is in a different spot than the same back behind a healthy line, and a quarterback missing both tackles takes more pressure. Most fantasy data sources stop at the skill positions, so a line that loses two starters on Friday often goes unnoticed in tools until after the game.
Three kinds of projects ask for this data:
- Dynasty and deep-roster platforms that show every player on a roster, not just the fantasy-relevant ones, and need the same injury designation for a center as for a receiver.
- Start/sit and projection models that adjust a running back or quarterback for the health of the line in front of him.
- Team pages and bots that post a full team injury report, not just the fantasy positions.
The rest of this guide shows what a lineman's record looks like, how to pull all of them, and how to follow changes as they happen through the day.
What does a lineman's record look like?
The same shape as any other player in /players, without the stats. Here is /players/search?name=Trent Williams on a Pro key, trimmed to the player:
{
"player_id": "Trent Williams#OT",
"player_name": "Trent Williams",
"position": "OT",
"espn_player_id": 13241,
"seasons": {
"2026": {
"team": "SF",
"jersey_number": "71",
"injury_status": "ACTIVE",
"injury_status_raw": "Healthy",
"available": true
}
}
}
injury_statusis standardized:ACTIVE,QUESTIONABLE,DOUBTFUL,OUT,IR,PUP,SUSPENDED,RESERVEorUNKNOWN.injury_status_rawkeeps the source's spelling, andavailableis false for anyone who can't play.positionis ESPN's:C,GorOT. There is no left or right side.espn_player_idis the join key if you also pull data from ESPN or a source keyed on ESPN ids.- There are no stats, snaps or projections on a lineman. Those endpoints cover QB, RB, WR, TE, K and team defenses.
Team, jersey and roster moves come from ESPN's team rosters once a day. A lineman who leaves every roster shows FA as his team. Practice squad players are not included.
How do I pull every lineman?
Ask for one position at a time and follow next_cursor. Lists leave linemen out unless you ask for them, so existing code that pages through /players keeps getting fantasy positions only; position=C, G or OT (or include_ol=true) is how you ask. This script lists every lineman and prints the teams with the most linemen not listed as active:
import collections, os
import requests
API = "https://api.gridirondata.com/api/v1"
KEY = os.environ["GRIDIRON_API_KEY"] # a Pro key
SEASON = "2026"
def get(path, **params):
r = requests.get(f"{API}{path}", headers={"x-api-key": KEY}, params=params, timeout=30)
r.raise_for_status()
return r.json()
def linemen():
"""Every center, guard and tackle: 6 requests today."""
for pos in ("C", "G", "OT"):
cursor = None
while True:
params = {"position": pos, "limit": 100}
if cursor:
params["cursor"] = cursor
body = get("/players", **params)
yield from body["players"]
cursor = body.get("next_cursor")
if not cursor:
break
hurt = collections.defaultdict(list)
for p in linemen():
s = p["seasons"][SEASON]
if s.get("injury_status") != "ACTIVE":
hurt[s["team"]].append(f"{p['player_name']} ({p['position']}, {s['injury_status']})")
for team, names in sorted(hurt.items(), key=lambda kv: (-len(kv[1]), kv[0]))[:6]:
print(f"{team}: {len(names)} " + "; ".join(names))
That's 6 requests on October 27, 2026 (2 per position at 100 a page). The output that day:
LAC: 7 Tyler Biadasz (C, IR); Trevor Penning (G, IR); Kayode Awosika (G, QUESTIONABLE); Trey Pipkins III (OT, IR); Joe Alt (OT, QUESTIONABLE); Isaiah World (OT, OUT); Rashawn Slater (OT, IR)
CAR: 5 Torricelli Simpkins III (G, QUESTIONABLE); Damien Lewis (G, QUESTIONABLE); Brady Christensen (G, IR); Taylor Moton (OT, IR); Ikem Ekwonu (OT, OUT)
GB: 5 Jacob Monk (C, IR); Aaron Banks (G, QUESTIONABLE); Sean Rhyan (G, OUT); Travis Glover (OT, QUESTIONABLE); Zach Bako-Bewele (OT, IR)
NE: 5 Ben Brown (C, QUESTIONABLE); Alijah Vera-Tucker (G, IR); Mike Onwenu (G, IR); Greg Van Roten (G, IR); Marcus Bryant (OT, IR)
ARI: 4 Chase Bisontis (G, IR); Jon Gaines II (G, QUESTIONABLE); Isaiah Adams (G, IR); Paris Johnson Jr. (OT, IR)
BAL: 4 Ethan Pocic (C, IR); Danny Pinter (C, IR); Jovaughn Gwyn (G, IR); Olaivavega Ioane (G, DOUBTFUL)
Two things to keep in mind when you read a table like this. First, it counts every lineman on the roster or reserve list, not only starters: a backup guard on IR shows up the same as a starting tackle. We don't carry a depth chart, so if you need "starters missing", join to your own depth chart source on espn_player_id. Second, reserve-list players are long-term, so a model that cares about this week usually weighs QUESTIONABLE, DOUBTFUL and OUT differently from IR. On October 27, 76 of the 356 linemen were not active, across 29 teams; 28 of them were Questionable, Doubtful or Out and the rest were on a reserve list.
How do I follow lineman injury changes during the week?
Don't re-pull the whole list on a timer. /injuries/changes returns only the players whose status moved since your last call, linemen included, with the previous and new status and when GridIron saw it. Keep the next_since value from each answer and pass it back as since:
import json, pathlib
STATE = pathlib.Path("ol_since.json")
OL = {"C", "G", "OT"}
state = json.loads(STATE.read_text()) if STATE.exists() else {}
params = {"since": state["since"]} if state.get("since") else {}
body = get("/injuries/changes", **params) # get() from the script above
for c in body["changes"]:
if c["position"] in OL:
print(f"{c['detected_at']} {c['player_name']} ({c['position']}, {c['team']}): "
f"{c['previous_status']} -> {c['status']}")
STATE.write_text(json.dumps({"since": body["next_since"]})) # save after acting
Add position=OT (or C, G) to the request if you only want one position; the filter is one position per call, so the script above filters for all three in code instead. The cursor never repeats a change and never skips one, up to 14 days back, and the state is saved only after you've acted on the changes, so a crash replays them on the next run.
Statuses are checked against ESPN's injury report every 2 minutes from 8 am to 1 am ET and every 10 minutes overnight, so a Friday status move usually reaches the feed within a few minutes. If you'd rather not poll, register one HTTPS URL with POST /webhooks (see the API reference) and GridIron sends each batch of changes to it. The injury changes guide covers the cursor, truncation and webhooks in detail; everything there applies to linemen.
What do Free and Basic keys see?
Offensive line data is part of Pro ($29/month or $249/year). On Free and Basic:
- A name search leaves linemen out of
playersand says so:pro_only_matchesis how many it left out andnoteexplains why. A search for "Trent Williams" on a Basic key returnscount: 0andpro_only_matches: 1. - Asking for a lineman directly (by id, by
position=C,GorOT, or withinclude_ol=true) answers HTTP 403 with"reason": "pro_required"and anupgrade_url. - Lineman injury news is left out of
/news/latest.
Upgrading keeps the same key, so nothing in your code changes when you move to Pro.
What isn't covered?
- Individual defensive players. Defense is covered as team defenses (DST) only.
- Practice participation (did not practice, limited, full).
- A separate game-day inactives list. A lineman's status is whatever ESPN's injury report says.
- Depth chart and side. Positions are C, G and OT, with no left or right and no starter flag.
Frequently asked questions
Which plan includes offensive linemen?
Pro ($29/month or $249/year). Free and Basic keys don't include them: a name search leaves them out and tells you how many it left out in pro_only_matches, and asking for a lineman directly answers 403 pro_required. Upgrading keeps the same key.
Which positions are covered?
Centers (C), guards (G) and tackles (OT): every one on a team's roster or reserve list, about 350 players. Practice squad players are not included. Positions follow ESPN, so there is no left or right side.
How current is a lineman's injury status?
We check ESPN's injury report every 2 minutes from 8 am to 1 am ET (every 10 minutes overnight), and refresh team, jersey and roster moves from ESPN's team rosters once a day.
Do linemen have stats, snaps or projections?
No. A lineman's record carries name, position, team, jersey number, ESPN id and injury status. Stats, snaps and projections cover QB, RB, WR, TE, K and team defenses.
Why don't linemen show up when I list every player?
Lists leave them out unless you ask, so code that pages through every player keeps getting fantasy positions only. Add position=C, G or OT, or include_ol=true, to get them. A name search finds them on Pro.