Updated Sep 7, 2026 · Week 1 board.
One row per player, nothing else
nflverse documents it publicly. The file carries an ID number, the player's name, his position, his current team, and his draft year, his round and the pick he went at. It refreshes with every public release. What it doesn't carry is a single season, week or market number. No stat lines. No snap counts. No odds. It answers one question, which is who this player is, and it's built to be matched against other files instead of read alone for numbers.
How it gets loaded
In R, the whole file comes back in one line. Nothing to filter, because it's already flat. A Python version exists too, built for the same file. Either way what you get back is identity, and every stat or price or projection has to arrive from a second file matched on that same ID.
Why the file has to be flat
A player's position, his team, his draft background: none of that changes week to week the way a stat line does. So there's no reason to repeat a whole player record for every game. Keep identity in one flat table and every other file can point at it by ID. That's how a stats file and an odds file and a prop board all agree on who a guy is without writing his biography three separate times. The cost is what a lookup table always costs. It tells you who this is. It never tells you what happened, or what the market thinks of him.
It's also why a flat table stays correct as it gets big. One trade touches one entry. It doesn't touch every historical stat line the player shows up in. If team and position lived inside every stat entry instead, a midseason trade would leave old entries pointing at a team he no longer plays for, unless somebody rewrote all of them. One entry per player means one place to fix.
Our own board, built the same way
Our player prop board isn't players.csv, but it's cut the same way. One entry per player per bet type, nothing nested. J.K. Dobbins, in that same ID format, nfl-00-0036158, shows up in exactly seven entries on our 212-entry board today. Receiving yards at 4.5. Rush plus receiving yards at 56.5. Receptions at 1.5. Rushing attempts at 12.5. Longest reception at 4.5, longest rush at 12.5, rushing yards at 50.5. Nothing about Dobbins the person sits inside any of those seven. No position. No team. Each one is a bet type, a line and an ID, which is the same identity-here, prices-there split players.csv is built around.
| Bet type | Consensus line |
|---|---|
| Receiving yards | 4.5 |
| Rush + receiving yards | 56.5 |
| Receptions | 1.5 |
| Rushing attempts | 12.5 |
| Longest reception | 4.5 |
| Longest rush | 12.5 |
| Rushing yards | 50.5 |
Coverage isn't even across players, and a flat table is what makes that easy to see. Malik Nabers, same ID format, turns up in only three entries on the same board: receiving yards at 60.5, receptions at 5.5, longest reception at 23.5. Dobbins has seven. Nothing in a roster file would have predicted that gap. It's a fact about which bets the market bothered to price this week, and it lives entirely on the market side, never on the identity side.
The same split runs through nflverse's other files. A weekly stats table adds a season and a week to every entry, then matches back to players.csv by ID for the name and the position instead of repeating them. players.csv stays the one place identity lives. Everything else, stats and snaps and market lines, is a second file pointing at it.
What a flat file can't tell you by itself
Neither file can tell you whether a line is any good. players.csv can't say whether Dobbins' 56.5 rush-and-receiving number is fair, because it holds no market numbers at all. Our board can't say whether that number matches his normal role, because it holds no history on him. Reading one and expecting the other one's job out of it is exactly the mistake a flat design is meant to make obvious. Two files, two jobs, and neither one covers for the other.
The live version of the table above is on the player props page, with the game board it ties back to on the NFL odds desk and the season's fantasy rankings. A companion piece walks the actual match from a roster ID to a priced line: how nflverse players.csv becomes NFL betting lines. The wider shape of how our numbers connect is in the sports-data walkthrough.
The Receipts Drawer
Two flat files, same design, same reason. One holds who a player is. The other holds what he's priced at right now. Dobbins turning up in seven entries and Nabers in three isn't a bug, it's the market pricing different things for different guys on top of an identity table that never changes shape. Watch a player's entry count grow during the week as books add bet types on him. That's your tell that a game is pulling attention, before you read a single one of the numbers.



