> ## Documentation Index
> Fetch the complete documentation index at: https://api.csboard.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GET /v1/listings/depth — One Item's Whole Book, Live

> Every lot we hold for one market_hash_name, cheapest first, after refreshing the item's book from the upstream market. For sizing a position on a specific skin: float, phase, delivery.

Every lot we hold for one `market_hash_name`, cheapest first — after asking the upstream market for the item's current book and putting it on the shelf.

[`GET /v1/listings?name=`](/api-reference/get-listings) already returns the lots we hold for a name, and the shelf is deep: per-asset stock from our Chinese supply is kept at up to 1,000 lots per item, floats filled in continuously, sold lots removed as they go. This endpoint is for the moment that is not enough — a buyer sizing a position wants the *live* ask. It refreshes the item's book upstream first, with your float window, phase and delivery mode passed through, waits for that book to land on the shelf, then answers with every source's lots for the name in the exact `Listing` shape.

Every `id` in the answer is accepted by [`POST /v1/orders`](/api-reference/post-orders) right away. The buy re-resolves the lot's price live before charging and refuses above your `max_price_usd`, so a stale cent here is a `price_moved`, never a loss.

**Authentication required.** Send your key as `Authorization: Bearer csb_pub_...`. Your negotiated discount, if any, is applied to every price here exactly as on `/v1/listings` and at checkout.

## Query parameters

**market\_hash\_name** `string` *required*

Exact Steam `market_hash_name`, case-insensitive. One item per call.

**phase** `string`

Doppler / Gamma Doppler phase as `doppler_phase` carries it: `Phase 1`–`Phase 4`, `Ruby`, `Sapphire`, `Black Pearl`, `Emerald`. Passed upstream and applied to the answer.

**delivery** `string`

`instant`, `up_to_12h` or `hold` — the same buckets every `Listing` carries. `hold` skips the upstream refresh: held rows only ever come from the shelf.

**min\_float** `number`

Lower float bound, `0`–`1`, inclusive. Passed upstream, so a narrow window reaches lots the cheapest-first book alone would not.

**max\_float** `number`

Upper float bound, `0`–`1`, inclusive. Passed upstream.

**min\_price** `number`

Only lots at or above this USD price.

**max\_price** `number`

Only lots at or below this USD price.

**cursor** `string`

Keyset cursor from `next_cursor`. Pages are always cheapest-first.

**limit** `integer`

`1`–`200`. Default `100`.

## The `refresh` object

The upstream refresh is best-effort and bounded on purpose: a per-second budget shared by every caller (the market's own ceiling is shared with our site), and a hard timeout. Past either, the call still answers — from the shelf as of its last sighting — and `refresh` tells you which it was.

| Field | Meaning |
| - | - |
| `ok` | `true` when the upstream book was fetched (or was fresh in cache) and is on the shelf. |
| `at` | When that book was taken, ISO-8601. `null` when it was not. |
| `skipped` | Why not, when `ok` is `false`: `budget` (this second's refresh budget was spent — retry in a second), `timeout` (the market did not answer in time), `unavailable` (the refresh is switched off), `delivery` (you asked for `hold`). |

Treat `refresh.ok=false` as *slightly older*, not as an error. The book you get is still every lot we hold for the name.

## Depth at scale

For a position across many items, do not loop this endpoint: read the shelf in bulk with [`GET /v1/listings?name=`](/api-reference/get-listings), seed from the [price snapshot](/api-reference/get-prices-snapshot.md) and follow the [stream](/api-reference/get-listings-stream.md) for `new` and `gone`. Call `depth` on the item you are about to buy.

## Example

```bash theme={null}
curl "https://csboard.com/v1/listings/depth?market_hash_name=AK-47%20%7C%20Redline%20(Field-Tested)&max_float=0.2&limit=50" \
  -H "Authorization: Bearer csb_pub_..."
```

```json theme={null}
{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "refresh": { "ok": true, "at": "2026-10-20T08:14:02.481Z", "skipped": null },
  "items": [
    {
      "id": "3f1c0d2e-…",
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "wear": "Field-Tested",
      "doppler_phase": null,
      "float_value": 0.1612,
      "paint_seed": 661,
      "stickers": [],
      "price_usd": 30.84,
      "delivery": "up_to_12h",
      "listed_at": "2026-10-20T07:58:11.000Z"
    }
  ],
  "next_cursor": "eyJzIjoicHJpY2VfYXNjIiwicCI6MzAuODQsImlkIjoiM2YxYzBkMmUtLi4uIn0"
}
```

Errors are `{ "code", "detail" }`: `invalid_param` for a missing or overlong name, a float outside `0`–`1` or an unknown `delivery`; `unsupported_game` for an `appId` other than `730`. CS2 only.


## OpenAPI

````yaml GET /listings/depth
openapi: 3.1.0
info:
  title: CSBoard API
  version: 1.0.0
  description: >-
    Market data over the CSBoard marketplace — live listings, floats, stickers,
    minAsk prices, FX rates — plus opt-in buying straight from your balance.
    Free to read, key-gated, built for automation.
  contact:
    name: CSBoard
    url: https://csboard.com/docs
servers:
  - url: https://csboard.com/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Status
    description: Liveness and freshness probes.
  - name: Market data
    description: Read the live catalog, prices, and FX rates.
  - name: Trading
    description: Buy listings from your CSBoard balance. Opt-in, key-gated.
  - name: Instant Sell
    description: >-
      Sell CS2, Dota 2 and Rust items from any Steam inventory to the CSBoard
      network and get paid to your balance. Invite-only.
  - name: P2P
    description: >-
      List your own CS2 skins on the CSBoard P2P market. Free — any valid key,
      no balance requirement.
  - name: Account
    description: Your balance, settled funds, and trading status.
  - name: Webhooks
    description: Register an endpoint and receive signed order updates instead of polling.
paths:
  /listings/depth:
    get:
      tags:
        - Market data
      summary: One item’s whole book, refreshed live
      description: >-
        Every lot we hold for one `market_hash_name`, cheapest first, after
        asking the upstream market for the item’s current book and putting it on
        the shelf.


        `/v1/listings?name=` already returns the lots we hold for a name. This
        endpoint is for the moment a buyer sizes a position: it refreshes the
        item’s book upstream first (your float window, phase and delivery mode
        are passed through), waits for that book to land, then answers with
        every source’s lots for the name in the exact `Listing` shape. Every
        `id` is accepted by `POST /v1/orders` right away; the buy re-resolves
        the lot’s price live before charging, so a stale cent here is a
        `price_moved`, never a loss.


        The refresh is best-effort and bounded: a per-second budget shared by
        every caller, and a hard timeout. Past either the call still answers —
        from the shelf as of its last sighting — and `refresh` says so. Treat
        `refresh.ok=false` as “slightly older”, not as an error.


        Your negotiated discount, if any, is applied to every price here exactly
        as on `/v1/listings` and at checkout. CS2 only.
      operationId: getListingsDepth
      parameters:
        - $ref: '#/components/parameters/AppId'
        - name: market_hash_name
          in: query
          description: Exact Steam `market_hash_name` (case-insensitive). Required.
          schema:
            type: string
            maxLength: 256
          required: true
        - name: phase
          in: query
          description: >-
            Doppler / Gamma Doppler phase as `doppler_phase` carries it: `Phase
            1`–`Phase 4`, `Ruby`, `Sapphire`, `Black Pearl`, `Emerald`. Passed
            upstream and applied to the answer.
          schema:
            type: string
            maxLength: 32
        - name: delivery
          in: query
          description: >-
            Delivery bucket, as on `/v1/listings`. `hold` skips the upstream
            refresh — held rows only ever come from the shelf.
          schema:
            type: string
            enum:
              - instant
              - up_to_12h
              - hold
        - name: min_float
          in: query
          description: Lower float bound, 0–1, inclusive. Passed upstream.
          schema:
            type: number
            minimum: 0
            maximum: 1
        - name: max_float
          in: query
          description: Upper float bound, 0–1, inclusive. Passed upstream.
          schema:
            type: number
            minimum: 0
            maximum: 1
        - name: min_price
          in: query
          description: Only lots at or above this USD price.
          schema:
            type: number
        - name: max_price
          in: query
          description: Only lots at or below this USD price.
          schema:
            type: number
        - name: cursor
          in: query
          description: Keyset cursor from `next_cursor`. Pages are always cheapest-first.
          schema:
            type: string
        - name: limit
          in: query
          description: 1–200. Default 100.
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 100
      responses:
        '200':
          description: The item’s book, cheapest first.
          content:
            application/json:
              schema:
                type: object
                properties:
                  market_hash_name:
                    type: string
                    description: The name you asked for.
                  refresh:
                    type: object
                    description: What the upstream refresh did before the shelf was read.
                    properties:
                      ok:
                        type: boolean
                        description: >-
                          True when the upstream book was fetched (or was fresh
                          in cache) and is on the shelf.
                      at:
                        type:
                          - string
                          - 'null'
                        format: date-time
                        description: When that book was taken. Null when it was not.
                      skipped:
                        type:
                          - string
                          - 'null'
                        enum:
                          - budget
                          - timeout
                          - unavailable
                          - delivery
                          - null
                        description: >-
                          Why not, when `ok` is false: this second’s refresh
                          budget was spent (`budget`), the market did not answer
                          in time (`timeout`), the refresh is switched off
                          (`unavailable`), or `delivery=hold` (`delivery`).
                    required:
                      - ok
                      - at
                      - skipped
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/Listing'
                  next_cursor:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Pass back as `cursor` to fetch the next page. Null on the
                      last page.
                required:
                  - market_hash_name
                  - refresh
                  - items
                  - next_cursor
              example:
                market_hash_name: AK-47 | Redline (Field-Tested)
                refresh:
                  ok: true
                  at: '2026-10-20T08:14:02.481Z'
                  skipped: null
                items:
                  - id: 3f1c0d2e-…
                    market_hash_name: AK-47 | Redline (Field-Tested)
                    wear: Field-Tested
                    doppler_phase: null
                    float_value: 0.1612
                    paint_seed: 661
                    stickers: []
                    price_usd: 30.84
                    category: Rifle
                    rarity: Classified
                    image: https://cdn.csboard.com/…
                    inspect_link: steam://rungame/730/…
                    tradable: true
                    tradable_at: null
                    delivery: up_to_12h
                    refund_percent: null
                    listed_at: '2026-10-20T07:58:11.000Z'
                next_cursor: >-
                  eyJzIjoicHJpY2VfYXNjIiwicCI6MzAuODQsImlkIjoiM2YxYzBkMmUtLi4uIn0
        '400':
          description: >-
            `market_hash_name` missing or too long, a float outside 0–1, an
            unknown `delivery`, or an `appId` other than 730
            (`unsupported_game`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    AppId:
      name: appId
      in: query
      required: false
      description: >-
        Steam appId of the game. `730` = CS2 (the default), `570` = Dota 2,
        `252490` = Rust. Omit it and the endpoint answers for CS2 exactly as
        before. An appId this key may not use answers `400 unsupported_game`,
        whose `supported_app_ids` lists the ones it may — see `GET /games`.
      schema:
        type: integer
        enum:
          - 730
          - 570
          - 252490
        default: 730
  schemas:
    Listing:
      type: object
      properties:
        id:
          type: string
          description: Stable listing id. Pass to POST /v1/orders.
        market_hash_name:
          type: string
        wear:
          type:
            - string
            - 'null'
          enum:
            - Factory New
            - Minimal Wear
            - Field-Tested
            - Well-Worn
            - Battle-Scarred
            - null
          description: Wear bucket. `null` for items without wear, and for Dota 2 / Rust.
        doppler_phase:
          type:
            - string
            - 'null'
          description: Doppler / Gamma Doppler phase, e.g. "Phase 2", "Ruby", or null.
        float_value:
          type:
            - number
            - 'null'
          description: Float value between 0 and 1. `null` when not applicable.
        paint_seed:
          type:
            - integer
            - 'null'
          description: Paint seed (pattern index). `null` when not applicable.
        stickers:
          type: array
          items:
            $ref: '#/components/schemas/Sticker'
          description: Applied stickers; `[]` when none.
        price_usd:
          type: number
          description: >-
            Authoritative asking price in USD. Equals the amount charged if you
            buy this listing.
        category:
          type:
            - string
            - 'null'
          description: Item category, e.g. `Rifle`, `Knife`, `Gloves`.
        rarity:
          type:
            - string
            - 'null'
          description: Rarity tier, e.g. `Classified`, `Covert`.
        image:
          type:
            - string
            - 'null'
          format: uri
          description: Item image URL.
        inspect_link:
          type:
            - string
            - 'null'
          description: >-
            Steam inspect link. `null` when there is none, and for Dota 2 /
            Rust.
        tradable:
          type: boolean
          description: '`false` while the item is inside a Steam trade lock.'
        tradable_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When the item leaves trade hold. Null if already tradable.
        delivery:
          type: string
          enum:
            - instant
            - up_to_12h
            - hold
          description: >-
            Delivery bucket: `instant` — bot delivery, seconds to a few minutes;
            `up_to_12h` — a human seller has to send the trade; `hold` — inside
            a Steam trade lock until `tradable_at`.
        refund_percent:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: >-
            How much of the purchase comes back if Valve reverses the Steam
            trade, 0–100. A property of the market the listing came from, not a
            support policy. `null` means we have no published figure — treat it
            as unknown, never as 100. Filter with `min_refund_percent`.
        listed_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When this item entered the catalogue. Not the same as when the row
            was created: items return to the catalogue constantly (cancelled
            orders, expired trade offers, released holds), and a re-listed item
            is new to you even though it existed before. `sort=newest` orders by
            this field, and it is the value to feed back as `available_after`.
          example: '2026-07-27T09:14:02.481Z'
      required:
        - id
        - market_hash_name
        - price_usd
        - category
        - delivery
        - stickers
        - tradable
      description: >-
        One buyable listing. Dota 2 and Rust listings (`appId` 570 / 252490)
        carry the same keys as CS2 ones; the CS2-only fields — `wear`,
        `doppler_phase`, `float_value`, `paint_seed`, `inspect_link`,
        `tradable_at`, `listed_at` — are `null` and `stickers` is `[]`.
    Error:
      type: object
      description: >-
        All errors return { code, detail }. Some carry extra fields (e.g.
        price_moved adds current_total_usd, insufficient_balance adds
        required_usd/current_usd).
      properties:
        code:
          type: string
          description: >-
            Machine-readable error code, e.g. rate_limit_exceeded,
            trading_not_enabled, price_moved.
        detail:
          type: string
          description: Human-readable explanation.
      required:
        - code
    Sticker:
      type: object
      properties:
        name:
          type:
            - string
            - 'null'
        image:
          type:
            - string
            - 'null'
          format: uri
        slot:
          type:
            - integer
            - 'null'
          minimum: 0
          maximum: 4
        wear:
          type:
            - number
            - 'null'
          description: Sticker wear 0–1, or null if unscraped.
      required:
        - name
        - image
        - slot
        - wear
  responses:
    Unauthorized:
      description: Missing or invalid API key (`missing_api_key` or `invalid_api_key`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: missing_api_key
            detail: >-
              Provide your API key via `Authorization: Bearer csb_pub_…`.
              Generate one at https://csboard.com/profile?tab=api
    RateLimited:
      description: >-
        Rate limit exceeded. Includes a Retry-After header (60 seconds on the
        per-key limits).
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limit_exceeded
            detail: Rate limit of 100 requests/min exceeded.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Send your key as a Bearer token on every request: `Authorization: Bearer
        csb_pub_...`. Generate keys in your CSBoard profile.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.