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_status is standardized: ACTIVE, QUESTIONABLE, DOUBTFUL, OUT, IR, PUP, SUSPENDED, RESERVE or UNKNOWN. injury_status_raw keeps the source's spelling, and available is false for anyone who can't play.
  • position is ESPN's: C, G or OT. There is no left or right side.
  • espn_player_id is 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 players and says so: pro_only_matches is how many it left out and note explains why. A search for "Trent Williams" on a Basic key returns count: 0 and pro_only_matches: 1.
  • Asking for a lineman directly (by id, by position=C, G or OT, or with include_ol=true) answers HTTP 403 with "reason": "pro_required" and an upgrade_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.