How to Get Steam Listing Price History for CS2
Updated
cs2.sh's
POST /v1/prices/historywithsources: ["steam"]returns OHLC candles for the Steam Community Market's lowest sell listing and highest buy order, with active order counts, from December 24, 2025.
Steam shows a price graph on every Community Market item page, but that graph is completed sales, not listings. These are two different series and they answer two different questions. This one tracks the live order book; the graph on the page is POST /v1/archive/steam.
What cs2.sh provides for Steam listing history
| Property | Value |
|---|---|
| Endpoint | POST /v1/prices/history with sources: ["steam"] |
| Coverage | From December 24, 2025 |
| Intervals | 5m, 30m, 1h, 1d |
| Fields | ask and bid OHLC, ask_volume, bid_volume, sample_count |
| Items per request | 100 |
| Variants | Not supported on any Steam endpoint |
| Access | Requires a Scale or Enterprise API key |
Steam publishes both order counts, so unlike CSFloat and Skinport, its bid candles come with bid_volume attached.
Request the series
curl -X POST https://api.cs2.sh/v1/prices/history \
-H "Authorization: Bearer <<YOUR_API_KEY>>" \
-H "Accept-Encoding: gzip" --compressed \
-H "Content-Type: application/json" \
-d '{
"items": ["USP-S | Printstream (Factory New)"],
"start": "2026-07-20",
"sources": ["steam"],
"interval": "1h"
}'| Interval | Maximum request range |
|---|---|
5m |
14 days |
30m |
90 days |
1h |
365 days |
1d |
Unlimited |
The limit applies per request. A full year of 30m candles is four stitched requests, not a rejected one.
The response shape
Each bucket carries a steam object:
{
"bucket": "2026-07-20T00:00:00Z",
"steam": {
"open_ask": 161.62,
"high_ask": 162.9,
"low_ask": 161.4,
"close_ask": 162.1,
"ask_volume": 69,
"open_bid": 155.43,
"high_bid": 155.9,
"low_bid": 155.0,
"close_bid": 155.43,
"bid_volume": 2940,
"sample_count": 11,
"open_time": "2026-07-20T00:04:22Z",
"close_time": "2026-07-20T00:54:22Z"
}
}| Field | Type | Description |
|---|---|---|
open_ask / high_ask / low_ask / close_ask |
number |
Sell-listing OHLC for the bucket. |
open_bid / high_bid / low_bid / close_bid |
number |
Buy-order OHLC for the bucket. |
ask_volume / bid_volume |
integer |
Active sell listing and buy-order counts. |
sample_count |
integer |
Observations behind the candle. |
open_time / close_time |
string (date-time) |
First and last real observations inside the bucket. |
Reading the data correctly
Keep listings and sales apart. close_ask is where the cheapest listing ended the bucket; the price in POST /v1/archive/steam is Steam's own median of what sold. They are different statistics on different populations and a chart that plots them on one unlabelled axis is misleading.
Order counts are snapshots of resting orders. ask_volume falling does not mean that many items sold: listings can be cancelled or repriced. Steam's purchase count lives in the archive endpoint as volume.
Steam values settle to Steam Wallet funds rather than cash. A Steam series placed beside BUFF or CSFloat needs an explicit conversion assumption held separately from the raw numbers.
Steam supports no variants anywhere, because the Community Market does not distinguish a Doppler phase from its base item. Requesting one returns unsupported_variant.
bucket is the aligned boundary while open_time and close_time are the real observation window, and sample_count tells you how much sat behind the candle. A one-sample bucket has identical OHLC values and should not be read as a still market.
When items and variants fail
Item-level failures arrive in errors[] beside successful results. unsupported_variant is the one to expect here, since Steam supports no variants on any endpoint. unknown_item and invalid_format cover naming problems.
Request-level failures carry error, message, and a request_id. A 403 means history is not included in your plan; a 400 covers malformed requests, more than 100 items, or a range wider than the interval allows.
Worked example: seller and buyer pressure around an event
Request 1h Steam candles across the hours either side of a case release or update, then request 1h buckets from POST /v1/archive/steam for the same window, which is available for any date from May 9, 2026.
Join on bucket. Compare close_ask against the archive price for the seller premium, and close_bid against the same price for buyer pressure. Track ask_volume and bid_volume across the window to see whether the move came with orders arriving or leaving, and keep sample_count and volume visible so thin hours are recognisable as thin.
Full request and response reference: POST /v1/prices/history. Steam sale history: POST /v1/archive/steam. History endpoints need a Scale or Enterprise key.