STAT-API

FanDuel contest capture

Complete standings and every winning lineup, for every contest.

entry_id, sample_weight and the scoring corrections roll out on 2026-09-24.

Up to 50,000 unique lineups — every lineup is stored

DET @ BUF · $125K Rush49,603 entries
every lineup stored
IND @ KC · $75K Rush29,761 entries
every lineup stored

Over 50,000 — every winning lineup, plus an even sample of the rest

NYG @ LAR · $150K Rush59,523 entries
every paid lineup + cash line
rank 178% stored, gaps spread evenlylast place

Each bar runs in rank order, rank 1 on the left; its length is the number of entries. Blue = lineup stored. Grey in DET @ BUF and IND @ KC = the 144 and 66 entrants who never submitted a lineup. In NYG @ LAR the sample is spread evenly from the cash line to last place, so the lineups not stored are small gaps across the whole lower field — not a missing bottom. Every contest also keeps its complete standings: rank, user, score and payout for every entry.

Is a sample exact enough for research?

Yes. We took a contest we store in full (DET @ BUF, 49,459 lineups), drew samples with the same rule, and compared every player's ownership with the full field. Weighted by sample_weight:

SampleAverage errorLargest error
5%0.17 pts1.52 pts
8%0.10 pts0.46 pts
25%0.03 pts0.17 pts
87%0.01 pts0.05 pts

An 8% sample is what a 650,000-entry Sunday Million keeps. Standings, scores, payouts and every winning lineup are never sampled.

How a large contest is sampled

  1. Every paid lineup — never fewer than the best 17,500.
  2. The cash line — the 4,500 lineups nearest the last paid place.
  3. The rest — 28,000 lineups evenly spaced down to last place, each with a sample_weight (how many entries it stands for).

Get a contest

curl -s "https://api.stat-api.com/api/v1/dfs/contests/{contest_id}/download?format=csv&enrich=dfs.player_stats" \
  -H "Authorization: Bearer YOUR_API_KEY"
rank, username, points, payoutThe final FanDuel result, for every entry.
MVP, FLEX1 … / QB, RB1 … DEFOne column per roster slot: player, id, salary, points, ownership and box-score stats.
entry_idTells apart two rows with the same lineup (one user entering it twice).
sample_weight1 in a complete contest and for paid lineups; above 1 for the sampled rest.

Find contest ids in dfs/contests. format=json returns the same data as JSON.

Questions

Why do some rows have no players?
Those entrants never submitted a lineup. FanDuel lists them with 0 points, and so do we.
Do slot points add up to the entry score?
Yes. For every captured contest, the slot points, positions and salaries are FanDuel's own per-player values from the contest's entry documents, MVP multiplier included. So every stored lineup's slot points add up to its FanDuel score.
Which ownership numbers should I use?
The own% in each cell. In a sampled contest it is already weighted to describe the full field.
Is the contest still loading?
We capture a contest after it settles; a large one takes a few hours. is_sampled is false when every lineup is stored.

Something else? Write to us.