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
| Total | Definition | Primary sources |
|---|---|---|
| Cash listing value | What you could list for on cash markets today | Median price across YouPin, BUFF, Skinport, CSFloat, … |
| Sell-now value | What buyers bid right now (instant exit) | YouPin buyorder book (the only buy-order source) |
| Conservative value | Liquidity-adjusted — thin items move toward bids | Lower 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
exceptionstable.
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):
- Collect non-null
price(YouPin:price_rmb) from cash markets. - Compute listing value = median of cash-market asks (or trimmed mean dropping outliers).
- 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"
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
| Signal | Action |
|---|---|
count >= 20 on ≥2 markets | Full listing median |
count 1–5 everywhere | Move toward sell-now bid; lower confidence |
| No price in 24h | Mark unpriced — do not use zero |
| Doppler phase missing | Do 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.