Pull your Sleeper roster in, see where the model ranks every player you own, compare your team against the rest of your league, watch your whole roster's film from the most recently completed slate, and score every manager in the league on what they drafted and traded for. Rosters and leagues are read live from Sleeper's public API in your browser — nothing is sent to this site.
Who actually drafts and trades well in your league? This prices every draft pick, trade and waiver add in a Sleeper league against KeepTradeCut consensus value, and ranks the managers on what they acquired versus what it cost them. Leagues are read live from Sleeper's public API in your browser — nothing is sent to this site.
One number per manager, league mean 100, one standard deviation 15. 115 means "one standard deviation better than the rest of this league". It is a ranking within your league, not an absolute rating — the average manager in every league scores about 100.
Manager Score = 100 + 15 × (0.50·zdraft +
0.35·ztrade + 0.15·zwaiver)
Weights are renormalised over whichever components your league actually has, so a league that never trades is not scored on a component nobody played.
Everything below is built from one measurement. For any asset that changes hands on a date, we take its KeepTradeCut value on that date and the highest value it reached afterwards. The difference is what was captured:
captured = peak value after the transaction − value on the
day of the transaction
Acquiring an asset captures that gap; giving one up forfeits it. So acquiring a player just before he breaks out scores well, and trading away a player who then breaks out scores badly — which is the thing everyone actually argues about in a dynasty league.
Surplus = what the pick captured, minus what a pick at that slot typically captured in that same draft. The par curve is fitted from the draft's own picks (median per six-slot bin, forced never to rise as slots get later), so the average pick in a room scores zero by construction. That is what makes startup drafts, rookie drafts, 10-team and 14-team leagues comparable without any hand-tuned constant. A draft with fewer than 12 evaluable picks is skipped rather than scored badly.
Net = captured by what you received, minus captured by what you gave, counting players and draft picks on both sides. Within any trade these sum to exactly zero, so it is a genuine transfer measure. A trade containing an asset we cannot price is reported but not scored — pricing one side and not the other would invent a steal that never happened.
Captured by each waiver or free-agent add. A replacement-level body that never rose captures zero; plucking a player who then becomes a starter captures a lot. FAAB spent is shown in the audit but not scored: KTC points and FAAB dollars have no exchange rate, and inventing one would be the least defensible number on the page.
Each component is a per-transaction mean, not a total,
then shrunk toward zero by n / (n + k) (k = 6 picks, 3 trades,
5 adds). Shrinkage only ever moves a manager toward average —
it never flips a sign and never overshoots — so one lucky pick cannot
top the table, and making 40 mediocre trades cannot either. A manager with
no activity in a component is scored as league-average for it, flagged, and
not penalised for abstaining.
KeepTradeCut publishes a live superflex consensus board, not an archive, so historical values are not available from KTC directly. The dated boards behind this page were recovered from public web-archive captures of that page and are stored in this repository, one small file per date. Nothing here is interpolated, modelled or invented — every number was published by KTC on the date it is filed under.
The archive is real but sparse: a few dozen dated boards rather than a daily series, with gaps of weeks to months. Consequences, stated rather than hidden:
Going forward the daily job files a new dated board on every run, so the series densifies from here even though the past cannot be filled in.
Any Sleeper league, and gently. Enter any league id (or
find one by username) — nothing about this page is specific to one
league, and the whole dynasty chain is discovered by following
previous_league_id backwards from whatever you type. Sleeper's
API is public, unauthenticated and free, so the reads are kept modest:
every response is cached for the tab, completed seasons are cached
indefinitely because a finished box score cannot change, the live season is
only asked for weeks that have actually started, requests are batched by
week rather than per player, and no more than a handful are ever in flight
at once. Scoring the same league twice costs zero further requests.
Everything above prices a trade against the market. It answers was this a good bet at the time. It cannot answer the question you actually remember — did it work out. Trade for a back who then carries you to a title, and trade for a back who then tears an achilles, and on the day you made them the two can price identically.
So every trade now carries a second, independent figure: the points the players you acquired actually scored for you, from the week of the trade onward.
Where the points come from. Sleeper's own weekly matchup records, which report each rostered player's score computed with your league's scoring settings. Not a generic PPR approximation: this league is half-PPR with a tight-end bonus, and a generic feed would be wrong for it in a way that quietly favours receivers. The realized lens therefore needs no scoring configuration and is exact rather than close.
Who held whom is read, not inferred. The same weekly record says which roster each player was on that week. So a player traded on again, dropped, or acquired the day before kickoff needs no special case: we count the weeks he actually spent on the acquiring roster and no others. Production before the trade stays with the manager who earned it.
Normalisation. Raw points would make a week-2 trade beat a week-12 trade for no better reason than having ten more weeks to accumulate. Two defences are reported:
This counts all rostered production, bench included. Sleeper reports both the full roster and the weekly lineup, and the choice is deliberate: what is being graded is the acquisition, not the manager's weekly lineup card. Trading for a player who goes on to produce is one skill; leaving him on the bench while he does it is a different one. Charging the trade for a benching would conflate them, and would punish acquiring a stash who breaks out while blocked behind somebody else on your roster.
The honest caveat. Bench points did not directly win anybody a game. A manager who acquires a producer and never starts him gets full credit here for a benefit he never actually banked. That is a real consequence of scoring the acquisition in isolation, and it is not offset anywhere: lineup management is not measured on this page at all. So that the gap stays visible, every trade also reports how much of that production was actually in the lineup — scored on the total, shown on both.
Replacement level follows the same population. Because every rostered week is scored, the bar a player is measured against is the median of all rostered players at that position that week, not the median of those who were started. Mixing the two would charge a benched or bye-week player a starter's replacement level for a week he was never asked to play, and would manufacture large negative PAR out of nothing. Measured across four real seasons this puts the RB bar at about 3.5 points a week rather than 10.9, because roughly a third of rostered players score zero in any given week. PAR figures are correspondingly larger than a starter-based version would give — a change of scale, not of accuracy, since every trade is measured against the same bar.
The two lenses are never averaged. They answer different questions and will sometimes disagree; where they do, the page says so explicitly. A manager who lost value by the market and won by the scoreboard bought win-now production cheaply — which is a real way to win a league and a real way to bleed value doing it. Averaging deletes exactly that signal.
One property worth stating: unlike the market lens, realized value is not zero-sum. Points are produced, not exchanged, so both sides of a trade can genuinely come out ahead.
The obvious follow-up is "what was he projected to score at the time, and did he beat it?". That was investigated directly against the live API rather than assumed, and the answer is more awkward than either yes or no.
Sleeper does return per-week projection rows for past seasons — 2023 through 2026 all answer. But they are not a trustworthy point-in-time archive, for two independent reasons:
updated_at. For 2025 week 11 it reads 2025-11-18, a day after
those games. For 2025 week 2 — games played 11-15 September — it
reads 2025-10-06, three weeks later. For 2023 the field is
absent entirely. There is no way to recover what was on screen before
kickoff, which is the only number worth comparing against.pts_ppr, pts_half_ppr and
pts_std. None of them is your league's scoring. Comparing a
generic projection against a league-scored actual produces a difference
that is partly just the two formats disagreeing.So no expected-vs-actual figure is shown, and none has been invented. Realized production answers the owner's question without projections anyway: "he scored this much for you, and that ranked him here" is a stronger claim than "he beat a forecast", because it is measured in the only units that decided your matchups.
Going forward this becomes answerable honestly.
scripts/archive_sleeper_projections.py files a dated snapshot
per run, in the same pattern the KTC archive uses, stamped with the date it
was actually captured. Once a trade is made after a snapshot exists, the
expected-versus-actual comparison can be made from a projection that
provably predates the outcome. It cannot be backfilled.
Clips are matched to players automatically from public YouTube uploads and open on YouTube in a new tab rather than in an embedded player — embedding is restricted for reasons outside this site's control and produced repeated playback errors. Views and ad revenue stay with the original uploader. Model ranks come from the same engine that powers the Dynasty Rankings tab. League standings are computed in your browser from the rosters Sleeper returns; the method is documented on the League tab.