How to get BUFF163 prices, float buckets, and history in USD
Get BUFF163 prices, native float buckets, and price history for CS2 items in USD cents, without scraping or converting currency. Runnable API code included.
On this page
BUFF163 is one of the deepest CS2 markets in the world, and for many high-value items it is where price discovery actually happens. It is also awkward to consume from outside China: prices are quoted in yuan, and its float-range and phase segmentation is its own. If you want BUFF numbers next to the rest of the market, you have to scrape, convert, and re-bucket before you can compare anything.
SkinPricer ingests BUFF's listings, buy orders, and native float, fade, and phase buckets, and serves all of it normalized to integer USD cents alongside every other venue. There are four reads, depending on the question you are asking.
| Your question | Endpoint |
|---|---|
| What is BUFF's ask and bid for this item right now? | GET /v1/pricing/:marketHashName with markets=buff163 |
| What does BUFF charge for a specific float range, fade, or phase? | GET /v1/markets/buff163/latest |
| How has BUFF's price for this item moved? | GET /v1/pricing/:marketHashName/history/markets with markets=buff163 |
| How has one BUFF float band moved? | GET /v1/markets/buff163/history |
Step 1: read BUFF's current ask and bid#
The pricing snapshot accepts a markets filter. Restrict it to buff163 and the response carries BUFF's lowest listing in markets[], its highest buy order in buyOrders[], and the matching bestAsk, bestBid, and spreadBps. BUFF has a real buy-order book, so unlike listing-only venues the bid side is usually populated. This read is included from the Developer plan up.
export SKINPRICER_API_KEY="sp_live_•••" # from your account's API keys page
curl -s "https://pricing.skinpricer.com/v1/pricing/AK-47%20%7C%20Redline%20(Field-Tested)?markets=buff163" \
-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 snapshot = await client.pricing.get("AK-47 | Redline (Field-Tested)", {
markets: ["buff163"],
});
const ask = snapshot.markets.find((m) => m.market === "buff163");
const bid = snapshot.buyOrders?.find((m) => m.market === "buff163");
console.log("BUFF ask:", ask ? formatUsd(ask.price) : "no listings");
console.log("BUFF bid:", bid ? formatUsd(bid.price) : "no buy orders");import os
from urllib.parse import quote
import requests
name = "AK-47 | Redline (Field-Tested)"
res = requests.get(
f"https://pricing.skinpricer.com/v1/pricing/{quote(name, safe='')}",
params={"markets": "buff163"},
headers={"Authorization": f"ApiKey {os.environ['SKINPRICER_API_KEY']}"},
timeout=10,
)
res.raise_for_status()
snap = res.json()
ask, bid = snap["bestAsk"], snap["bestBid"]
print("BUFF ask:", ask and ask["price"] / 100, "BUFF bid:", bid and bid["price"] / 100)Step 2: price by BUFF's own float bands#
BUFF segments many items by float range, fade percentage, and Doppler phase, and prices each segment separately. The BUFF bucket endpoint returns those segments as buckets, each with its own askCents, bidCents, and listing counts. The float bands are BUFF's native, non-uniform ranges, for example 0.15 to 0.18, 0.18 to 0.21, and so on up to 0.27 to 0.38 for Field-Tested, not fixed 0.01 steps. Always read the exact bounds from each bucket's dimensions rather than parsing the label.
curl -s "https://pricing.skinpricer.com/v1/markets/buff163/latest?marketHashName=AK-47%20%7C%20Redline%20(Field-Tested)" \
-H "Authorization: ApiKey $SKINPRICER_API_KEY"const buff = await client.buff163.latest({
marketHashName: "AK-47 | Redline (Field-Tested)",
});
for (const item of buff.items) {
for (const bucket of item.buckets) {
const band = bucket.dimensions.float;
if (!band) continue;
console.log(
`${band.min} to ${band.max}:`,
bucket.askCents === null ? "no asks" : formatUsd(bucket.askCents),
`(${bucket.askListingCount ?? 0} listed)`,
);
}
}{
"bucketSchemaVersion": 1,
"market": "buff163",
"currency": "USD",
"asOf": "2026-06-23T09:19:23.280Z",
"items": [
{
"canonicalItemId": "cmlofa7dh08ww01yo9lrpej3e",
"marketHashName": "★ Karambit | Doppler (Factory New) - Phase 2",
"market": "buff163",
"buckets": [
{
"bucketId": "buff163:cmlofa7dh08ww01yo9lrpej3e:tag:446954:float:0-0.01",
"bucketKey": "tag:446954:float:0-0.01",
"bucketType": "attribute",
"attributeType": "tag",
"attributeTypes": ["tag", "float"],
"dimensions": {
"variant": "Phase2",
"float": { "min": 0, "max": 0.01, "minInclusive": true, "maxInclusive": false },
"fade": null,
"pattern": null,
"paintSeed": null
},
"askCents": 197795,
"bidCents": 179787,
"askListingCount": 82,
"bidOrderCount": null,
"sourceUpdatedAt": "2026-06-23T09:10:00.000Z",
"collectedAt": "2026-06-23T09:11:35.446Z"
},
{
"bucketId": "buff163:cmlofa7dh08ww01yo9lrpej3e:tag:446954:float:0.01-0.02",
"bucketKey": "tag:446954:float:0.01-0.02",
"bucketType": "attribute",
"attributeType": "tag",
"attributeTypes": ["tag", "float"],
"dimensions": {
"variant": "Phase2",
"float": { "min": 0.01, "max": 0.02, "minInclusive": true, "maxInclusive": false },
"fade": null,
"pattern": null,
"paintSeed": null
},
"askCents": 189676,
"bidCents": 179344,
"askListingCount": 66,
"bidOrderCount": null,
"sourceUpdatedAt": "2026-06-23T09:10:00.000Z",
"collectedAt": "2026-06-23T09:11:35.446Z"
}
]
}
],
"nextCursor": null,
"sourceGaps": []
}variant) with a float band.By default only float buckets are returned. Add attributes=float,fade,tag to include fade-percentage buckets and phase or pattern (tag) buckets. Called without an item, the endpoint returns a paginated snapshot of every item; follow nextCursor until it is null. The attribute buckets concept page lists BUFF's band edges for every exterior.
Step 3: pull BUFF's price history#
For the item-level series, call per-market history and filter to BUFF. You get the same buckets as the aggregate history (average, median, min, max, best ask, best bid) computed from BUFF observations only. History reads require the Pro plan.
const history = await client.history.byMarket("AK-47 | Redline (Field-Tested)", {
markets: ["buff163"],
interval: "DAY_1",
from: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000),
});
const buffSeries = history.series.find((s) => s.market === "buff163");
for (const bucket of buffSeries?.history ?? []) {
console.log(bucket.timestamp.slice(0, 10), bucket.bestAskCents, bucket.bestBidCents);
}For one float band over time, use the BUFF history endpoint. It returns the same buckets with a points[] series of open, high, low, and close asks plus the closing bid, at 10m, 1h, or 1d spacing (the default window is the last 7 days). Once you know a band's bucketId from Step 2, pass it directly so you only pay for the series you track.
const bandHistory = await client.buff163.history({
bucketId: "buff163:cmlofa7dh08ww01yo9lrpej3e:tag:446954:float:0-0.01",
granularity: "1h",
});
const points = bandHistory.items[0]?.buckets[0]?.points ?? [];
const closes = points.map((p) => p.closeAskCents).filter((c): c is number => c !== null);
console.log(`${closes.length} hourly closes, latest ${closes.at(-1) ?? "n/a"} cents`);Pitfalls when comparing BUFF with other venues#
- Bucket widths differ per market. BUFF uses its own bands; Steam, Market.CSGO, CSFloat, and DMarket use uniform 0.01 bins. Compare on
dimensions.float.minandmax, never on bucket labels. bidCentsandbidOrderCountcan benullon a bucket. That means no bid was observed for that band, not a bid of zero.- A band-level ask is the cheapest listing inside that band. The item-level ask in Step 1 is the cheapest listing overall, which is usually in the widest, highest-float band.
- BUFF's prices are what a buyer sees on BUFF. Withdrawing value from BUFF has its own costs, so a lower BUFF ask is not automatically the cheaper place to buy once you account for moving the item or the money.
When to reach for a different endpoint#
If you want the same float and phase buckets from every supported market at once, use cross-market attribute prices, covered in the float range guide. For Doppler and Gamma Doppler specifically, the phase pricing guide shows how to enumerate every phase of an item. And if you are comparing BUFF against Steam, read Steam vs cash-market prices first: the two quote in different kinds of money.
Endpoints used in this guide
Plans start at $50/month on the Developer tier. Want to try first? Ask in our Discord for a free 2-day Developer key.
Related guides
- Floats & attributesIntermediate
How to price a CS2 skin by its float range
Price a CS2 skin by its exact float: how float-range buckets work per market, how to query them, and how to spot low-float premiums. Runnable API code.
GET /v1/attribute-prices/latestGET /v1/attribute-prices/history6 min read - Floats & attributesIntermediate
How to get CS2 Doppler phase prices, from Phase 1 to Emerald
Price CS2 Doppler and Gamma Doppler by phase: Phase 1 to 4, Ruby, Sapphire, Black Pearl, and Emerald, with live buckets and history. Runnable code.
GET /v1/schema/items/:idOrNameGET /v1/nbbo6 min read - History & backtestingBeginner
How to get CS2 skin price history at any interval
Fetch CS2 skin price history in 10-minute, hourly, or daily buckets, across all markets or split per market, ready for charts, alerts, and analysis.
GET /v1/pricing/:marketHashName/historyGET /v1/pricing/:marketHashName/history/markets6 min read - Prices & quotesIntermediate
Steam Market vs cash-market prices: how to compare them correctly
Steam Market prices are wallet credit, not cash. Learn how to compare Steam and cash-market CS2 prices after fees, using execution-adjusted quotes.
GET /v1/nbboGET /v1/pricing/:marketHashName5 min read