Observed market data
Steam item price history API: daily OHLC and missing dates
Request source-specific USD observations for a market hash name. WOK returns daily open, high, low and close from values it actually recorded; gaps stay gaps.
Updated September 26, 2026
WOK APIcurl --fail-with-body --max-time 35 --get \
-H "Authorization: Bearer $WOK_API_KEY" \
--data-urlencode "game=cs2" \
--data-urlencode "name=AK-47 | Redline (Field-Tested)" \
--data-urlencode "days=30" \
--data-urlencode "source=steam_market" \
"https://woksteamapi.com/v1/price-history"Send one exact item name and source
Set WOK_API_KEY on your server and send it in the Bearer header. The name parameter is the exact Steam market_hash_name; use GET /v1/items?game=cs2&q=Redline to search the current catalog first.
Choose any of WOK's eight named game keys. Numeric AppIDs used for generic inventories do not have a price-history catalog.
Set days from 1 to 365 (default 30). Dates are UTC observation days. This is a lookback window, not a promise that every date has a row.
Filter with source=steam_market when you want one comparable series. If you omit source, points from available sources share the array; group them by source before plotting.
The request consumes one WOK quota unit. It reads saved observations; it does not scan a player's inventory or fetch missing historical dates from Steam.
What each daily point means
The JSON below is illustrative. Item name, prices and timestamps are made-up values used to show the response shape.
WOK API{
"game": "cs2",
"market_hash_name": "Example item (Field-Tested)",
"source": "steam_market",
"days": 30,
"points": [
{
"date": "2026-09-25",
"source": "steam_market",
"open_usd": 12.1,
"high_usd": 12.4,
"low_usd": 12.1,
"close_usd": 12.35,
"volume": 31,
"samples": 3,
"first_observed_at": 1790294400.0,
"last_observed_at": 1790348400.0
}
]
}| Field | Meaning |
|---|---|
date and source | UTC day and the original price source. They identify a separate series for each source. |
open_usd / close_usd | First / last WOK price observation that day. |
high_usd / low_usd | Maximum / minimum among WOK's observed values that day. These are not the market's full intraday trading extremes. |
samples | Number of distinct observations recorded for this daily source row. One sample yields equal OHLC values. |
volume | Latest volume reported with that source's observation, when available. It is not the sum of trades during the day. |
first_observed_at / last_observed_at | Unix seconds for the first and last saved observation that produced the row. |
Coverage, gaps and safe chart behavior
History starts only when WOK observed or began tracking that exact item. A current quote does not create earlier candles. WOK records selected requested and seen items under a bounded retention policy, so coverage differs by game, item and source.
If points=[], show “no observations in this window”. It does not mean the item is worthless, absent from Steam, or priced at $0. Try a current quote separately if your workflow needs today's known price.
Do not forward-fill an absent date as an actual trade or a measured WOK price. A chart may visually connect known points, but label that line as interpolation and expose the original observation dates.
Keep marketplace series separate. A Steam Market listing observation and a third-party marketplace listing can differ in fees, liquidity and update time; calculate returns only over points from the same source.
The API validates the game, item name, date window and source. Catalog validation can return HTTP 400; FastAPI query bounds such as days outside 1-365 can return HTTP 422. Key or quota errors are 401, 402 or 429. The OpenAPI contract lists the exact parameter and response schema.
Current item quotes and source selectionValue an inventory without historical guessesSteam Market observationsAll developer resources
Check price coverage and read a basket history
Before charting a source, check how many names in WOK's saved catalog have a valid quote and how old those quotes are. These counts describe WOK's observed names, not every Steam item.
WOK APIcurl --fail-with-body --get \
-H "Authorization: Bearer $WOK_API_KEY" \
--data-urlencode "game=cs2" \
--data-urlencode "source=steam_market" \
"https://woksteamapi.com/v1/prices/coverage"priced_catalog_names and catalog_coverage_pct use the saved catalog denominator. priced_observed_names uses names seen in requested inventories. quote_age_p50_seconds and quote_age_p95_seconds describe valid current saved quotes, while history_names and history_points describe retained real observations. This read is cached for five minutes and makes no marketplace request.
For a caller-supplied basket of 1 to 20 exact market names, send quantities to POST /v1/portfolio-history. The request neither verifies ownership nor scans an inventory.
WOK APIcurl --fail-with-body -X POST \
-H "Authorization: Bearer $WOK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"game":"cs2","source":"steam_market","days":30,"items":[{"name":"AK-47 | Redline (Field-Tested)","quantity":2}]}' \
"https://woksteamapi.com/v1/portfolio-history"The response has one series[] entry per UTC day. total_usd is null if any supplied item lacks an observed close for that day; missing_items names the gaps. tracking tells whether a known name was enrolled for future observations, reached capacity or is absent from the catalog. Existing quotes may create a point at their original timestamp, never a made-up earlier history. Daily closes can be observed at different times and are not a tradable portfolio quote.
For CS2 catalog discovery, GET /v1/cs2/items adds cursor-paginated base_name, exterior, variant and USD price filters. It derives metadata from the market name; rarity and collection remain unknown until a verified source exists. The integration guide shows the full request contract.