# GET /v1/market/buff/latest

BUFF float ranges and fade ranges for every item.

Returns current BUFF prices for every item, split into float ranges, fade ranges, and combined float/fade ranges. Data updates every 10 minutes.

Use `bucket_id` to match the same range between this snapshot and [BUFF range history](/docs/buff-float-history).

## Access

Available on all plans.

## Range types

Each item is split into `base`, `float`, `fade`, and `float_fade` buckets.

| `bucket_type` | Meaning |
| --- | --- |
| `base` | Aggregated across the entire item or variant. |
| `float` | Float range. `float.min` and `float.max` describe the range. |
| `fade` | Fade percentage range. `fade.min` and `fade.max` describe the range. |
| `float_fade` | Combined float range and fade range. |

Items with Doppler phases or Case Hardened tiers can include `variants`; see [Using the API](/docs/using-the-api#variants). Each variant has its own ranges in `buckets[]`.

## Range boundaries

Range boundaries are inclusive on `min`, exclusive on `max`. `bucket_id` is stable across latest and history.

Float ranges vary by item, exterior, and float cap. Fade ranges use fade percentage, not float. Always use the `float` and `fade` values returned on the bucket instead of assuming fixed ranges.

## Prices and volumes

| Field | Meaning |
| --- | --- |
| `ask` | Lowest listing price in the range, USD. |
| `avg_ask` | Average listing price in the range, USD. |
| `bid` | Highest buy order in the range, USD. |
| `ask_volume` | Listings currently in the range. |
| `bid_volume` | Active buy orders for the range. |

## Request

`GET https://api.cs2.sh/v1/market/buff/latest`

**curl**

```bash
curl https://api.cs2.sh/v1/market/buff/latest \
  -H "Authorization: Bearer <<YOUR_API_KEY>>" \
  -H "Accept-Encoding: gzip" --compressed
```

**Python**

```python
import requests

headers = {
    "Authorization": "Bearer <<YOUR_API_KEY>>",
    "Accept-Encoding": "gzip",
}

response = requests.get(
    "https://api.cs2.sh/v1/market/buff/latest",
    headers=headers,
)

response.raise_for_status()
data = response.json()
```

**Node**

```javascript
const headers = {
  "Authorization": "Bearer <<YOUR_API_KEY>>",
  "Accept-Encoding": "gzip",
};

const response = await fetch("https://api.cs2.sh/v1/market/buff/latest", { headers });

if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
```

**Go**

```go
package main

import (
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    req, _ := http.NewRequest("GET", "https://api.cs2.sh/v1/market/buff/latest", nil)
    req.Header.Set("Authorization", "Bearer <<YOUR_API_KEY>>")
    req.Header.Set("Accept-Encoding", "gzip")

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
        body, _ := io.ReadAll(resp.Body)
        panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body))
    }

    var reader io.Reader = resp.Body
    if resp.Header.Get("Content-Encoding") == "gzip" {
        gz, err := gzip.NewReader(resp.Body)
        if err != nil { panic(err) }
        defer gz.Close()
        reader = gz
    }

    var data any
    if err := json.NewDecoder(reader).Decode(&data); err != nil { panic(err) }
    fmt.Printf("%#v\n", data)
}
```

**R**

```r
library(httr2)

resp <- request("https://api.cs2.sh/v1/market/buff/latest") |>
  req_headers(
    Authorization = "Bearer <<YOUR_API_KEY>>",
    `Accept-Encoding` = "gzip"
  ) |>
  req_perform()

data <- resp_body_json(resp)
```

## Response

```json
{
  "response_time": "2026-08-23T22:00:06.665088573Z",
  "currency": "USD",
  "items": {
    "AK-47 | Case Hardened (Field-Tested)": {
      "market_hash_name": "AK-47 | Case Hardened (Field-Tested)",
      "buckets": [
        {
          "bucket_id": "base",
          "bucket_type": "base",
          "updated_at": "2026-08-23T21:46:14Z",
          "collected_at": "2026-08-23T21:50:54.847Z",
          "ask": 216.49,
          "avg_ask": 217.84,
          "bid": 202.35,
          "ask_volume": 985,
          "bid_volume": 22
        },
        {
          "bucket_id": "float:0.15:0.18",
          "bucket_type": "float",
          "float": {
            "min": 0.15,
            "max": 0.18
          },
          "updated_at": "2026-08-23T21:46:14Z",
          "collected_at": "2026-08-23T21:50:54.847Z",
          "ask": 216.93,
          "avg_ask": 225.31,
          "bid": 202.35,
          "ask_volume": 219,
          "bid_volume": 7
        }
      ]
    },
    "★ M9 Bayonet | Doppler (Factory New)": {
      "market_hash_name": "★ M9 Bayonet | Doppler (Factory New)",
      "variants": {
        "Phase 2": {
          "market_hash_name": "★ M9 Bayonet | Doppler (Factory New)",
          "name": "★ M9 Bayonet | Doppler (Factory New) | Phase 2",
          "display_name": "Phase 2",
          "version": "p2",
          "buckets": [
            {
              "bucket_id": "variant:p2",
              "bucket_type": "base",
              "updated_at": "2026-08-23T21:46:30Z",
              "collected_at": "2026-08-23T21:50:54.847Z",
              "ask": 1217.82,
              "avg_ask": 1249.35,
              "bid": 1167.98,
              "ask_volume": 280,
              "bid_volume": 15
            },
            {
              "bucket_id": "variant:p2|float:0.00:0.01",
              "bucket_type": "float",
              "float": {
                "min": 0,
                "max": 0.01
              },
              "updated_at": "2026-08-23T21:46:30Z",
              "collected_at": "2026-08-23T21:50:54.847Z",
              "ask": 1294.3,
              "avg_ask": 1334.61,
              "bid": 1178.4,
              "ask_volume": 61,
              "bid_volume": 19
            }
          ]
        }
      }
    }
  }
}
```

## Response fields

[BUFFMarketFloatLatestResponse](/docs/objects#buffmarketfloatlatestresponse) fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `response_time` | `string (date-time)` | Yes | When the response was generated. |
| `currency` | `string` | Yes | Currency code (always `USD`). |
| `items` | [`Record<string, BUFFMarketFloatItem>`](/docs/objects#buffmarketfloatitem) | Yes | Map of `market_hash_name` to per-item BUFF data. |

## Range data

| Field | Description |
| --- | --- |
| `items.<name>.buckets[]` | The item's price ranges: `base`, `float`, `fade`, and `float_fade` buckets. |
| `buckets[].bucket_id`, `bucket_type` | Range identity, stable across latest and history. |
| `buckets[].float` | Float range bounds. Present on `float` and `float_fade` ranges. |
| `buckets[].fade` | Fade range bounds. Present on `fade` and `float_fade` ranges. |
| `buckets[].ask`, `avg_ask`, `bid`, `ask_volume`, `bid_volume` | Prices and volumes in the range, with `updated_at` and `collected_at`. |
| `items.<name>.variants` | Per-variant ranges in the same shape. |

Full schemas: [BUFFMarketFloatItem](/docs/objects#buffmarketfloatitem), [BUFFMarketFloatLatestBucket](/docs/objects#buffmarketfloatlatestbucket), [BUFFMarketFloatRange](/docs/objects#buffmarketfloatrange), [BUFFMarketFloatVariant](/docs/objects#buffmarketfloatvariant).

### BUFFMarketFloatItem

BUFF market float/fade data for one item.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `market_hash_name` | `string` | Yes | Canonical Steam `market_hash_name`. |
| `buckets` | [BUFFMarketFloatLatestBucket[]](/docs/objects#buffmarketfloatlatestbucket) | No | Latest BUFF buckets for the base listing. |
| `variants` | [`Record<string, BUFFMarketFloatVariant>`](/docs/objects#buffmarketfloatvariant) | No | Per-variant BUFF data for items with Doppler and Gamma Doppler phases or Case Hardened tiers. Keyed by display name (e.g. `Phase 1`, `Ruby`, `Tier 1`). |

### BUFFMarketFloatLatestBucket

One latest BUFF float or fade range bucket, identified by `bucket_type`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `bucket_id` | `string` | Yes | Stable bucket identifier (e.g. `base`, `float:0.15:0.18`, `variant:p2\|float:0.00:0.01`). |
| `bucket_type` | `string` | Yes | Allowed: `base`, `float`, `fade`, `float_fade`. Bucket stratification. - `base`: aggregated across the entire item or variant. - `float`: float-range slice (see `float`). - `fade`: fade-percentage slice (see `fade`). - `float_fade`: combined float and fade slice. |
| `float` | [BUFFMarketFloatRange](/docs/objects#buffmarketfloatrange) | No | Numeric range for a `float` or `fade` bucket. `min` is inclusive, `max` is exclusive. |
| `fade` | [BUFFMarketFloatRange](/docs/objects#buffmarketfloatrange) | No | Numeric range for a `float` or `fade` bucket. `min` is inclusive, `max` is exclusive. |
| `updated_at` | `string (date-time)` | No | When BUFF last refreshed this bucket. |
| `collected_at` | `string (date-time)` | No | When cs2.sh collected this bucket. |
| `ask` | `number` | No | Lowest ask price (USD) in this bucket. |
| `avg_ask` | `number` | No | Average ask price (USD) in the bucket. |
| `bid` | `number` | No | Highest buy-order price (USD) on BUFF. |
| `ask_volume` | `integer` | No | Number of items listed for sale in this bucket. |
| `bid_volume` | `integer` | No | Number of active buy orders against this bucket. |

### BUFFMarketFloatRange

Numeric range for a `float` or `fade` bucket. `min` is inclusive, `max` is exclusive.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `min` | `number` | No | Inclusive lower bound. |
| `max` | `number` | No | Exclusive upper bound. |

### BUFFMarketFloatVariant

BUFF latest data for a single variant of an item (Doppler or Gamma Doppler phase or Case Hardened tier).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `market_hash_name` | `string` | Yes | The base item's `market_hash_name`. The full variant name is `name`. |
| `name` | `string` | Yes | The variant's full `market_hash_name`, e.g. `★ Karambit \| Doppler (Factory New) \| Phase 1`. |
| `display_name` | `string` | Yes | Human-readable variant label (e.g. `Phase 1`, `Ruby`, `Tier 1`, `Blue Gem`). |
| `version` | `string` | Yes | Stable variant code. Switch on this in client code. |
| `buckets` | [BUFFMarketFloatLatestBucket[]](/docs/objects#buffmarketfloatlatestbucket) | Yes | Latest BUFF buckets for this variant. |

## Errors

`503 service_unavailable` means the BUFF range snapshot is not ready. See [Request errors](/docs/using-the-api#request-errors) for shared errors.
