New dedicated Steam Community Market endpoints are available! - full historical sale data and full-depth bid/ask orderbook. See docs.

POST /v1/archive/history

Returns comprehensive archive price data from BUFF, Youpin, and C5Game from 2023 onwards. Use this endpoint for long-term price history.

The aggregate source additionally includes both hourly_volume - the approximate number of sales within that hour - and total_supply - the approximate cumulative supply of that item. Archive history updates once or twice per day. Max 100 items per request.

Access#

Requires a Scale or Enterprise API key.

Supported intervals#

IntervalBucket
1hHourly archive buckets
1dDaily archive buckets

Supported sources#

SourceFields
aggregateask, bid, ask_volume, bid_volume, hourly_volume, total_supply
buffask, bid, ask_volume, bid_volume
youpinask, bid, ask_volume, bid_volume
c5gameask, bid, ask_volume, bid_volume

Default source selection: aggregate.

Request#

POSTapi.cs2.sh/v1/archive/history
curl -X POST https://api.cs2.sh/v1/archive/history \
  -H "Authorization: Bearer <<YOUR_API_KEY>>" \
  -H "Accept-Encoding: gzip" --compressed \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    "AK-47 | Redline (Field-Tested)"
  ],
  "start": "2025-01-01",
  "end": "2026-01-08",
  "sources": [
    "aggregate",
    "buff"
  ],
  "interval": "1d"
}'

Parameters#

FieldTypeRequiredDescription
itemsstring[]YesList of market_hash_name values (max 100)
startstringYesStart date (YYYY-MM-DD or RFC3339)
endstringNoEnd date (YYYY-MM-DD or RFC3339). Default now.
sourcesstring[]NoFilter to specific sources. Default: aggregate only.
intervalstringNoDefault: 1d. Allowed: 1h, 1d. Aggregation interval

Response#

json
{
  "response_time": "2026-02-28T18:37:17.686139854Z",
  "currency": "USD",
  "start": "2025-11-16T00:00:00Z",
  "end": "2026-02-14T00:00:00Z",
  "interval": "1d",
  "items": {
    "AWP | Asiimov (Field-Tested)": {
      "market_hash_name": "AWP | Asiimov (Field-Tested)",
      "count": 90,
      "data": [
        {
          "bucket": "2025-11-16T00:00:00Z",
          "aggregate": {
            "time": "2025-11-16T23:59:04Z",
            "ask": 113.78,
            "ask_volume": 5470,
            "bid": 112.26,
            "bid_volume": 243,
            "hourly_volume": 5,
            "total_supply": 100799,
            "sample_count": 24
          },
          "buff": {
            "time": "2025-11-16T23:59:04Z",
            "ask": 114.09,
            "ask_volume": 2104,
            "bid": 111.13,
            "bid_volume": 109,
            "sample_count": 24
          },
          "youpin": {
            "time": "2025-11-16T23:59:04Z",
            "ask": 113.95,
            "ask_volume": 2189,
            "bid": 112.26,
            "bid_volume": 72,
            "sample_count": 24
          },
          "c5game": {
            "time": "2025-11-16T23:59:03Z",
            "ask": 113.78,
            "ask_volume": 535,
            "bid": 198.6,
            "bid_volume": 62,
            "sample_count": 24
          }
        }
      ]
    }
  }
}

Returns a ArchiveHistoryResponse object. See Objects for the full shape.

Response fields#

Each item holds count and a data[] array of buckets. Each bucket has a bucket boundary plus per-platform objects (aggregate, buff, youpin, c5game) carrying last-observed ask/bid, ask_volume/bid_volume, time, and sample_count. hourly_volume and total_supply populate only on the aggregate platform.

  • bucket is present on every archive bucket.
  • Per-platform objects appear only when that platform has data in the bucket.
  • Valid requested items with no archive data return not_in_archive.

Full schemas: ArchiveHistoryItem, ArchiveHistoryBucket, ArchiveHistoryPlatformData.

Errors#

StatusWhen
400 validation_errorThe request body or query failed validation (e.g. bad JSON, missing items/start, over 100 items, or a bad interval or date range).
404 not_foundNo requested valid item has archive data.
401 / 403Missing key, invalid key, or plan access.
429Rate-limited.
5xxServer-side issue.

When some items resolve and others don't, the request still returns 200 with the resolved items plus an errors[] array – each entry is an ItemError with a code of unknown_item, invalid_format, or not_in_archive.