Skip to main content
GET/v1/nbboDEVELOPER+

National Best Bid & Offer

National Best Bid & Offer across all indexed marketplaces for a single CS2 item, with freshness metadata, a basis-points spread, and a confidence score. Query by id (canonical id) or market_hash_name, optionally narrowed to a markets CSV. Prices are integer USD cents.

NBBO answers one question: across *every* market at once, what's the best price to buy at and the best to sell at? bestAsk is the lowest ask anywhere (and names its source market); bestBid is the highest bid anywhere; the gap between them is spreadBps, in basis points.

Not every item has a two-sided market. When no venue exposes a buy order, bestBid and spreadBps come back null, which is normal, not an error (see Nulls & partial data). confidence (0–1) blends how many markets contributed, how fresh they are, and how much they agree, so you can down-weight a thin or stale read.

locked (bid == ask) and crossed (bid > ask) flag the rare moments a quote inverts across markets, usually because one leg went stale a beat before the other refreshed. Filter on them if you're acting on the spread.

Want the full per-market breakdown instead of just the best two sides? Use /v1/pricing/:marketHashName. Want order-book depth beyond the top of book? Use /v1/nbbo/depth.

Parameters

market_hash_namestringoptional
Query. Exact market hash name. Provide either this OR id (400 if neither).
idstringoptional
Query. Canonical item id. Provide either this OR market_hash_name (400 if neither).
marketsstringoptional
Query. CSV of market ids to restrict the response, e.g. csfloat,buff163.

Response fields

NbboResponseBest bid + best ask across all indexed markets for one item.
marketHashNamestring
The item's Steam market hash name.
canonicalItemIdstring
SkinPricer's canonical item id.
bestAskQuotenullable
Lowest ask across markets. Null when no fresh ask exists.
bestBidQuotenullable
Highest bid across markets. Null when no market exposes a bid.
spreadBpsintegernullable
bestAsk − bestBid in basis points. Null when a side is missing.
marketCountinteger
Markets contributing a quote.
freshMarketCountinteger
Of those, how many are still fresh.
lockedboolean
True when bestBid == bestAsk (zero spread).
crossedboolean
True when bestBid > bestAsk (a fleeting inversion).
confidencenumber
0–1 confidence from coverage, freshness, and agreement.
calculatedAtstring (date-time)
When this NBBO was computed.

Nested and shared shapes link to the API Objects reference.

Response 200

{
  "marketHashName": "Glock-18 | Water Elemental (Factory New)",
  "canonicalItemId": "cmlofca920lka01yozajhixt3",
  "bestAsk": {
    "market": "csfloat",
    "price": 6500,
    "updatedAt": "2026-06-23T21:52:27.427Z",
    "isStale": false
  },
  "bestBid": {
    "market": "buff163",
    "price": 6440,
    "updatedAt": "2026-06-23T21:59:48.717Z",
    "isStale": false
  },
  "spreadBps": 93,
  "marketCount": 10,
  "freshMarketCount": 9,
  "locked": false,
  "crossed": false,
  "confidence": 0.81,
  "calculatedAt": "2026-06-23T22:07:13.395Z"
}

Errors

400Neither market_hash_name nor id supplied.
404Item not found.
401 / 403Missing, invalid, or insufficient-plan API key.
429Rate limit exceeded; see Retry-After + X-RateLimit-* headers.
5xxUpstream snapshot unavailable or a server-side issue. Retry with backoff.
curl "https://pricing.skinpricer.com/v1/nbbo" \
  -H "Authorization: ApiKey sk_live_•••••••••••"
Response headers
X-RateLimit-Limit: <per-minute, set by your plan>
X-RateLimit-Remaining: <remaining this minute>
X-RateLimit-Reset: <seconds to reset>
X-Request-ID: req_xxxxxxxxxxxxxxxx

Usage & licensing

Access to the API and its data is governed by our Terms of Service. You may not resell or redistribute the data, use it to build a competing service, or exceed your plan’s rate limits, and you must attribute SkinPricer as the source wherever the Terms permit you to display it. Abuse may be throttled or suspended.