# GET /v1/market/steam/latest

Full-depth Steam bid/ask orderbooks for every item.

Returns the latest full-depth Steam bid/ask orderbook for every tracked regular item.

The response is about 100 MB uncompressed, so `Accept-Encoding: gzip` is required. Full ladders are columnar: ask prices are sorted ascending, bid prices descending, and each value in `volumes` corresponds to the price at the same array index.

Orderbooks update about every ~5 minutes.

## Access

Available on all plans.

## Request

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

**curl**

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

data <- resp_body_json(resp)
```

## Response

```json
{
  "response_time": "2026-07-26T18:54:14.123567967Z",
  "currency": "USD",
  "as_of": "2026-07-26T18:53:53.202Z",
  "items": {
    "USP-S | Printstream (Factory New)": {
      "updated_at": "2026-07-26T18:52:21.42Z",
      "collected_at": "2026-07-26T18:52:56.46Z",
      "top": {
        "ask": 169.14,
        "ask_volume": 70,
        "bid": 155.05,
        "bid_volume": 2951
      },
      "depth": {
        "ask_levels": 2,
        "bid_levels": 2,
        "asks": {
          "prices": [
            169.14,
            169.4
          ],
          "volumes": [
            1,
            1
          ]
        },
        "bids": {
          "prices": [
            155.05,
            154.88
          ],
          "volumes": [
            1,
            1
          ]
        }
      }
    }
  }
}
```

## Response fields

[SteamOrderbookLatestResponse](/docs/objects#steamorderbooklatestresponse) fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `response_time` | `string (date-time)` | Yes | When this snapshot response was generated. |
| `currency` | `string` | Yes | Currency code (always `USD`). |
| `as_of` | `string (date-time)` | Yes | Latest `updated_at` represented anywhere in the snapshot. |
| `items` | [`Record<string, SteamOrderbookItem>`](/docs/objects#steamorderbookitem) | Yes | Regular items with current orderbook data, keyed by `market_hash_name`. |

## Orderbook data

| Field | Description |
| --- | --- |
| `items.<name>.top` | Best ask/bid prices and total Steam ask/bid order counts. |
| `items.<name>.depth` | Full columnar ladders: `asks.prices`/`asks.volumes` and `bids.prices`/`bids.volumes`. |
| `items.<name>.updated_at`, `collected_at` | Steam's update time and cs2.sh's fetch time. |
| `as_of` | Latest `updated_at` represented anywhere in the snapshot. |

- Variant items are not included.

Full schemas: [SteamOrderbookItem](/docs/objects#steamorderbookitem), [SteamOrderbookTop](/docs/objects#steamorderbooktop), [SteamOrderbookDepth](/docs/objects#steamorderbookdepth), [SteamOrderbookDepthSide](/docs/objects#steamorderbookdepthside).

### SteamOrderbookItem

Latest full-depth Steam orderbook for one regular item.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `updated_at` | `string (date-time)` | Yes | When Steam last updated this orderbook. |
| `collected_at` | `string (date-time)` | Yes | When cs2.sh collected this orderbook. |
| `top` | [SteamOrderbookTop](/docs/objects#steamorderbooktop) | Yes | Top-of-book best ask/bid for a Steam orderbook. Each field is `null` when that side is absent. |
| `depth` | [SteamOrderbookDepth](/docs/objects#steamorderbookdepth) | Yes | Full-depth Steam orderbook ladders in columnar form. |

### SteamOrderbookTop

Top-of-book best ask/bid for a Steam orderbook. Each field is `null` when that side is absent.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ask` | `number \| null` | Yes | Best sell price in USD, or `null` when absent. |
| `ask_volume` | `integer \| null` | Yes | Total Steam sell-order count, or `null` when absent. |
| `bid` | `number \| null` | Yes | Best buy-order price in USD, or `null` when absent. |
| `bid_volume` | `integer \| null` | Yes | Total Steam buy-order count, or `null` when absent. |

### SteamOrderbookDepth

Full-depth Steam orderbook ladders in columnar form.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ask_levels` | `integer` | Yes | Number of ask levels in `asks`. |
| `bid_levels` | `integer` | Yes | Number of bid levels in `bids`. |
| `asks` | [SteamOrderbookDepthSide](/docs/objects#steamorderbookdepthside) | Yes | One side of the orderbook ladder in columnar form. `prices[i]` pairs with `volumes[i]`; each `volume` is the quantity available at that exact price, not cumulative. |
| `bids` | [SteamOrderbookDepthSide](/docs/objects#steamorderbookdepthside) | Yes | One side of the orderbook ladder in columnar form. `prices[i]` pairs with `volumes[i]`; each `volume` is the quantity available at that exact price, not cumulative. |

### SteamOrderbookDepthSide

One side of the orderbook ladder in columnar form. `prices[i]` pairs with `volumes[i]`; each `volume` is the quantity available at that exact price, not cumulative.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `prices` | `number[]` | Yes | Decimal USD prices. Asks ascending, bids descending. |
| `volumes` | `integer[]` | Yes | Quantity available at each corresponding price. |

## Errors

`503 service_unavailable` means the latest orderbook snapshot is missing, stale, or empty. See [Request errors](/docs/using-the-api#request-errors) for shared errors.
