Steam item prices
Steam price API for item quotes, batches and history
Look up an exact Steam market hash name and receive the selected USD quote, source-level prices and update time. Use separate endpoints for a 200-name batch, catalog search and daily OHLC data.
GET /v1/priceBearer authenticationUpdated
WOK APIcurl --fail-with-body \
-H "Authorization: Bearer $WOK_API_KEY" \
--get "https://woksteamapi.com/v1/price" \
--data-urlencode "game=cs2" \
--data-urlencode "name=AK-47 | Redline (Field-Tested)"Select a source without an ignored parameter
Source selection differs between catalog quotes and inventory valuation. Use the parameter that the endpoint actually accepts.
GET /v1/price?game=cs2&name=... returns the server-default selected quote, available sources and the selected source's updated_at. It does not accept price_source or strict. If source is empty, there is no usable selected quote.
GET /v1/items?game=cs2&source=buff&q=Redline returns BUFF163 catalog observations. Use source=steam_market for Steam lowest-listing observations. Match market_hash_name exactly and page through next_cursor; each row has its own source timestamp.
POST /v1/prices accepts {"game":"cs2","names":["AK-47 | Redline (Field-Tested)"]} and returns a name-keyed map with price, source and sources. Unknown names are omitted, and this batch response does not include timestamps. Quota is charged per unique requested name, not just once for the HTTP envelope.
For player-owned items and source-specific totals, use inventory valuation with price_source and strict. A catalog quote does not prove that a player owns an item.
Compare WOK with SteamWebAPICheck endpoint compatibility before migrating
Choose the price endpoint for the job
The quote, batch, catalog and history methods share the same item naming contract but return different shapes.
| Endpoint | Use it for | Result |
|---|---|---|
GET /v1/price | One exact market hash name | Selected USD price, source values and update time |
POST /v1/prices | 1 to 200 names for one game | Map of matched names to price quotes |
GET /v1/items | Searching or paging through the catalog | Per-source price rows and a cursor |
GET /v1/prices/coverage | Checking saved catalog coverage and quote age | Per-game and per-source priced counts, missing counts and observation age |
GET /v1/cs2/items | Filtering saved CS2 names by base item, exterior, variant or price | Cursor page with name-derived metadata and explicit unknown rarity/collection |
GET /v1/price-history | Observed daily history for 1 to 365 days | OHLC, volume, samples and observation times |
POST /v1/portfolio-history | Viewing observed daily value for 1 to 20 supplied exact names | Per-name gaps and a total only on days with every source observation |
Read observed daily price historyPrice a public Steam inventoryRead inventory items and totalsSee every request parameterDownload OpenAPI
CS2 skin price API: which marketplaces are available?
WOK records separate USD observations for each actual source. A source name is only returned when a usable item price was observed; the number of marketplaces in a list does not guarantee coverage for your item.
| Source | What it represents | How to inspect it |
|---|---|---|
| Steam Market | Community listing floor, saved median observations and buy orders are different values. | source=steam_market for saved listing rows; read timestamps and volume. |
| Skinport | Lowest active listings for supported named games, including CS2. | source=skinport in the catalog. |
| Market.CSGO and TM | Separate third-party catalog snapshots for named games. | source=tm in the catalog. |
| BUFF163 | CS2 lowest sell listings from WOK's authorized shared Pricempire feed. | source=buff or inventory price_source=buff&strict=1. |
| Skins.com | CS2 lowest sell listings from the same shared feed, kept distinct from BUFF. | source=skins or inventory price_source=skins&strict=1. |
| Waxpeer | Lowest active listing from a public USD feed for CS2, Dota 2, Rust and TF2 where stock exists. | source=waxpeer or inventory price_source=waxpeer&strict=1. |
| 49Skins | Current CS2 listing floor converted from EUR cents to USD, excluding checkout fees. | source=49skins or inventory price_source=49skins&strict=1. |
| CS.DEALS | CS2 lowest in-stock listing from the authenticated full-price snapshot, when configured. | source=csdeals or inventory price_source=csdeals&strict=1. |
| HaloSkins | CS2 lowest in-stock P2P or bot listing from the authenticated full-market snapshot, when configured. | source=haloskins or inventory price_source=haloskins&strict=1. |
GET /v1/price returns a sources map for the exact market hash name; it does not choose a source from a query parameter. Use GET /v1/items?game=cs2&source=waxpeer for exact-source catalog rows, or an authenticated inventory request to choose an explicit valuation source. auto is unchanged. mix may use fresh BUFF, Skins.com, Waxpeer, 49Skins, CS.DEALS and HaloSkins observations after a coarse outlier check. The last two feeds require private provider credentials; an available mode does not imply current coverage. Compare each observation time before treating two listings as simultaneous.
WOK does not currently promise live CSFloat, DMarket, Youpin or every marketplace shown by another provider. Those feeds require separate access and validation; names alone are not evidence of live coverage. Market-name quotes also cannot appraise an individual float, pattern, sticker combination, fees or actual sale proceeds.
Quickstart
Use WOK from a trusted server. Keep the API key outside browser bundles and public repositories.
WOK APIcurl --fail-with-body \
-H "Authorization: Bearer $WOK_API_KEY" \
--get "https://woksteamapi.com/v1/price" \
--data-urlencode "game=cs2" \
--data-urlencode "name=AK-47 | Redline (Field-Tested)"WOK API// Node.js: keep the API key on your server.
const url = new URL("https://woksteamapi.com/v1/price");
url.search = new URLSearchParams({
game: "cs2",
name: "AK-47 | Redline (Field-Tested)"
});
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.WOK_API_KEY}` }
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const quote = await response.json();WOK APIimport os
import requests
response = requests.get(
"https://woksteamapi.com/v1/price",
headers={"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"},
params={
"game": "cs2",
"name": "AK-47 | Redline (Field-Tested)",
},
timeout=10,
)
response.raise_for_status()
quote = response.json()Response example
The values below illustrate the response shape. Field names and types match the public contract.
JSON
application/json{
"game": "cs2",
"name": "AK-47 | Redline (Field-Tested)",
"price": 12.34,
"source": "steam_avg",
"sources": {
"steam_avg": 12.34,
"steam": 12.79,
"steam_market": 12.1,
"skinport": 11.92,
"tm": 11.75
},
"updated_at": 1787572800.0
}
Response schema
Stable fields for typed clients, storage and error handling.
| Field | Type | Meaning |
|---|---|---|
game | string | Documented key: cs2, rust, tf2, dota2, pubg, sandbox, unturned or payday2. |
name | string | Exact Steam market hash name requested by the client. |
price | number | Selected cross-checked price in USD. |
source | string | Catalog source selected for price. |
sources | object | Known USD prices keyed by catalog source. |
updated_at | number | Unix timestamp of the selected source observation; 0 when no source was selected. |
Limits and error behavior
Rules clients should handle explicitly in production.
GET /v1/price requires an exact market hash name. A valid item with no catalog match returns HTTP 404. If rows exist but no price passes selection, price=0, source='' and updated_at=0 represent no usable quote, not a zero-value item.
POST /v1/prices accepts 1 through 200 names. Unknown names are omitted from its result, so compare response keys with the requested list.
Prices are USD observations, not guaranteed sale proceeds. Fees, liquidity and item-specific attributes can change the realizable value.
steam_market is WOK's lowest-listing observation from the bounded Steam Market sweep; steam/steam_avg are sale-median observations when present.
Use a market hash name, not a localized display label. The catalog can only match names observed for the selected game.
Cache and freshness semantics
How to tell whether data was reused, shared or refreshed.
GET /v1/price updated_at belongs to the selected source, not the newest timestamp from an unrelated market. Its default selection comes from the server configuration.
sources keeps the available source-level observations. A missing key means that source has no saved catalog match for the item. A saved observation is not a promise of a real-time executable quote.
GET /v1/items exposes per-source updated_at values and cursor pagination when an integration needs to inspect the catalog directly.
GET /v1/price-history returns observed daily OHLC points for 1 through 365 days; it does not synthesize days with no observations.
GET /v1/price and POST /v1/prices do not accept price_source or strict. The batch quote omits updated_at; use GET /v1/items with source and inspect each source row when selection or freshness is required.
Frequently asked questions
Direct answers about access, freshness and result semantics.
What is the difference between the price and inventory price APIs?
The Steam price API quotes catalog items by market hash name. The inventory price API reads a public player's items and calculates an estimated inventory total.
Can I request more than one item price?
Yes. POST /v1/prices accepts 1 through 200 market hash names for one game. Unknown names are omitted from the response.
Does the API return historical prices?
Yes. GET /v1/price-history returns observed daily OHLC points for a requested item, source and period from 1 through 365 days.
Can I choose BUFF163 or another exact source for a quote?
Use GET /v1/items with source=buff for CS2 BUFF163 catalog rows, or another exact saved source. GET /v1/price and POST /v1/prices do not accept price_source or strict.