Guide

GridIron projections: weekly fantasy projections you can show your users

Quick answer: GridIron Data now publishes its own weekly fantasy projections for every QB, RB, WR and TE, built only from openly licensed nflverse data and National Weather Service forecasts. Ask for GET /projections/{week}?source=gridiron, or read the gridiron_projection object on each row. With Pro + Commercial you may show them in your app, credited "Data: GridIron Data". In a walk-forward backtest over 14,152 player-weeks they missed by 4.40 PPR points on average, against 4.63 for a trailing four-game average, and beat that baseline in 44 of 45 held-out weeks.

Endpoint
/projections/{week}
Positions
QB, RB, WR, TE
Updated
Wednesdays
Display
Pro + Commercial

Why did we build our own projections?

Because the question we hear most from people building fantasy apps is "can I show these numbers to my users?" For most projection sources the honest answer is no: the consensus projections in projected_points are licensed for your own research and benchmarking, not for display in a product. That leaves a start/sit app, a league newsletter or a Discord bot with nothing to put on screen.

GridIron projections fix that. Every input is either openly licensed or ours:

  • nflverse play and player data (CC-BY-4.0): box scores, rosters, injury reports and game lines going back to 2013.
  • National Weather Service forecasts (public domain): the hourly forecast at kickoff for every outdoor US stadium.
  • GridIron Data's own injury status, the same status the API already serves.

Nothing in them comes from another company's projections, so we can license them for display. They sit right next to the consensus numbers, so you can keep benchmarking against both.

How are GridIron projections built?

The model works top-down, the way a coordinator thinks about a game plan, and it is refit every week on every earlier game since 2013:

  • Team volume. The implied team total and spread from the game line, each team's recent form for and against (dropbacks, carries, yards per play, touchdowns) and the weather give each team an expected number of dropbacks, carries, yards and touchdowns.
  • Player share. Recency-weighted target share, carry share and, for quarterbacks, dropback share split that volume among players. Rookies and players with little history start from a role prior (by draft round). Players ruled Out or Doubtful, or on a reserve list, project zero and their share moves to teammates.
  • Efficiency. Catch rate, yards and touchdowns per target and per carry, and completion, yards, touchdown and interception rates per attempt, each pulled toward the league rate for the position so a two-game hot streak doesn't run away with the number.
  • Stats to points. The full stat line is scored in PPR, half-PPR and standard with the same scoring the rest of the API uses.

The result is a projected stat line, not just a point total. Pro keys get the line itself (projected_stats, including targets) and the game_context behind it: implied total, spread and projected team dropbacks and carries.

How do I get GridIron projections in Python?

One request returns the week. source=gridiron lists only our projections, with the usual position, team and scoring filters:

import os
import requests

API = "https://api.gridirondata.com/api/v1"
H = {"x-api-key": os.environ.get("GRIDIRON_API_KEY", "YOUR_KEY")}

def gridiron_projections(week, position=None, scoring="ppr"):
    params = {"source": "gridiron", "scoring": scoring}
    if position:
        params["position"] = position
    r = requests.get(f"{API}/projections/{week}", headers=H, params=params, timeout=30)
    r.raise_for_status()
    return r.json()

body = gridiron_projections(9, position="WR")
run = body["gridiron_projections"]
print(f"model {run['model_version']}, built {run['as_of']}")

rows = [r for r in body["projections"] if r.get("gridiron_projection")]
rows.sort(key=lambda r: r["gridiron_projection"]["projected_points"], reverse=True)
for r in rows[:10]:
    g = r["gridiron_projection"]
    print(f"{r['player_name']:24} {r['team']:4} vs {g['opponent']:4} {g['projected_points']:5.1f}")
print("Data: GridIron Data (gridirondata.com)")

Each gridiron_projection object looks like this (a quarterback from the week 9 run, Pro fields included):

"gridiron_projection": {
  "projected_points": 19.01,
  "available": true,
  "opponent": "LV",
  "model_version": "gridiron-v1.0",
  "as_of": "2026-11-07T01:50:03Z",
  "kickoff_utc": "2026-11-08T21:05:00Z",
  "weather": {"indoor": false, "wind_mph": 6.9, "temp_f": 70, "precip_prob_pct": 0},
  "projected_stats": {"pass_att": 31.73, "pass_yds": 250.73, "pass_td": 1.88,
                      "pass_int": 0.68, "rush_att": 4.03, "rush_yds": 21.24},
  "game_context": {"implied_total": 30.75, "team_dropbacks": 34.6, "team_carries": 28.1}
}

Three fields are worth wiring into your app from day one. available: false means the player is ruled out and projects zero, so hide him or grey him out. as_of tells your users how fresh the number is. weather is good context on the player card, but don't sell it as an edge: in our backtest it did not measurably change accuracy.

How accurate are GridIron projections?

We graded them the only fair way: walk-forward. Every week of 2024, 2025 and 2026 (through week 9) was projected using only games played before it, then scored against what the players actually did. The baseline is the simple method most people use by instinct, each player's average over his last four games.

Average miss per player-week, PPR points (lower is better). 14,152 graded player-weeks, 45 weeks.
PositionGridIronLast-4 average
QB6.046.69
RB4.334.49
WR4.414.57
TE3.603.83
All4.404.63

And week by week this season, scored against the actual results:

2026 average miss per player-week, PPR points.
WeekPlayers gradedGridIronLast-4 average
13154.895.03
23464.494.93
33494.424.60
43494.284.30
53284.544.88
63034.124.36
72974.244.51
82984.574.69

What that means in plain terms:

  • It beats the trailing average at every position and in 44 of 45 weeks, and the gap is largest at quarterback (0.65 points) and tight end (0.23 points), where role and game script matter most.
  • It is not magic. A typical miss is still four to six points, because football is noisy. Week 4 was nearly a tie. Treat any projection as the middle of a range, not a promise.
  • We don't claim it beats the industry consensus. In our internal checks the consensus numbers are still a little closer on average. GridIron projections are the ones you are licensed to show; keep using projected_points to benchmark.

Want to check our work? The backtest guide shows how to grade any projection against actuals with the API.

How do I show GridIron projections in my app?

Showing them to your users needs the Pro + Commercial plan ($49 a month or $490 a year, for companies under $250,000 a year in revenue). The rules are short:

  • Credit them as "Data: GridIron Data" with a link to gridirondata.com wherever they appear.
  • Present them as ours, not as your own projections. Rounding or converting the scoring is fine; an edited number shouldn't carry our name.
  • Show them player by player and week by week in your product. No bulk download, export, feed or API of them.
  • Use them as model inputs if you like: blending them into your own forecast is allowed.

The consensus numbers in projected_points stay benchmark-only on every plan. The Commercial License page has the full terms.

When are GridIron projections updated?

Every Wednesday morning (Central), as soon as the previous week's stats are final, for the week ahead. A pre-kickoff refresh may follow on Saturday to catch late injury news. Weather forecasts are pulled at each run, so a Wednesday forecast for a Sunday game is three or four days out. Check as_of before you display a number, and re-fetch on game day if your app shows weather.

Kickers and team defenses aren't covered yet. They're next on the list.

Frequently asked questions

Which plan do I need for GridIron projections?

The same plans as the other weekly projections: the current week on Free, every week on Basic, and the per-stat line and game context on Pro. Showing them to users in a product needs Pro + Commercial.

Can I show the consensus projections in my app?

No. The consensus numbers in projected_points are for your own research and benchmarking on every plan. GridIron projections, in gridiron_projection or with source=gridiron, are the ones Pro + Commercial lets you display.

How accurate are GridIron projections?

In a walk-forward backtest over 14,152 player-weeks from 2024 to 2026, the average miss was 4.40 PPR points against 4.63 for a trailing four-game average, lower at every position and in 44 of 45 weeks.

Does the weather make the projections better?

Not measurably. Wind, temperature and precipitation are model inputs and are shown with each projection, but removing them changed the backtest error by about a thousandth of a point. Treat weather as context.

When do new projections appear each week?

Wednesday morning Central time, after the previous week's stats are final, with a possible Saturday refresh. The as_of field says exactly when the numbers you have were built.