# POST /v1/archive/steam

原生 Steam 社区市场成交中位价与成交量历史，自 2013 年 4 月 26 日起提供日级数据。

返回 Steam 社区市场原生历史分桶中的成交中位价和购买数量。

- 日（`1d`）分桶自 2013 年 4 月 26 日起
- 小时（`1h`）分桶自 2026 年 5 月 9 日起

这与 Steam 社区市场饰品页面价格图中显示的数据相同。每天采集约 1-4 次。不支持变体。每次请求最多 100 个饰品。

## 访问

需要 Scale 或 Enterprise API 密钥。

## 支持的间隔

| 间隔 | 最大范围 |
| --- | --- |
| `1h` | 不限 |
| `1d` | 不限 |

## 请求

`POST https://api.cs2.sh/v1/archive/steam`

**curl**

```bash
curl -X POST https://api.cs2.sh/v1/archive/steam \
  -H "Authorization: Bearer <<YOUR_API_KEY>>" \
  -H "Accept-Encoding: gzip" --compressed \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    "USP-S | Printstream (Factory New)"
  ],
  "start": "2025-01-01",
  "end": "2025-02-01",
  "interval": "1d"
}'
```

**Python**

```python
import requests

headers = {
    "Authorization": "Bearer <<YOUR_API_KEY>>",
    "Accept-Encoding": "gzip",
    "Content-Type": "application/json",
}

payload = {
    "items": ["USP-S | Printstream (Factory New)"],
    "start": "2025-01-01",
    "end": "2025-02-01",
    "interval": "1d",
}

response = requests.post(
    "https://api.cs2.sh/v1/archive/steam",
    headers=headers,
    json=payload,
)

response.raise_for_status()
data = response.json()
```

**Node**

```javascript
const headers = {
  "Authorization": "Bearer <<YOUR_API_KEY>>",
  "Accept-Encoding": "gzip",
  "Content-Type": "application/json",
};

const response = await fetch("https://api.cs2.sh/v1/archive/steam", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "items": [
      "USP-S | Printstream (Factory New)"
    ],
    "start": "2025-01-01",
    "end": "2025-02-01",
    "interval": "1d"
  }),
});

if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
```

**Go**

```go
package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    payload := map[string]any{
        "items": []any{
            "USP-S | Printstream (Factory New)",
        },
        "start": "2025-01-01",
        "end": "2025-02-01",
        "interval": "1d",
    }
    body, _ := json.Marshal(payload)
    req, _ := http.NewRequest("POST", "https://api.cs2.sh/v1/archive/steam", bytes.NewReader(body))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer <<YOUR_API_KEY>>")
    req.Header.Set("Accept-Encoding", "gzip")

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
        body, _ := io.ReadAll(resp.Body)
        panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body))
    }

    var reader io.Reader = resp.Body
    if resp.Header.Get("Content-Encoding") == "gzip" {
        gz, err := gzip.NewReader(resp.Body)
        if err != nil { panic(err) }
        defer gz.Close()
        reader = gz
    }

    var data any
    if err := json.NewDecoder(reader).Decode(&data); err != nil { panic(err) }
    fmt.Printf("%#v\n", data)
}
```

**R**

```r
library(httr2)

payload <- list(
  items = list(
    "USP-S | Printstream (Factory New)"
  ),
  start = "2025-01-01",
  end = "2025-02-01",
  interval = "1d"
)

resp <- request("https://api.cs2.sh/v1/archive/steam") |>
  req_headers(
    Authorization = "Bearer <<YOUR_API_KEY>>",
    `Accept-Encoding` = "gzip"
  ) |>
  req_body_json(payload) |>
  req_perform()

data <- resp_body_json(resp)
```

## 参数

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `items` | `string[]` | 是 | 常规 `market_hash_name` 值列表（最多 100 个）。不支持变体。 |
| `start` | `string` | 是 | 开始日期/时间（YYYY-MM-DD 或 RFC3339），包含。 |
| `end` | `string` | 否 | 结束日期/时间（YYYY-MM-DD 或 RFC3339），不含。默认现在。 |
| `interval` | `string` | 是 | 允许值: `1h`, `1d`. 原生 Steam 分桶间隔。无公开最大日期范围。 |

## 响应

```json
{
  "response_time": "2026-07-26T18:54:20.110090345Z",
  "currency": "USD",
  "start": "2025-01-01T00:00:00Z",
  "end": "2025-02-01T00:00:00Z",
  "interval": "1d",
  "items": {
    "USP-S | Printstream (Factory New)": {
      "market_hash_name": "USP-S | Printstream (Factory New)",
      "count": 31,
      "data": [
        {
          "bucket": "2025-01-01T00:00:00Z",
          "price": 150.23,
          "volume": 7
        }
      ]
    }
  }
}
```

## 响应字段

[ArchiveSteamResponse](/zh-cn/docs/objects#archivesteamresponse) 字段:

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `response_time` | `string (date-time)` | 是 | 响应生成时间。 |
| `currency` | `string` | 是 | 货币代码（始终为 `USD`）。 |
| `start` | `string (date-time)` | 是 | 规范化 UTC 起点，包含。 |
| `end` | `string (date-time)` | 是 | 规范化 UTC 终点，不含。 |
| `interval` | `string` | 是 | 允许值: `1h`, `1d`. 每个返回分桶对应的请求的原生 Steam 间隔。 |
| `items` | [`Record<string, ArchiveSteamItem>`](/zh-cn/docs/objects#archivesteamitem) | 是 | `market_hash_name` 到原生 Steam 成交历史分桶的映射。 |
| `errors` | [ItemError[]](/zh-cn/docs/objects#itemerror) | 否 | 部分成功响应中按饰品的错误列表。 |

## 分桶

| 字段 | 描述 |
| --- | --- |
| `items.<name>.count` | 有数据的分桶数。 |
| `items.<name>.data[]` | 原生 Steam 成交历史分桶。 |
| `data[].bucket` | 分桶边界。 |
| `data[].price` | Steam 的成交中位价，美元。 |
| `data[].volume` | 该分桶内的购买数量。 |

- 每个分桶上都存在 `bucket`。
- 当 Steam 的原生分桶缺少相应值时，`price` 或 `volume` 可以是 `null`。
- 不支持变体饰品。
- 没有 Steam 历史数据的有效请求饰品返回 `not_in_archive`；如果每个有效饰品都没有，则端点返回 `404 not_found`。

完整结构：[ArchiveSteamItem](/zh-cn/docs/objects#archivesteamitem)、[ArchiveSteamBucket](/zh-cn/docs/objects#archivesteambucket)。

### ArchiveSteamItem

单个常规饰品的原生 Steam 成交历史分桶。不返回变体。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `market_hash_name` | `string` | 是 | 规范化的常规 Steam market hash name。 |
| `count` | `integer` | 是 | `data` 中的分桶数量。 |
| `data` | [ArchiveSteamBucket[]](/zh-cn/docs/objects#archivesteambucket) | 是 | 按 `bucket` 升序排列的分桶。 |

### ArchiveSteamBucket

一个原生 Steam 成交历史分桶。`price` 是 Steam 成交中位价，`volume` 是 purchases 数量。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `bucket` | `string (date-time)` | 是 | 原生 Steam 分桶开始时间。 |
| `price` | `number \| null` | 是 | Steam USD 成交中位价。 |
| `volume` | `integer \| null` | 是 | Steam 报告的购买次数。 |

## 错误

`404 not_found` 表示请求中的有效常规饰品均没有 Steam 归档数据。部分结果返回 `200` 和 `errors[]`；变体请求使用 `unsupported_variant`。见[部分成功](/zh-cn/docs/using-the-api#部分成功)和[请求错误](/zh-cn/docs/using-the-api#请求错误)。
