使用 API
本页介绍 cs2.sh API 各端点共享的约定,包括认证、请求类型、响应对象、变体、时间戳、缺失数据、部分成功、错误和限制。
认证
公开 API 基础 URL 为 https://api.cs2.sh。
所有 /v1 端点都需要 Bearer API 密钥。每个 /v1 请求还必须接受 gzip 压缩,POST 请求还应包含 Content-Type: application/json:
| 请求头 | 值 | 适用于 |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | 所有 /v1 端点 |
Accept-Encoding | gzip | 所有 /v1 端点 |
Content-Type | application/json | POST 端点 |
成功的 /v1 响应是 gzip 编码的。大多数 HTTP 客户端会自动解压。错误响应以纯 JSON 返回。
在仪表盘中轮换 API 密钥会生成一个新密钥,并立即使旧密钥失效。
GET 与 POST 请求
cs2.sh 使用两种主要的请求模式:
- GET 快照:获取某个端点完整的当前数据集。
- POST 查询:请求最多 100 件指定饰品的数据,并附带日期、来源或间隔等端点特定参数。
例如,下面的请求获取完整的当前价格快照:
GET /v1/prices/latest下面的请求获取两件指定饰品的当前价格:
POST /v1/prices/latest
Content-Type: application/json
{
"items": [
"USP-S | Printstream (Factory New)",
"AK-47 | Redline (Field-Tested)"
]
}GET 快照可能很大,但很有用,因为你可以保存一次响应,之后在本地进行查询。当你需要针对一组已知饰品获得有界响应时,POST 请求更合适。历史端点也使用 POST 请求来限制响应大小。
饰品
POST 端点使用 market_hash_name 标识饰品:
{
"items": [
"USP-S | Printstream (Factory New)"
]
}GET /v1/schema 按所有端点所接受的同一 market_hash_name 返回每一件受支持的饰品。它还包含饰品元数据、市场 id、图片、外观、磨损区间和变体。
POST 端点在一次请求中最多接受 100 件饰品。
响应
大多数饰品端点返回一个以 market_hash_name 为键的 items 对象。
{
"response_time": "2026-07-26T18:54:04.041Z",
"currency": "USD",
"items": {
"USP-S | Printstream (Factory New)": {
"market_hash_name": "USP-S | Printstream (Factory New)",
"buff": {
"updated_at": "2026-07-26T18:50:53Z",
"collected_at": "2026-07-26T18:53:10.67Z",
"ask": 109.72,
"ask_volume": 463,
"bid": 106.17,
"bid_volume": 41
}
}
}
}常见的顶层字段包括:
| 字段 | 含义 |
|---|---|
response_time | API 生成响应的时间。 |
currency | 响应货币,价格数据当前仅为 USD。 |
items | 饰品名称到返回数据的映射。 |
errors | POST 端点中与成功饰品一起返回的逐饰品失败。 |
当前价格饰品对每个市场包含一个对象。历史端点使用相同的 items 映射,时间序列数据嵌套在每件饰品之内。
完整的响应 schema 见 API 对象。
变体
带有受支持的 Doppler、Gamma Doppler 或 Case Hardened 变体的饰品可以包含 variants 对象。
{
"market_hash_name": "★ Karambit | Doppler (Factory New)",
"buff": {
"ask": 1336.26,
"bid": 1281.77
},
"variants": {
"Ruby": {
"market_hash_name": "★ Karambit | Doppler (Factory New)",
"name": "★ Karambit | Doppler (Factory New) | Ruby",
"display_name": "Ruby",
"version": "ruby",
"buff": {
"ask": 7671.41,
"bid": 7287.47
},
"csfloat": {
"ask": 7590,
"bid": 7220
}
}
}
}在变体对象上:
| 字段 | 含义 |
|---|---|
market_hash_name | 基础饰品的 market hash name。 |
name | 完整的 cs2.sh 变体名称。 |
display_name | 面向人类的变体标签。 |
version | 稳定的变体代码。 |
版本代码
变体饰品支持的 version 代码:
| version 代码 | 变体系列 | 显示标签 |
|---|---|---|
p1 | Doppler / Gamma Doppler | Phase 1 |
p2 | Doppler / Gamma Doppler | Phase 2 |
p3 | Doppler / Gamma Doppler | Phase 3 |
p4 | Doppler / Gamma Doppler | Phase 4 |
ruby | Doppler | Ruby |
sapphire | Doppler | Sapphire |
blackpearl | Doppler | Black Pearl |
emerald | Gamma Doppler | Emerald |
t1 | Case Hardened | Tier 1 |
t2 | Case Hardened | Tier 2 |
t3 | Case Hardened | Tier 3 |
t4 | Case Hardened | Tier 4 |
singleblue | Case Hardened | Blue Gem |
变体的可用性取决于市场和端点。变体支持情况见数据覆盖范围,每件饰品所附带的变体见 GET /v1/schema。
时间戳
当前市场价格对象可以包含三个不同的时间戳:
| 字段 | 含义 |
|---|---|
response_time | cs2.sh 生成完整 API 响应的时间。 |
updated_at | 市场最后一次更新价格的时间。 |
collected_at | cs2.sh 采集它的时间。 |
response_time 并不表示某个市场价格的采集时间。检查新鲜度时,请使用该市场对象内部的时间戳。
刷新频率是近似值,并因市场而异。各端点和来源的预期刷新频率见数据覆盖范围。
历史响应分桶
prices/history 和 market/buff/history 返回固定的、UTC 对齐的 OHLC 分桶。分桶内的每个市场对象都包含以下观测字段:
| 字段 | 含义 |
|---|---|
bucket | UTC 对齐区间的开始时间。 |
open_time | 分桶内第一次观测的时间。 |
close_time | 分桶内最后一次观测的时间。 |
sample_count | 该分桶所代表的底层观测数量。 |
ask_volume 和 bid_volume 是分桶内最后观测到的值。
并非每个历史端点都返回 OHLC。market/steam/history 返回采样的 Steam 订单簿历史,归档端点则返回各自端点页面所记录的数据。关于 OHLC、采样和归档历史之间的区别,见数据覆盖范围。
缺失数据
缺失的价格不等于价格为零。
在当前价格的基础饰品上,市场对象可能存在,但不可用字段被设为 null:
{
"skinport": {
"updated_at": null,
"collected_at": null,
"ask": null,
"ask_volume": null
}
}变体和历史响应对象可能是稀疏的。当某个市场对该变体或区间没有数据时,该市场对象可能不存在。
某些历史端点在所请求范围内不存在数据时,会省略有效的饰品。相关端点页面记录了其精确的空数据行为。
部分成功
POST 端点会独立校验请求的饰品。一次请求可以在同一个 200 响应中返回成功的饰品和逐饰品错误。
{
"items": {
"USP-S | Printstream (Factory New)": {
"market_hash_name": "USP-S | Printstream (Factory New)"
}
},
"errors": [
{
"item": "Invalid Item Name",
"code": "unknown_item",
"message": "item not found"
}
]
}errors 中的条目仅适用于所请求的那件饰品。它不会使成功返回的饰品失效。
饰品错误码
| 代码 | 含义 |
|---|---|
unknown_item | 请求的名称与任何已知饰品都不匹配。 |
invalid_format | 提交的饰品值无效。 |
not_in_cache | 饰品有效,但在相关的当前数据集中不可用。 |
not_in_archive | 饰品有效,但在所请求的归档数据集中没有行。 |
unsupported_source | 该饰品在所请求的市场上没有对应标识。 |
unsupported_variant | 该数据集不支持所请求的变体。 |
相关端点页面记录了它可能返回哪些饰品错误码。完整对象见 ItemError。
饰品错误与请求级错误不同。
请求错误
请求级错误使用共享的 JSON 对象:
{
"error": "validation_error",
"message": "items must contain at most 100 entries",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}部分错误还包含 details 对象。
request_id 标识失败的请求,联系支持时应一并提供。
| 状态码 | 含义 |
|---|---|
400 | 请求参数缺失或无效、JSON 格式错误,或请求过大。 |
401 | API 密钥缺失、格式错误或无效。 |
403 | 请求的端点不包含在你的套餐中。 |
404 | 未知路径,或所请求的饰品在相关数据集中均无数据。 |
405 | 该端点不支持所请求的 HTTP 方法。 |
429 | 超出每秒请求限制。 |
500 | 内部服务器错误。 |
503 | 服务、数据库或所请求的快照暂时不可用。 |
504 | 请求或数据库查询超时。 |
请先修正 400、401、403、404 和 405 错误再重试。对 429 和临时性的 5xx 错误,请以有界延迟重试。
各端点页面记录了该端点特有的其他错误行为。
限制
| 限制 | 值 |
|---|---|
| 请求 | 每个用户每秒 10 个请求 |
| 每个 POST 请求的饰品数 | 100 |
| 请求体 | 1 MiB |
| 响应压缩 | /v1 必须使用 gzip |
历史端点还有按间隔划分的最大请求范围。这些记录在数据覆盖范围和相关端点页面中。
完整的 GET 快照可能很大。当你需要反复访问同一个当前数据集时,请缓存它们,并对更小的、针对指定饰品的请求使用 POST 端点。
OpenAPI
完整的 OpenAPI 3.1 规范可在 cs2.sh/openapi.zh-CN.yaml 获取。
它包含端点参考所使用的请求参数、响应 schema、枚举和示例。