NBBO:全市场最优买卖价
单件 CS2 饰品在所有已接入市场上的 NBBO(全市场最优买卖价),附新鲜度元数据、基点价差与置信度评分。可按 id(规范 id)或 market_hash_name 查询,可选用 markets CSV 收窄范围。价格为整数美分。
NBBO 回答一个问题:同时看*所有*市场,现在买入的最优价是多少、卖出的最优价是多少?bestAsk 是全场最低在售价(并标明来源市场);bestBid 是全场最高求购价;两者之间的差就是 spreadBps,以基点计。
并非每件饰品都有双边市场。当没有任何市场存在求购单时,bestBid 与 spreadBps 返回 null——这是正常情况,不是错误(见 null 与部分数据)。confidence(0 到 1)综合了参与市场数量、数据新鲜度与跨市场一致性,可用来对单薄或过期的读数做降权。
locked(求购价 == 在售价)与 crossed(扣除卖方平台预估佣金后的求购价 > 在售价)标记跨市场报价倒挂的罕见时刻,通常是一边的报价先于另一边刷新而过期。若你的策略依赖价差,请据此过滤。
默认情况下 bestBid 只统计可现金变现的市场(Steam 钱包余额与以物易物额度类平台被排除),因此默认的跨市场求购价是真正能变现的价格。传入 markets CSV 则改为逐字采信每个被请求平台的求购价。/v1/pricing 采用同样的默认规则,因此除非传入 markets,两者一致。
spreadBps 超过 10000 基点(±100%)时会被置为 null 以剔除垃圾求购价。本接口保留交叉(负)价差并同时给出 crossed 标志;定价类读取在交叉盘口时则返回 null。若要的是可实际执行的价差而非标价价差,请读取可为 null 的 executionAdjusted 块:它在扣除手续费并按可执行性折价后对双边重新定价,并带有自己的 spreadBps 与 executableConfidence。
想要完整的按市场拆解而不只是最优两边?用 /v1/pricing/:marketHashName。想看盘口之下的挂单深度?用 /v1/nbbo/depth。
按游戏区分的版本:GET /v2/nbbo 通过必填参数 game=cs2|rust 同时服务两款游戏,响应结构、认证与配额均相同。见游戏:CS2 与 Rust。
参数
id 二选一(都缺失返回 400)。market_hash_name 二选一(都缺失返回 400)。csfloat,buff163。传入后还会覆盖默认的"仅现金变现市场"的 bestBid 过滤规则:所有被请求平台的求购价将被逐字采信。响应字段
嵌套与共享结构链接到 API 对象 参考页。
错误
market_hash_name 与 id 均未提供。Authorization 头、认证方案不支持,或密钥未知、未激活、已过期、已吊销。使用此端点的指南(英文)
- How to find the best bid and ask for a CS2 skin across every market
- Steam Market vs cash-market prices: how to compare them correctly
- How to estimate what a CS2 skin is really worth
- How to get Steam Community Market prices without scraping
- How to get Rust skin prices with an API
- How to get CS2 Doppler phase prices, from Phase 1 to Emerald
- How to read CS2 order-book depth across every marketplace
- How to build a CS2 price alert bot for Discord
export SKINPRICER_API_KEY="sp_live_•••"
curl -G "https://pricing.skinpricer.com/v1/nbbo" \
--data-urlencode "market_hash_name=AK-47 | Redline (Field-Tested)" \
-H "Authorization: ApiKey $SKINPRICER_API_KEY"// npm i @skinpricer/sdk
import { SkinpricerClient, formatUsd } from "@skinpricer/sdk";
const client = new SkinpricerClient({
apiKey: process.env.SKINPRICER_API_KEY!,
authScheme: "ApiKey",
});
const quote = await client.nbbo.get({ marketHashName: "AK-47 | Redline (Field-Tested)" });
if (quote.bestAsk && quote.bestBid) {
console.log(formatUsd(quote.bestBid.price), "bid /", formatUsd(quote.bestAsk.price), "ask");
}import os
import requests
res = requests.get(
"https://pricing.skinpricer.com/v1/nbbo",
params={"market_hash_name": "AK-47 | Redline (Field-Tested)"},
headers={"Authorization": f"ApiKey {os.environ['SKINPRICER_API_KEY']}"},
timeout=10,
)
res.raise_for_status()
print(res.json()){
"marketHashName": "Glock-18 | Water Elemental (Factory New)",
"canonicalItemId": "cmlofca920lka01yozajhixt3",
"bestAsk": {
"market": "csfloat",
"price": 4373,
"updatedAt": "2026-09-25T11:20:00.981Z",
"isStale": false
},
"bestBid": {
"market": "marketcsgo",
"price": 4486,
"updatedAt": "2026-09-25T11:20:03.070Z",
"isStale": false
},
"spreadBps": -252,
"marketCount": 16,
"freshMarketCount": 15,
"locked": false,
"crossed": false,
"confidence": 0.88,
"executionAdjusted": {
"bestAsk": {
"market": "csfloat",
"price": 4373,
"rawPrice": 4373,
"appliedFeeBps": 0,
"executability": 0.51,
"updatedAt": "2026-09-25T11:20:00.981Z",
"isStale": false,
"reasons": [
"unknown_executable_depth"
]
},
"bestBid": {
"market": "buff163",
"price": 4256,
"rawPrice": 4365,
"appliedFeeBps": 250,
"withdrawalFlatUsdCents": 0,
"executability": 0.51,
"updatedAt": "2026-09-25T11:20:11.402Z",
"isStale": false,
"reasons": [
"unknown_executable_depth"
]
},
"spreadBps": 275,
"locked": false,
"crossed": false,
"executableConfidence": 0.7,
"reasons": [
"unknown_executable_depth"
],
"feeModelVersion": "exec-fees-v1-estimated",
"calculatedAt": "2026-09-25T11:28:40.236Z"
},
"calculatedAt": "2026-09-25T11:28:40.236Z"
}