Inventory & fair value

How to Value a CS2 Inventory in Cash

Value a CS2 inventory by batching market_hash_name values through POST /v1/prices/latest, matching Doppler phases, producing three totals (listing / sell-now / conservative), and never mixing Steam Wallet with withdrawable cash.

Updated 30 Sept 2026·View as Markdown

Unlike concept-only guides, this page includes a copy-paste workflow you can run today with CSPriceAPI + your inventory export.

Three totals every report needs

TotalDefinitionPrimary sources
Cash listing valueWhat you could list for on cash markets todayMedian price across YouPin, BUFF, Skinport, CSFloat, …
Sell-now valueWhat buyers bid right now (instant exit)YouPin buyorder book (the only buy-order source)
Conservative valueLiquidity-adjusted — thin items move toward bidsLower of listing median and bid; flag unknowns

Keep Steam Community Market in a separate column. Steam Wallet is not bank cash (Steam guide).

Step 1 — Build your asset list

Your inventory source (Steam API, CSFloat inventory export, spreadsheet) should yield:

market_hash_name, quantity, phase (optional), asset_id (optional)

Rules:

  • Aggregate identical commodity skins (10× Redline FT = one row, qty 10).
  • Split Doppler/Gamma by phase — Ruby and Phase 4 are different rows.
  • Do not fuzzy-match names. Unknown strings go to an exceptions table.

CSPriceAPI does not fetch Steam inventories for you — supply the names; the API supplies prices.

Step 2 — Batch price requests (100 items max)

curl -s -X POST "https://api.cspriceapi.com/v1/prices/latest" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      "AK-47 | Redline (Field-Tested)",
      "★ Karambit | Doppler (Factory New) (Ruby)"
    ],
    "markets": ["youpin", "buff163", "skinport", "csfloat"]
  }'

Steam is not part of /v1/prices/latest; pull the separate Steam column from GET /v1/steam.

For each (market_hash_name, phase):

  1. Collect non-null price (YouPin: price_rmb) from cash markets.
  2. Compute listing value = median of cash-market asks (or trimmed mean dropping outliers).
  3. Fetch sell-now from YouPin buyorder for CN items:
curl -s "https://api.cspriceapi.com/v1/prices/youpin/buyorder" \
  -H "x-api-key: YOUR_API_KEY"
  1. line_value = unit_value × quantity

Step 3 — Minimal Python sketch

import statistics
import requests

API = "https://api.cspriceapi.com"
KEY = "YOUR_API_KEY"
HEADERS = {"x-api-key": KEY}

CASH_MARKETS = ("youpin", "buff163", "skinport", "skinbaron", "csfloat", "dmarket")

def price_batch(names: list[str]) -> dict:
    r = requests.post(
        f"{API}/v1/prices/latest",
        headers=HEADERS,
        json={"items": names, "markets": CASH_MARKETS},
        timeout=60,
    )
    r.raise_for_status()
    return r.json()

def listing_median(resp: dict, name: str) -> float | None:
    # resp["items"] is keyed by market_hash_name; Doppler names carry the phase suffix
    item = resp.get("items", {}).get(name)
    if not item:
        return None
    prices = []
    for market in CASH_MARKETS:
        row = item.get(market)
        if not row:
            continue
        p = row.get("price") or row.get("price_rmb")  # decimal strings, native currency
        if p is not None:
            prices.append(float(p))  # convert to one currency before the median
    return statistics.median(prices) if prices else None

# inventory = [{"name": "...", "qty": 1, "phase": None}, ...]

Extend with: FX conversion (CNY→USD/EUR), fee tables, and buyorder join.

Step 4 — Liquidity gates

SignalAction
count >= 20 on ≥2 marketsFull listing median
count 1–5 everywhereMove toward sell-now bid; lower confidence
No price in 24hMark unpriced — do not use zero
Doppler phase missingDo not fall back to base Doppler average

Step 5 — Validate with sales (optional)

Listing value alone overstates items that never trade. Spot-check high-value rows:

curl -s "https://api.cspriceapi.com/v1/market-sales/search?market_hash_name=★%20Karambit%20%7C%20Doppler%20(Factory%20New)" \
  -H "x-api-key: YOUR_API_KEY"

See sales data product for bulk exports.

YouPin-first valuation (market reality)

YouPin898 is one of the main Chinese CS2 marketplaces. Even if you never buy on YouPin, its prices anchor:

  • CN wholesale discovery
  • What Western markets mean when they say "below Buff"
  • Collector item reference for Doppler phases

Start valuation from YouPin + BUFF, then sanity-check Western retail (Skinport, CSFloat).

No-code portfolio check

  • Browse Skins — search owned items, multi-market columns
  • Chrome extension — compare while viewing listings
  • Manual high-tier: cross-check recent sales (float, pattern, stickers) on the Market Hub item page for pattern/float crafts

Snapshot schema (store every run)

valuation_id, run_at
market_hash_name, phase, quantity
listing_unit, sell_now_unit, conservative_unit
sources_json, confidence, unpriced_reason

Append snapshots — do not overwrite — so users see market moves vs methodology changes.

Every endpoint, every market

Try the API free for 2 days

A test key gives access to listing prices, buy orders, history and sales data. Paid plans start at $50/month.

Get a test key on Discord

Or read the quickstart and pricing.