Skip to main content

Trade scoring

The trade score measures how an exchange changes optimal starters, weighted by fantasy opponents. Use it to compare G*, C* and coverage before reviewing an offer.

What can you propose?​

Input or ruleRequirement
REST / MCPPOST /v1/trade/score / score_trade_proposal
ScopeLeague, season, week, horizon (default 4)
TeamsOur team and a different counterparty
PlayersNonempty send/receive ESPN IDs; no duplicates or overlap
OwnershipEach player belongs to its sending team in the current snapshot; failure is 409

For each horizon week, the scorer exchanges players and solves each team's starters before and after. Bench and IR have no standalone value; the scorer uses exact-week VORP without the lineup-only defense multiplier.

How are G*, C* and the final score calculated?​

Signs are from our perspective. ΔL is after minus before optimal starter VORP for one week.

G = Σ ΔL_us,w
I = Σ ΔL_them,w
m(z) = 1 + 0.25 × clamp(z, −2, 2)
G* = Σ ΔL_us,w × m(our fantasy opponent's z)
C* = Σ −ΔL_them,w × counterparty_weight_w
final_score = G* + C*
our_schedule_adjustment = G* − G
WeightRule
Opponent multiplier mRange 0.5–1.5
Teams face each otherCounterparty weight equals our opponent multiplier
Other matchupCounterparty weight is 0.25 × m(their opponent's z)
Fantasy byeWeight 0
Unknown pairing/strengthWeight unavailable, not 1
Example: our gain +4 against z=1; their gain +2G*C*Final
They face another z=0 team5−0.54.5
We face each other; their z=15−2.52.5
Scoring does not authorize a trade

There is no built-in acceptance threshold here. Human approval and worker gates apply separately; the shadow policy only records hypothetical verdicts.

When is a week unscored?​

ConditionTreatment
Traded player unmapped or unknown positionUnscored week
Traded player lacks required exact-week metricsUnscored week
Neither team has usable week metricsUnscored week
Unsupported starter slot or unfillable lineupUnscored week
Traded player's confirmed NFL byeLegitimate exclusion
As-of-week ESPN OUT, INJURY_RESERVE or IR slotLegitimate exclusion; future weeks do not assume the status persists
Missing metrics and unreadable NFL scheduleCannot confirm a bye
Missing untraded-player metrics/mapping/positionOmit player; record partial_roster_weeks if the week still scores
Unfillable K/D-ST on either sideHold slot on both sides to avoid artificial gains

How should you read incomplete scores?​

OutputMeaning
Raw G/ISum scored weeks; null if none score
G* or C*Null if any required weight in scored weeks is unknown
final_scoreRequires both weighted terms; null for empty or entirely fantasy-bye-weighted scored horizon
complete_horizonNo unscored horizon weeks; does not certify full roster coverage or known strength
unscored_weeks[].reasonsWhy weeks were withheld
final_score_unavailable_reasonsWhy weighted terms/final score were withheld
Partial means partial

No prior-week metric fills a gap. A numeric partial-horizon score is not a full-horizon estimate.

Roster impact and raw player totals
EvidenceContents
roster_impactBefore/after starter lists, totals, deltas, held slots, exclusions and non-IR roster sizes
Roster limitSum configured non-IR slots
Unequal tradeReport exceeds_roster_limit; do not simulate drops or suppress the numeric score
raw_vorpSingle-week mapped incoming minus outgoing VORP, missing internal IDs and unmapped ESPN IDs

Raw player totals are separate evidence; they do not calculate G* or rank the incoming inbox.