droplabz
Methodology

Data & methodology

How the simulation works and where every number comes from. For the drop rates themselves, see CS2 case opening odds and CS2 knife odds by case.

Rarity model

Valve published the generative rule, not just a table: in a weapon case each rarity tier is 5× rarer than the tier below it, and the Rare Special Item (knife / glove) is 2.5× rarer than Covert. DropLabz implements that rule and renormalises over whichever tiers a given container actually holds.

TierRelative weightProbabilityOdds
Mil-Spec Grade×179.92%1 in 1.3
Restricted×5 rarer15.9847%1 in 6.3
Classified×25 rarer3.1969%1 in 31.3
Covert×125.0 rarer0.6394%1 in 156
Rare Special Item×312.5 rarer0.2558%1 in 391

Within a tier, every skin is treated as equally likely — Valve has never published per-skin weights, and equal weighting is the community standard. In the rare-special pool that holds per finish: a Doppler's phases share one finish's odds (Phases 1–4 ≈ 22.5% each, Ruby ≈ 4%, Sapphire ≈ 4%, Black Pearl ≈ 2%; Gamma Doppler Emerald ≈ 10% — community estimates, as Valve never published phase odds). The engine is deterministic under a seeded RNG (see the test suite) and uses crypto.getRandomValues for live rolls.

Float & wear

DropLabz assumes a raw float is drawn uniformly in [0, 1), then mapped into the skin's own range: float = min + raw × (max − min). Wear is derived from the result — never rolled first — so skins whose range excludes a wear simply never produce it.

Factory New0.00 – 0.07
Minimal Wear0.07 – 0.15
Field-Tested0.15 – 0.38
Well-Worn0.38 – 0.45
Battle-Scarred0.45 – 1.00

This is a simplified model, not a verified distribution of in-game unboxings. CSFloat's research on unboxed CS:GO skins found a nonuniform raw-float distribution. That historical research does not establish the current CS2 distribution, but it means uniform generation should not be presented as confirmed game behavior. DropLabz's wear probabilities, case expected values and ROI rankings depend on this assumption and may differ from real openings. Trade-up output floats use a separate deterministic formula.

StatTrak, pattern & special finishes

  • StatTrak: an independent 10% roll on items that can exist in StatTrak form (per the upstream stattrak flag). Gloves are never StatTrak. StatTrak status feeds the value estimate.
  • Pattern seed: every applicable item gets an index in [0, 1000], shown in the result and inventory.
  • Special finishes: Doppler / Gamma Doppler phases (Ruby, Sapphire, Black Pearl, Emerald), Fade, Marble Fade, Case Hardened, etc. are surfaced only when they can be read from the upstream data — phase-priced valuation is future work.

Data sources & provenance

Case & skin metadata
ByMykel/CSGO-API (MIT) — cases, skins, rarities, float ranges, StatTrak eligibility, keys
Item & case artwork
Steam CDN URLs referenced from the metadata (community.*.steamstatic.com)
Pricing
csgotrader.app steam.json — Steam Community Market, USD, most recent 24h / 7d / 30d / 90d average
Price snapshot
Oct 27, 2026, 10:25 AM UTC (cached, committed at build)
Price coverage
94.7% of reachable (skin, wear) combinations
Dataset built
Oct 27, 2026, 12:26 PM UTC · 42 weapon cases

Data is fetched and normalised by npm run build:data and committed to the repo — no external calls happen at page-load time. Prices are estimates and exclude marketplace fees; thin markets may be missing entirely and are excluded from expected-value maths.

Assumptions the simulator makes

  • Opening cost = current case price + key price. Non-marketable keys use the $2.50 store price.
  • Skins within a rarity tier are equally likely; knife/glove finishes are equally likely, with Doppler phases sharing their finish's odds.
  • StatTrak is an independent 10% roll; float is uniform in raw space.
  • P(wear) is the fraction of a skin's float range inside each wear band.
  • Values are Steam snapshot mid prices, not net of fees, and can be stale.
  • Expected value excludes any outcome with no price in the snapshot.