# GET /v1/market/csfloat/orderbook/latest

每个饰品的完整 CSFloat 求购订单簿。

返回每个饰品当前的 CSFloat 求购订单。包括价格、数量和条件，例如磨损区间、paint index、已贴印花、已挂挂件/keychain 字段、挂件图案和 paint seed。

订单簿每 ~10-30 分钟更新一次，具体取决于饰品流动性，流动性越高刷新越快。

## 访问

需要 Scale 或 Enterprise API 密钥。

## 请求

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

**curl**

```bash
curl https://api.cs2.sh/v1/market/csfloat/orderbook/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/csfloat/orderbook/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/csfloat/orderbook/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/csfloat/orderbook/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/csfloat/orderbook/latest") |>
  req_headers(
    Authorization = "Bearer <<YOUR_API_KEY>>",
    `Accept-Encoding` = "gzip"
  ) |>
  req_perform()

data <- resp_body_json(resp)
```

## 响应

```json
{
  "response_time": "2026-08-23T21:59:41.701806658Z",
  "currency": "USD",
  "items": {
    "USP-S | Printstream (Factory New)": {
      "market_hash_name": "USP-S | Printstream (Factory New)",
      "updated_at": "2026-08-23T21:54:42.008Z",
      "collected_at": "2026-08-23T21:55:35.051Z",
      "top_generic_bid": 92.6,
      "orders": [
        {
          "price": 93.3,
          "quantity": 1,
          "kind": "float",
          "conditions": {
            "min_float": 0,
            "max_float": 0.04
          }
        },
        {
          "price": 93.2,
          "quantity": 1,
          "kind": "float",
          "conditions": {
            "min_float": 0,
            "max_float": 0.04
          }
        },
        {
          "price": 92.6,
          "quantity": 1,
          "kind": "float",
          "conditions": {
            "min_float": 0.03,
            "max_float": 0.04
          }
        }
      ]
    },
    "★ Karambit | Doppler (Factory New)": {
      "market_hash_name": "★ Karambit | Doppler (Factory New)",
      "updated_at": "2026-08-23T21:54:42.871Z",
      "collected_at": "2026-08-23T21:55:35.051Z",
      "top_generic_bid": null,
      "orders": [
        {
          "price": 6800,
          "quantity": 1,
          "kind": "paint_index",
          "conditions": {
            "paint_index": 415
          }
        },
        {
          "price": 6790,
          "quantity": 1,
          "kind": "paint_index",
          "conditions": {
            "paint_index": 415
          }
        }
      ],
      "variants": {
        "Phase 2": {
          "market_hash_name": "★ Karambit | Doppler (Factory New)",
          "name": "★ Karambit | Doppler (Factory New) | Phase 2",
          "display_name": "Phase 2",
          "version": "p2",
          "updated_at": "2026-08-23T21:57:12.655Z",
          "collected_at": "2026-08-23T21:57:35.153Z",
          "top_generic_bid": 1190,
          "orders": [
            {
              "price": 1650,
              "quantity": 1,
              "kind": "paint_index",
              "conditions": {
                "paint_index": 419
              }
            },
            {
              "price": 1640,
              "quantity": 1,
              "kind": "paint_index",
              "conditions": {
                "paint_index": 419
              }
            }
          ]
        },
        "Ruby": {
          "market_hash_name": "★ Karambit | Doppler (Factory New)",
          "name": "★ Karambit | Doppler (Factory New) | Ruby",
          "display_name": "Ruby",
          "version": "ruby",
          "updated_at": "2026-08-23T21:10:37.529Z",
          "collected_at": "2026-08-23T21:11:32.943Z",
          "top_generic_bid": 1190,
          "orders": [
            {
              "price": 6800,
              "quantity": 1,
              "kind": "paint_index",
              "conditions": {
                "paint_index": 415
              }
            },
            {
              "price": 6790,
              "quantity": 1,
              "kind": "paint_index",
              "conditions": {
                "paint_index": 415
              }
            }
          ]
        }
      }
    }
  }
}
```

## 响应字段

[CSFloatBuyOrdersLatestResponse](/zh-cn/docs/objects#csfloatbuyorderslatestresponse) 字段:

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `response_time` | `string (date-time)` | 是 | 生成此快照响应的时间。 |
| `currency` | `string` | 是 | 货币代码（始终为 `USD`）。 |
| `items` | [`Record<string, CSFloatBuyOrdersItem>`](/zh-cn/docs/objects#csfloatbuyordersitem) | 是 | 具有当前求购订单簿的饰品，以 `market_hash_name` 为键。 |

## 订单簿数据

| 字段 | 描述 |
| --- | --- |
| `items.<name>.orders` | 求购订单阶梯，按价格降序。每个订单都有 `kind` 和一个 `conditions` 对象（`generic` 订单为 `{}`）。 |
| `items.<name>.top_generic_bid` | 无条件订单中的最高价格；仅存在条件订单时为 `null`。 |
| `items.<name>.variants` | Doppler 和 Gamma Doppler 相位订单簿，以显示名称为键。 |
| `items.<name>.updated_at`、`collected_at` | CSFloat 的更新时间与 cs2.sh 的抓取时间。 |

- 空 `orders` 数组只会出现在已确认没有挂起求购订单的 Doppler 或 Gamma Doppler 相位上。缺失的饰品或相位订单簿表示未知或过期，不代表已确认为空。

## 求购订单条件

| `kind` | 含义 |
| --- | --- |
| `generic` | 无条件。`conditions` 为 `{}`。 |
| `paint_index` | 挂单的 paint index 必须匹配。 |
| `float` | 挂单的磨损值必须位于给定范围内。 |
| `sticker` | 挂单必须满足指定的印花要求。 |
| `keychain_pattern` | 已挂挂件的图案值必须位于给定范围内。 |
| `paint_seeds` | 挂单的 paint seed 必须是给定值之一。 |
| `keychain` | 挂单必须具有指定挂件。 |
| `mixed` | 挂单必须同时满足所有给定条件类别。 |

| `conditions` 键 | 类型 | 含义 |
| --- | --- | --- |
| `paint_index` | `integer` | 挂单的 paint index 必须等于此值。 |
| `min_float` | `number` | 挂单的磨损值必须大于或等于此值。 |
| `max_float` | `number` | 挂单的磨损值必须小于或等于此值。 |
| `stickers` | [`CSFloatStickerCondition[]`](/zh-cn/docs/objects#csfloatstickercondition) | 挂单必须满足每项印花要求。同一 `sId` 重复出现表示要求多枚该印花。 |
| `min_keychain_pattern` | `integer` | 已挂挂件的图案值必须大于或等于此值。 |
| `max_keychain_pattern` | `integer` | 已挂挂件的图案值必须小于或等于此值。 |
| `paint_seeds` | `integer[]` | 挂单的 paint seed 必须等于其中一个值。 |
| `keychains` | [`CSFloatKeychainCondition[]`](/zh-cn/docs/objects#csfloatkeychaincondition) | 挂单必须具有此数组中标识的每个挂件。 |

存在多个条件字段时，挂单必须全部满足。`mixed` 订单还可以原样包含其他 CSFloat 条件键。

印花要求：

| 字段 | 类型 | 必需 | 含义 |
| --- | --- | --- | --- |
| `sId` | `integer` | 是 | 挂单必须具有的印花的 CSFloat 数字 ID。 |
| `s` | `integer` | 否 | 必须贴有此印花的槽位，从零开始。省略时，该印花可位于任意槽位。 |

挂件要求：

| 字段 | 类型 | 必需 | 含义 |
| --- | --- | --- | --- |
| `sId` | `integer` | 是 | 挂单必须具有的挂件的 CSFloat 数字 ID。 |

完整结构：[CSFloatBuyOrdersItem](/zh-cn/docs/objects#csfloatbuyordersitem)、[CSFloatBuyOrdersVariant](/zh-cn/docs/objects#csfloatbuyordersvariant)、[CSFloatBuyOrder](/zh-cn/docs/objects#csfloatbuyorder)、[CSFloatBuyOrderConditions](/zh-cn/docs/objects#csfloatbuyorderconditions)、[CSFloatStickerCondition](/zh-cn/docs/objects#csfloatstickercondition)、[CSFloatKeychainCondition](/zh-cn/docs/objects#csfloatkeychaincondition)。

### CSFloatBuyOrdersItem

一个基础饰品的求购订单簿。当条目仅用于承载 `variants` 下的相位订单簿时，订单簿字段不出现。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `market_hash_name` | `string` | 是 | 规范化的 Steam `market_hash_name`。 |
| `updated_at` | `string (date-time)` | 否 | CSFloat 最后更新此订单簿的时间。 |
| `collected_at` | `string (date-time)` | 否 | cs2.sh 采集此订单簿的时间。 |
| `top_generic_bid` | `number \| null` | 否 | 无条件订单中的最高价格（USD）。仅存在条件订单时为 `null`。 |
| `orders` | [CSFloatBuyOrder[]](/zh-cn/docs/objects#csfloatbuyorder) | 否 | 按价格降序的订单阶梯。 |
| `variants` | [`Record<string, CSFloatBuyOrdersVariant>`](/zh-cn/docs/objects#csfloatbuyordersvariant) | 否 | 以显示名称为键的 Doppler 和 Gamma Doppler 相位订单簿。 |

### CSFloatBuyOrdersVariant

一个 Doppler 或 Gamma Doppler 相位的求购订单簿。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `market_hash_name` | `string` | 是 | 基础饰品的 `market_hash_name`。完整变体名称见 `name`。 |
| `name` | `string` | 是 | 变体的完整 `market_hash_name`，例如 `★ Karambit \| Doppler (Factory New) \| Phase 1`。 |
| `display_name` | `string` | 是 | 人类可读的变体标签（例如 `Phase 2`、`Ruby`）。 |
| `version` | `string` | 是 | 稳定变体代码。客户端代码应基于此切换。 |
| `updated_at` | `string (date-time)` | 是 | CSFloat 最后更新此订单簿的时间。 |
| `collected_at` | `string (date-time)` | 是 | cs2.sh 采集此订单簿的时间。 |
| `top_generic_bid` | `number \| null` | 是 | 无条件订单中的最高价格（USD）。仅存在条件订单时为 `null`。 |
| `orders` | [CSFloatBuyOrder[]](/zh-cn/docs/objects#csfloatbuyorder) | 是 | 按价格降序的订单阶梯。 |

### CSFloatBuyOrder

一条挂起的 CSFloat 求购订单。其条件位于 `conditions` 中。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `price` | `number` | 是 | 订单价格（USD）。 |
| `quantity` | `integer` | 否 | 该价格下求购的饰品数量。 |
| `kind` | `string` | 是 | 允许值: `generic`, `paint_index`, `float`, `sticker`, `keychain_pattern`, `paint_seeds`, `keychain`, `mixed`. `conditions` 中匹配规则的摘要。`generic` 没有规则；`mixed` 包含多类规则或 API 无法识别的上游规则。 |
| `conditions` | [CSFloatBuyOrderConditions](/zh-cn/docs/objects#csfloatbuyorderconditions) | 是 | 挂单必须满足这些规则，此求购订单才会买入。存在多条规则时必须全部满足。`generic` 订单为空。`mixed` 订单还可能原样携带 API 无法识别的 CSFloat 规则键。 |

### CSFloatBuyOrderConditions

挂单必须满足这些规则，此求购订单才会买入。存在多条规则时必须全部满足。`generic` 订单为空。`mixed` 订单还可能原样携带 API 无法识别的 CSFloat 规则键。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `paint_index` | `integer` | 否 | 挂单的 paint index 必须等于此值。 |
| `min_float` | `number` | 否 | 挂单的磨损值必须大于或等于此值。 |
| `max_float` | `number` | 否 | 挂单的磨损值必须小于或等于此值。 |
| `stickers` | [CSFloatStickerCondition[]](/zh-cn/docs/objects#csfloatstickercondition) | 否 | 挂单必须满足此数组中的每项印花要求。同一印花 ID 重复出现表示要求多枚该印花。 |
| `min_keychain_pattern` | `integer` | 否 | 已挂挂件的图案值必须大于或等于此值。 |
| `max_keychain_pattern` | `integer` | 否 | 已挂挂件的图案值必须小于或等于此值。 |
| `paint_seeds` | `integer[]` | 否 | 挂单的 paint seed 必须等于其中一个值。 |
| `keychains` | [CSFloatKeychainCondition[]](/zh-cn/docs/objects#csfloatkeychaincondition) | 否 | 挂单必须具有此数组中标识的每个挂件。 |

### CSFloatStickerCondition

挂单必须具有的一枚印花。上游 CSFloat 的其他字段会原样保留。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `sId` | `integer` | 是 | 挂单必须具有的印花的 CSFloat 数字 ID。 |
| `s` | `integer` | 否 | 必须贴有此印花的槽位，从零开始。省略时，该印花可位于任意槽位。 |

### CSFloatKeychainCondition

挂单必须具有的一个挂件。上游 CSFloat 的其他字段会原样保留。

| 字段 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `sId` | `integer` | 是 | 挂单必须具有的挂件的 CSFloat 数字 ID。 |

## 错误

`503 service_unavailable` 表示最新订单簿快照缺失、过期或为空。共享错误见[请求错误](/zh-cn/docs/using-the-api#请求错误)。
