BUFF sale history is now available - POST /v1/archive/buff returns sale prices and daily total supply since September 2024.

How to Value a CS2 Inventory

To value a CS2 inventory, resolve every asset to an exact market_hash_name and supported variant, request current prices in batches of 100, assign each item a cash listing value and a sell-now value, then multiply by quantity and sum only estimates with adequate evidence. cs2.sh supplies the item schema and market data; a Steam inventory API or exported inventory supplies the assets you own.

Scope: This is a broad, high-level v0 guide, not a complete application. cs2.sh is designed as a flexible market-data layer for whatever you want to build on top of it, so adapt the implementation to your own product, strategy, and integrations.

One total hides important differences. A useful inventory report carries at least three totals:

Total Practical meaning
Cash listing value What comparable items are currently listed for on cash marketplaces
Sell-now value What current generic buy orders support before account-specific fees
Conservative value A liquidity-adjusted value that moves thin items toward credible buyer demand

Keep Steam Wallet value in a separate column. Steam prices do not settle to withdrawable cash, so adding an unadjusted Steam total to cash-market values overstates what the inventory can return in cash.

Start with the exact assets#

Your inventory source should provide one row per asset with its market_hash_name, quantity, and any available float, paint seed, stickers, StatTrak or souvenir status, and Doppler phase. Aggregate identical commodity items by name, but retain individual rows for assets whose exact attributes can change their value.

Match each name against GET /v1/schema. The schema uses the same market_hash_name keys as the price endpoints and identifies wears, marketplace ids, float limits, and supported variants. Do not silently fuzzy-match an unknown inventory name to the closest skin. Put unresolved assets in an exceptions table so they cannot disappear from the total.

For Doppler, Gamma Doppler, and supported Case Hardened tiers, select the nested variant by its stable version. A base Doppler value is not a Phase 2 value. Steam has no phase-level prices because its market does not distinguish those variants.

Price the ordinary items in batches#

Send up to 100 distinct market_hash_name values per POST /v1/prices/latest request. For every returned item:

  1. Discard source values that are null or outside your freshness tolerance.
  2. Keep cash-market ask values as current sell-listing evidence.
  3. Keep cash-market bid values as current buy-order evidence.
  4. Record ask_volume and bid_volume where available so a single listing is visible as weak support.
  5. Calculate the item value, then multiply by inventory quantity. Do not multiply before resolving missing or variant data.

A robust cash listing value can start from the median ask across supported cash marketplaces. A sell-now value can start from the highest credible cash bid after source-specific selling and withdrawal fees. The fair-value guide adds completed sales and a conservative floor when one defensible middle estimate is needed.

Store the selected sources beside every estimate. A total without item-level provenance cannot be recalculated when a price is stale, a marketplace becomes unavailable, or a fee changes.

Check current estimates against completed sales#

Current asks and bids describe active orders. Completed sales show where comparable items actually changed hands and are especially important when an inventory contains thin knives, gloves, or variants.

Use the CSFloat archive for daily arithmetic average completed-sale prices and sale counts from 2022. Use the Steam archive for daily median sale prices and purchase counts from April 26, 2013, while keeping its Steam Wallet settlement separate from cash. The BUFF and Youpin archives supply sale prices but no sale volume, so their point counts cannot be used as sales counts; the BUFF archive adds the daily total supply BUFF reports.

Do not combine these series into one unlabeled average. Compare each source's recent sale level with the current estimate and lower confidence when the current orders have no recent sale support. A sale archive can also be delayed relative to a live listing, so missing same-day confirmation is uncertainty rather than proof that the current price is wrong.

Adjust exact skins only when the data supports it#

GET /v1/market/buff/latest splits supported items into current float, fade, and combined float/fade ranges. Match an asset's float or fade percentage to the returned range boundaries, then use the range ask, avg_ask, bid, and active-order counts as additional evidence. The boundaries vary by item and are inclusive on min and exclusive on max; never assume a universal set of float bands.

Rare paint seeds, applied stickers, and one-off collector combinations may still require an individual appraisal. The public price snapshot describes a generic item or supported variant, and BUFF ranges describe groups of comparable assets. Neither proves the premium of a unique asset.

The CSFloat buy-order book can strengthen the sell-now side for an exact asset because it includes conditional orders for float, paint index, stickers, charms, and paint seeds. A conditional order counts only when the asset satisfies every condition. Do not apply the highest conditional order to the whole inventory row.

Add liquidity and confidence#

Join GET /v1/liquidity/items by market_hash_name and, when applicable, by variant. The endpoint assigns daily liquidity buckets and estimated sale-time ranges from recent sale volume and traded value. Variants are classified independently from their base items.

Use liquidity to control confidence, not to manufacture a price:

  • Liquid item with several current listings and bids: retain the normal cross-market estimate.
  • Illiquid item with a current bid but few listings: move the estimate toward buyer demand and lower confidence.
  • Item with only one old listing and no credible bid or recent sale evidence: mark the value unknown.
  • Missing source or range: leave the component missing. Never convert it to zero.

An honest report can have a known subtotal and an unpriced-assets count. Forcing every asset into the total makes the result look complete while reducing its accuracy.

Store a reproducible valuation snapshot#

For each asset or aggregated row, retain:

text
market_hash_name, variant_version, quantity
selected_cash_ask, selected_cash_bid, source_names
updated_at, collected_at, valuation_time
liquidity, estimated_sale_time, confidence
cash_listing_value, sell_now_value, conservative_value
unpriced_reason

This shape supports both a one-time calculator and a portfolio tracker. New valuations should be appended as snapshots instead of overwriting the last result, so users can distinguish a genuine market move from a changed fee model or previously missing source.

The API does not retrieve a user's Steam inventory, inspect tradability or trade holds for individual assets, calculate marketplace fees, or appraise every sticker and paint seed. Keep those inputs separate from the normalized market data.

References: item schema, current prices, CSFloat completed sales, Steam sale history, BUFF ranges, liquidity, and using the API.