Skip to main content
GET/v2/prices/latestENTERPRISE

批量最新价格

一次调用获取某款游戏全部目录饰品的最新价格:每件饰品的各市场在售价与求购价,以及最优在售价与最优求购价,结构与数值均与 /v2/pricing/:marketHashName 的默认全市场视图一致。每 10 分钟重建一次,以 gzip 压缩返回。仅限 Enterprise 套餐。可作为 /v1/items/all 的批量替代。价格为整数美分。

一次请求返回该游戏中所有具备可用报价的饰品:items[] 按 canonicalItemId 排序,itemCount 位于封装末尾。每件饰品携带的 markets[](在售价)、buyOrders[](求购价)、bestAsk 与 bestBid,与 /v2/pricing/:marketHashName 默认全市场视图中的相同,因此快照中的一行与构建快照时单件接口返回的结果一致。与单件接口一样,bestBid 仅统计可现金变现的市场。bestAsk 与 bestBid 都可能为 null,其中缺少 bestBid 的情况很常见,请对两者都做 null 检查。单件接口会返回 404(没有可用报价)的饰品不会出现在快照中,而不是以空行列出。

快照每 10 分钟重建一次。generatedAt 是构建开始的时间,快照中的每条报价都在此时间或之后读取。每条报价的 isStale 在构建快照时判定。

高效轮询:发送 Accept-Encoding: gzip。这样响应体以压缩形式返回,体积约为未压缩的十分之一(CS2 目前约 7 MB,未压缩约 75 MB),且 gzip 下载从不受限;未压缩下载同时只允许少量进行,可能返回 503。保存每次 200 响应的 ETag,并以 If-None-Match 发回:在下一次快照生成之前(每 10 分钟重建一次),你会收到无响应体的 304。响应携带 Cache-Control: private, max-age=60、Vary: Accept-Encoding 与 Last-Modified(即快照的 generatedAt)。建议每 1 到 10 分钟轮询一次,并同时使用 gzip 与 If-None-Match;新快照每 10 分钟生成一次。配额:每个通过套餐校验的请求都计入每分钟限额(套餐有月度上限时也计入月度限额),304 与 503 也不例外;401 与套餐导致的 403 不计入。

游戏:请传入 game=cs2。该接口也接受 game=rust,但在启用 Rust 之前会返回 503。见游戏:CS2 与 Rust。

参数

gamestring必填
查询参数。cs2 或 rust;缺失或为其他值时返回 400。在该接口启用 Rust 之前,rust 返回 503。
Accept-Encodingstring可选
请求头。请发送 gzip。响应体以压缩形式返回,体积约为未压缩时的十分之一(CS2 目前约 7 MB,未压缩约 75 MB),且压缩下载从不受限。未压缩下载同时只允许少量进行,可能返回 503。
If-None-Matchstring可选
请求头。上次下载得到的 ETag;在下一次快照(每 10 分钟重建一次)之前返回无响应体的 304。

响应字段

LatestPricesResponse某款游戏中所有具备可用报价的饰品,打包为一份快照。
generatedAtstring (date-time)
快照构建开始的时间。快照中的每条报价都在此时间或之后读取。同时以 Last-Modified 返回。
gamestring
cs2 或 rust,与请求一致。
currencystring
恒为 USD:所有价格字段的币种。
至少有一条可用报价的全部目录饰品,按 canonicalItemId 排序。
itemCountinteger
items 中的条目数。

嵌套与共享结构链接到 API 对象 参考页。

错误

400game 缺失,或不是 cs2 / rust。
401缺少 Authorization 头、认证方案不支持,或密钥未知、未激活、已过期、已吊销。
403密钥有效,但套餐不含批量价格(仅限 Enterprise),或订阅未激活/已过期。
429超出速率限制;见 Retry-After 与 X-RateLimit-* 响应头。配额按账号合并计算,所有密钥共享。
503没有可用的新鲜快照(尚未生成,或最新快照已超过 25 分钟),Rust 尚未启用,或同时进行的未压缩下载过多。响应附带 Retry-After: 60:请在该时间后重试,最好使用 Accept-Encoding: gzip。
export SKINPRICER_API_KEY="sp_live_•••"

# --compressed asks for gzip and unpacks it. etag.txt keeps the last ETag:
# until the next snapshot (every 10 minutes) the API answers 304 and
# prices-cs2.json stays as it is. Needs curl 7.68 or newer.
curl -G "https://pricing.skinpricer.com/v2/prices/latest" \
  --data-urlencode "game=cs2" \
  -H "Authorization: ApiKey $SKINPRICER_API_KEY" \
  --compressed \
  --etag-compare etag.txt \
  --etag-save etag.txt \
  -o prices-cs2.json
// No SDK helper for this endpoint yet, so call it directly.
// Poll every 1 to 10 minutes; a new snapshot lands every 10.
let etag: string | null = null;

async function pollLatestPrices() {
  const url = new URL("https://pricing.skinpricer.com/v2/prices/latest");
  url.searchParams.set("game", "cs2");
  const res = await fetch(url, {
    headers: {
      Authorization: `ApiKey ${process.env.SKINPRICER_API_KEY}`,
      "Accept-Encoding": "gzip", // fetch unpacks the body for you
      ...(etag ? { "If-None-Match": etag } : {}),
    },
  });
  if (res.status === 304) return null; // no new snapshot since the last poll
  if (!res.ok) throw new Error(`HTTP ${res.status}`); // 503: retry after Retry-After
  etag = res.headers.get("etag");
  return res.json();
}

const snapshot = await pollLatestPrices();
if (snapshot) console.log(snapshot.itemCount, "items, built at", snapshot.generatedAt);
import os
import requests

etag = None  # keep the last ETag between polls (every 1 to 10 minutes)


def poll_latest_prices():
    global etag
    headers = {
        "Authorization": f"ApiKey {os.environ['SKINPRICER_API_KEY']}",
        "Accept-Encoding": "gzip",  # requests unpacks the body for you
    }
    if etag:
        headers["If-None-Match"] = etag
    res = requests.get(
        "https://pricing.skinpricer.com/v2/prices/latest",
        params={"game": "cs2"},
        headers=headers,
        timeout=60,
    )
    if res.status_code == 304:
        return None  # no new snapshot since the last poll
    res.raise_for_status()  # 503: retry after the Retry-After header
    etag = res.headers.get("ETag")
    return res.json()


snapshot = poll_latest_prices()
if snapshot:
    print(snapshot["itemCount"], "items, built at", snapshot["generatedAt"])

需要认证的接口:请在你自己的客户端中携带 API 密钥调用(见代码示例)。

响应 200
{
  "generatedAt": "2026-09-28T12:00:00.000Z",
  "game": "cs2",
  "currency": "USD",
  "items": [
    {
      "name": "AK-47 | Redline (Field-Tested)",
      "canonicalItemId": "cmlofczf90qj401vsd80dskd1",
      "bestAsk": {
        "market": "buff163",
        "price": 1450,
        "updatedAt": "2026-09-28T11:58:12.000Z",
        "isStale": false
      },
      "bestBid": {
        "market": "buff163",
        "price": 1400,
        "updatedAt": "2026-09-28T11:57:40.000Z",
        "isStale": false
      },
      "markets": [
        {
          "market": "buff163",
          "price": 1450,
          "fetchedAt": "2026-09-28T11:58:12.000Z",
          "isStale": false,
          "quoteSize": 20,
          "originalPriceCents": 10150,
          "originalCurrency": "CNY"
        },
        {
          "market": "csfloat",
          "price": 1512,
          "fetchedAt": "2026-09-28T11:55:03.000Z",
          "isStale": false,
          "quoteSize": 7,
          "originalPriceCents": 1512,
          "originalCurrency": "USD"
        }
      ],
      "buyOrders": [
        {
          "market": "buff163",
          "price": 1400,
          "fetchedAt": "2026-09-28T11:57:40.000Z",
          "isStale": false,
          "quoteSize": 5,
          "totalQuantity": 44
        },
        {
          "market": "youpin",
          "price": 1385,
          "fetchedAt": "2026-09-28T11:56:20.000Z",
          "isStale": false,
          "quoteSize": 3,
          "originalPriceCents": 9695,
          "originalCurrency": "CNY",
          "totalQuantity": 31,
          "totalOrdersCount": 12,
          "orderBookComplete": true
        }
      ]
    }
  ],
  "itemCount": 1
}
响应头
X-RateLimit-Limit: <每分钟配额,由套餐决定>
X-RateLimit-Remaining: <本分钟剩余次数>
X-RateLimit-Reset: <距重置的秒数>
X-RateLimit-Remaining-Month: <本月剩余次数,仅限有月度上限的套餐>
X-Request-ID: req_xxxxxxxxxxxxxxxx

使用与许可

API 及其数据的使用受我们的服务条款(英文)约束:不得转售或再分发数据,不得用于构建竞争性服务, 不得超出套餐的速率限制;在条款允许展示数据的场景下须注明数据来源为 SkinPricer。滥用行为可能被限流或封禁。