Skip to main content

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.

Updated 6 min readIntermediatecurl · TypeScript · PythonMarkdown
On this page
  1. Step 1: read BUFF's current ask and bid
  2. Step 2: price by BUFF's own float bands
  3. Step 3: pull BUFF's price history
  4. Pitfalls when comparing BUFF with other venues
  5. When to reach for a different endpoint

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 questionEndpoint
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)
Prices come back in USD cents, already converted. Divide by 100 only when you display them.

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)`,
    );
  }
}
Response 200GET /v1/markets/buff163/latest
Field reference
{
  "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": []
}
The documented response for a Doppler Phase 2 Karambit: each bucket combines the phase (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.

Node (SDK)
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.

Node (SDK)
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`);
Bucket ids are stable, so store them once and reuse them. This one is the Phase 2 Karambit's 0 to 0.01 band from the sample above.

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.min and max, never on bucket labels.
  • bidCents and bidOrderCount can be null on 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

Run this guide against live data

Plans start at $50/month on the Developer tier. Want to try first? Ask in our Discord for a free 2-day Developer key.