Skip to content
API

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 authentication

Updated

curlWOK API
curl --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)"
1 quoteexact market hash name lookup
200 namesmaximum price batch
USDselected and source-level values
365 daysobserved daily OHLC history

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.

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.

EndpointUse it forResult
GET /v1/priceOne exact market hash nameSelected USD price, source values and update time
POST /v1/prices1 to 200 names for one gameMap of matched names to price quotes
GET /v1/itemsSearching or paging through the catalogPer-source price rows and a cursor
GET /v1/prices/coverageChecking saved catalog coverage and quote agePer-game and per-source priced counts, missing counts and observation age
GET /v1/cs2/itemsFiltering saved CS2 names by base item, exterior, variant or priceCursor page with name-derived metadata and explicit unknown rarity/collection
GET /v1/price-historyObserved daily history for 1 to 365 daysOHLC, volume, samples and observation times
POST /v1/portfolio-historyViewing observed daily value for 1 to 20 supplied exact namesPer-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.

SourceWhat it representsHow to inspect it
Steam MarketCommunity listing floor, saved median observations and buy orders are different values.source=steam_market for saved listing rows; read timestamps and volume.
SkinportLowest active listings for supported named games, including CS2.source=skinport in the catalog.
Market.CSGO and TMSeparate third-party catalog snapshots for named games.source=tm in the catalog.
BUFF163CS2 lowest sell listings from WOK's authorized shared Pricempire feed.source=buff or inventory price_source=buff&strict=1.
Skins.comCS2 lowest sell listings from the same shared feed, kept distinct from BUFF.source=skins or inventory price_source=skins&strict=1.
WaxpeerLowest 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.
49SkinsCurrent CS2 listing floor converted from EUR cents to USD, excluding checkout fees.source=49skins or inventory price_source=49skins&strict=1.
CS.DEALSCS2 lowest in-stock listing from the authenticated full-price snapshot, when configured.source=csdeals or inventory price_source=csdeals&strict=1.
HaloSkinsCS2 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.

curlWOK API
curl --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)"
JavaScript (Node.js)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();
PythonWOK API
import 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.

Steam price API for item quotes, batches and history response schema
FieldTypeMeaning
gamestringDocumented key: cs2, rust, tf2, dota2, pubg, sandbox, unturned or payday2.
namestringExact Steam market hash name requested by the client.
pricenumberSelected cross-checked price in USD.
sourcestringCatalog source selected for price.
sourcesobjectKnown USD prices keyed by catalog source.
updated_atnumberUnix 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.