Where Historical DFS Contest Data Comes From
Historical DFS contest data comes from operator exports of contests you entered, published contest result pages, third party archives that scraped those pages, and reconstructions built from salaries and box scores. Coverage thins quickly going back in time, and ownership figures are the field most often missing entirely.
The four sources, and what each one holds
Operator exports. Most operators let an account download its own entry history: contest, date, lineup, score, finish, and entry fee. This is accurate and complete for you, and says nothing about the rest of the field. It is the right starting point for evaluating your own process and useless for studying how fields behave.
Published contest result pages. Many contests publish a results page listing every entry's lineup and score once the contest settles, which is where ownership percentages can be derived: count how many entries contained each player and divide by entry count. These pages are the richest source and the least durable. They are paginated, rate limited, and frequently removed or moved behind login after a season or two, so anything not captured at the time may be gone.
Third party archives. Various sites and community projects have collected contest results, salaries, and derived ownership over past seasons. Coverage is uneven by sport, by operator, and by contest size, and the terms under which the data may be redistributed vary. Read those terms before building anything on top.
Reconstruction from primitives. Salaries for a slate plus official box scores and the operator's published scoring formula are enough to recompute any lineup's score exactly. That gets you a complete picture of what was scorable without touching contest data at all. What it cannot give you is what the field actually did.
Why ownership is the hard field
Scores are deterministic: salaries, statistics, and a published formula reproduce them. Ownership is a property of the field on that specific slate, observable only from the entries themselves. If nobody captured the results page, the ownership distribution for that slate is not recoverable from any other artifact. This is why archives are valued for ownership specifically, and why gaps in old seasons tend to be permanent.
What to verify before modelling on it
Slate identity. A single day may carry a main slate, an afternoon slate, a primetime slate, and single game contests, with different player pools and different salaries. Data that does not identify which slate a row belongs to will mix incompatible populations. Confirm the slate key exists and is consistent.
Scoring version. Operators change scoring formulae between seasons. A score recomputed with today's formula will not match a historical result. Store which version applied and validate by recomputing a sample of known scores.
Salary snapshot timing. Salaries are set before lock. Some archives record them at a point that is not the locked value, which quietly shifts every value calculation. Check a handful against a contemporaneous source.
Entry count and multi-entry. Ownership derived from an entry list is per entry, not per user. A field where a few users submitted many lineups behaves differently from one with many single entries. If the data does not distinguish them, say so in your analysis rather than assuming.
Truncation. Result pages for huge contests are often paginated and sometimes only the top portion was ever captured. Ownership computed from the top thousand entries of a hundred thousand entry contest is not field ownership, it is winner ownership, and the difference is exactly what you were trying to measure.
Withdrawn and voided contests. Postponed games cause cancellations and re-scoring. Rows from affected slates need flagging or exclusion.
Building a workable set
Start from what you control. Pull your own entry history first, since it is complete and free, and use it to test scoring reconstruction. If your recomputed scores match the operator's for every entry you made, your formula implementation is right.
Anchor on primitives. Keep salaries, box scores, and the scoring formula as your base tables. They are obtainable for past seasons, they reconstruct scores, and they let you generate hypothetical lineups for any slate. Treat contest results as an overlay on top rather than the foundation.
Capture forward. Ownership cannot be backfilled, so if field behaviour matters to you, start recording it now, respecting each operator's terms and rate limits. A season of self captured data beats a scraped archive of unknown provenance.
Record provenance per row. Source, retrieval date, and slate identifier on every row. When two sources disagree about a salary, and they will, provenance is the only way to adjudicate.
Check the legal side first. Terms of service govern automated access, and the fact that a page renders in a browser does not mean bulk collection is permitted. Archives carry their own redistribution terms. This is a real constraint, not a formality, and it decides which of the four sources is actually available to you.
This page describes data and method and is not betting advice.
Frequently asked questions
- Is historical DFS contest data publicly available?
- Partially. Operators publish results pages for many settled contests and allow an account to export its own entry history, but coverage of older seasons is patchy because pages are removed over time. Third party archives fill some gaps with varying completeness and redistribution terms.
- Can historical ownership percentages be reconstructed?
- Only from the contest entry lists themselves. Ownership is a property of the field on one specific slate, so if the results page was never captured, no combination of salaries, box scores, and scoring rules recovers it. Scores reconstruct exactly; ownership does not.
- What is the most reliable DFS data source?
- Your own entry history from the operator, because it is complete and authoritative for your entries. It is also the narrowest, covering only contests you played. For field level questions you need contest results pages or an archive built from them, both with more caveats.
- Why do recomputed DFS scores not match historical results?
- Usually because the scoring formula changed between seasons, or because the salary snapshot used was not the value locked at contest start. Both are common. Validate by recomputing scores for entries whose official results you already have before trusting the pipeline.