How EV is computed
Every CS2 weapon case has a fixed pool of skins sorted into five rarity tiers. Valve publishes the per-tier drop probability — those numbers, multiplied by live skin prices, give the expected value of one unboxed item.
1. Valve drop odds
| Tier | Probability |
|---|---|
| Mil-Spec | 79.92% |
| Restricted | 15.98% |
| Classified | 3.20% |
| Covert | 0.64% |
| Rare Special (knife / glove) | 0.26% |
2. Per-skin expected price
For each skin s with available wears W:
price_normal(s) = mean over w in W of bestPrice(s, w)
price_stattrak(s) = bestPrice("StatTrak™ " + s) if listed, else 1.4 × normal
price_expected(s) = 0.9 × price_normal(s) + 0.1 × price_stattrak(s)bestPrice is the lowest live ask across Steam Market, CSFloat, and Skinport.
3. Case EV
EV_tier(t) = mean over s in tier_t of price_expected(s)
EV_gross = Σ over tiers t of P(t) × EV_tier(t)
EV_net = EV_gross − caseUnitPrice − keyUnitPrice
EV_pct = EV_net / (caseUnitPrice + keyUnitPrice)Two ways we show ROI
The same expected value can be quoted two ways, and we show both:
- Unboxing ROI =
EV / cost— the share of your spend you get back on average. A Kilowatt at $1.33 EV on $2.81 cost is 47%: you keep about 47¢ of every dollar. - Net ROI =
(EV − cost) / cost— your gain or loss. Same case = −53%.
They're the same number shifted by 100% (net = unboxing − 100%). Unboxing ROI is the headline figure on cards; net is shown alongside. Anything under 100% unboxing ROI (i.e. negative net) loses money — which is almost every container.
5. Lottery score
Most cases have a deeply negative mean dominated by rare knife / glove drops. A high σ/μ means the case is essentially a lottery ticket: most opens lose almost everything and a few wins carry the EV. A low score means a more consistent — though usually still negative — outcome.
Caveats
- Wear distribution is approximated as uniform across listed wears. Real Valve distribution is float-uniform within each skin's allowed float range.
- Steam Market's 15% seller fee is not deducted. Third-party markets (CSFloat, Skinport) charge much less, and our
bestPricealready prefers the lowest live ask. - When all three sources fail for a skin, it's treated as $0 and the case is flagged as "lower-bound EV".
- This is not financial advice. Don't open cases as an investment.
Data sources
- Case + skin metadata: ByMykel/CSGO-API (committed snapshot, refreshed via
npm run fetch-metadata) - Steam Market:
steamcommunity.com/market/priceoverview - CSFloat: public listings API
- Skinport:
api.skinport.com/v1/items
Prices are cached server-side for 30 minutes. Click "Refresh prices" on any page to invalidate and re-pull.