# fbdata.xyz — full agent map Point-in-time NFL data for fantasy, spreads, totals and CFTC-regulated prediction markets. Every fact is versioned by when fbdata learned it, so any query can be re-asked as it would have been answered on a past date. This is the expanded manifest. The index is at https://fbdata.xyz/llms.txt. ## The one rule that matters Upstream rewrites its own history. nflverse recomputes EPA, WPA, CPOE and xYAC on every model refit and republishes all seasons back to 1999 -- the 1999 play-by-play file carries a 2025 mtime. A model backtested against the current file trains on numbers the feed did not carry on the date being modelled, which inflates measured edge. Deciding now omit as_of Testing a theory pin as_of to a pre-kickoff instant Responses carry `x-fbdata-point-in-time: true|false` and JSON bodies carry a `point_in_time` field. If it is false and you are evaluating a strategy, the number is contaminated. Column groups, from https://fbdata.xyz/v1/schema/{dataset}: observed ground truth about football; changes are genuine corrections derived upstream model output; changes mean their model moved, not the game volatile ingestion noise, never versioned Do not train on `derived` columns without pinning as_of. ## Connect over MCP fbdata speaks Model Context Protocol, which is the lowest-friction way for an agent to use it -- tools, argument schemas and semantics arrive on connection, with no client to write and no key to request. https://fbdata.xyz/mcp streamable HTTP, no auth Point any MCP client at that URL. For Claude Code: claude mcp add --transport http fbdata https://fbdata.xyz/mcp Running it locally from a clone is still supported and is the same six tools: uv run python -m fbdata.mcp.server # stdio transport fbdata_catalog what exists fbdata_schema columns and their revision group fbdata_leaders ranked tables (start here) fbdata_query raw rows when a board cannot express the question fbdata_futures championship odds, vig removed fbdata_history every revision of one row fbdata_season_model simulated season: title, playoff and seed probability ## Leaderboards ### teams Team efficiency. Net EPA is offense minus defense per play — the single number most models start from. GET https://fbdata.xyz/v1/leaders/teams?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/teams.md markdown mirror, ~10x cheaper than the HTML page columns: team, games, w↑, l↓, t, win_pct↑, net_epa↑, pf↑, pa↓, pd↑, ppg↑, papg↓, off_epa↑, off_sr↑, off_pass_epa↑, off_rush_epa↑, off_expl↑, def_epa↓, def_sr↓, def_pass_epa↓, def_rush_epa↓, proe, pass_rate ### passing Quarterback efficiency per dropback. Sacks and scrambles included, so sack rate is measured against real dropbacks. GET https://fbdata.xyz/v1/leaders/passing?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/passing.md markdown mirror, ~10x cheaper than the HTML page columns: player, pos, team, games, dropbacks, epa_db↑, sr↑, cpoe↑, comp_pct↑, ypa↑, adot, td↑, int↓, sack_pct↓, expl↑ pos: QB · min dropbacks default 100 ### rushing Rusher efficiency. QB scrambles excluded. GET https://fbdata.xyz/v1/leaders/rushing?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/rushing.md markdown mirror, ~10x cheaper than the HTML page columns: player, pos, team, games, carries, yards↑, ypc↑, epa_rush↑, sr↑, expl↑, fd_rate↑, td↑, fum↓ pos: RB|QB|WR|FB|TE · min carries default 40 ### receiving Receiver production and opportunity. WOPR = 1.5×target share + 0.7×air-yards share — opportunity predicts better than production. GET https://fbdata.xyz/v1/leaders/receiving?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/receiving.md markdown mirror, ~10x cheaper than the HTML page columns: player, pos, team, games, targets, rec↑, yards↑, td↑, hppr↑, wopr↑, tgt_share↑, ay_share↑, adot, catch_pct↑, epa_tgt↑, yac_rec↑ pos: WR|TE|RB|FB · min targets default 20 ### games Every game with closing lines and how they resolved. Spread and margin are home-perspective. GET https://fbdata.xyz/v1/leaders/games?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/games.md markdown mirror, ~10x cheaper than the HTML page columns: season, week, away, home, as, hs, spread_line, result, ats, ats_margin, total_line, total, ou, roof ### adjusted Opponent-adjusted efficiency, solved jointly for offense and defense. Schedule Swing shows how much raw EPA was misleading. GET https://fbdata.xyz/v1/leaders/adjusted?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/adjusted.md markdown mirror, ~10x cheaper than the HTML page columns: team, games, adj_net↑, adj_off↑, adj_def↓, raw_off↑, raw_def↓, sos_swing ### tendencies How a team plays, not how well — pace, personnel, play-action, motion, and how opponents choose to defend them. GET https://fbdata.xyz/v1/leaders/tendencies?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/tendencies.md markdown mirror, ~10x cheaper than the HTML page columns: team, games, plays, proe, pass_rate, ed_pass, shotgun, no_huddle, pa_rate, rpo, screen, motion, p11, p12, p21, ttt, box, blitz_faced, man_faced, prss_faced↓ ### coverage Defenders in coverage — what happens when they are thrown at. Passer rating allowed is recomputed from season totals, not averaged across games. GET https://fbdata.xyz/v1/leaders/coverage?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/coverage.md markdown mirror, ~10x cheaper than the HTML page columns: player, pos, team, games, tgt, cmp, cmp_pct↓, yds↓, ypt↓, rat_allowed↓, td↓, int↑, adot, yac↓, prss↑, sacks↑, mtkl_pct↓ pos: CB|SAF|LB|DB · min targets default 25 ### pressure Quarterback profile under pressure. PFR supplies how often he was pressured; FTN charting supplies what he did about it. GET https://fbdata.xyz/v1/leaders/pressure?season=&week_min=&week_max=&pos=&min=&as_of=&format=json|csv GET https://fbdata.xyz/pressure.md markdown mirror, ~10x cheaper than the HTML page columns: player, team, games, dropbacks, epa_db↑, prss_pct↓, blitz_pct, hurried↓, hit↓, bad_pct↓, drops, oop_rate, ta_rate, iw_rate↓, fault_sack↓, pa_rate, rpo_rate, blitzers_faced pos: QB · min dropbacks default 100 ## Markets GET https://fbdata.xyz/v1/futures?future_type=super_bowl|afc|nfc&prior_season=&as_of= Championship odds as consensus probability with the bookmaker margin removed. Quoted outrights are not probabilities: a book's field sums to 120-140%, and reading it raw overstates every team. Returns the median devigged probability across books, the fair price at that probability, the best price available, and the overround removed. Answer "who is the favourite" from here, never from an efficiency board. GET https://fbdata.xyz/v1/futures/model?season=&prior_season=&market_weight=&n_sims=&as_of= Championship probability from a simulated season rather than a price. Ratings drive all 272 scheduled games, wins drive division races and seeding, and the bracket produces a champion, over tens of thousands of runs. Returns title, conference, division, playoff and top-seed probability plus expected wins -- all from the same runs, so they are mutually consistent rather than reconciled after the fact. Ratings are fitted so simulating them reproduces the futures board, then blended with prior-season opponent-adjusted efficiency on the rating scale. market_weight 1.0 restates the market, 0.0 ignores it, and the default leans on the market because the market has seen the offseason and the efficiency prior has not. `edge` is model minus market and is meaningless at 1.0. Every number is a Monte Carlo estimate: compare an edge against sim_stderr on the same row before acting on it. GET https://fbdata.xyz/v1/predictions/games?season=&week=&as_of= Transparent EPA/scoring baseline: win probability, fair spread, fair total, market edge, plus model version, training season and cutoff. A baseline to beat, not a forecast to trust. GET https://fbdata.xyz/v1/props/settlements?game_id= Quoted player props graded against final results, with push and pending rules made explicit. ## Raw data GET https://fbdata.xyz/v1/catalog datasets, coverage, revision counts GET https://fbdata.xyz/v1/schema/{dataset} columns with revision group GET https://fbdata.xyz/v1/query?dataset=&as_of=&partition=&columns=&where=&limit= GET https://fbdata.xyz/v1/history?dataset=&where= every revision of one entity GET https://fbdata.xyz/v1/snapshots ingestion log GET https://fbdata.xyz/v1/sources feed readiness, rights, missing credentials GET https://fbdata.xyz/openapi.json machine-readable API spec `columns` is allowlisted against the real schema and `where` takes a plain row predicate -- no subqueries, separators or file functions. Read the schema rather than guessing. Datasets currently loaded: depth_charts depth_charts_legacy ftn_charting futures_quotes injuries market_quotes odds_events participation pbp pfr_def pfr_pass pfr_rec pfr_rush player_stats players prediction_quotes prop_quotes schedules snap_counts weekly_rosters Rows under management: 5,390,919 ## Two representations Every HTML page serves a person view and an agent view of the same URL. Agents get agent mode by content negotiation; `?mode=agent` forces it. Leaderboards additionally serve `.md`. Mode is presentation only -- it never affects access or price, because an identity claim is not a credential. ## Pricing $0.0004 per 1,000 rows returned, advertised on every response as x-fbdata-price-usd so you can budget before a 402 rather than by rejection. Settlement is x402 on Radius via radius-tollgate. ## Attribution Play-by-play and player data via nflverse (CC-BY-4.0). Charting via FTN Data through nflverse (CC-BY-SA-4.0). Attribution is required if you redistribute.