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.
curl --request GET \
--url https://csboard.com/v1/listings/depth \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/listings/depth"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/listings/depth', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/listings/depth",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/listings/depth"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/listings/depth")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/listings/depth")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"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"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}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= 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 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, case-insensitive. One item per call.doppler_phase carries it: Phase 1–Phase 4, Ruby, Sapphire, Black Pearl, Emerald. Passed upstream and applied to the answer.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.0–1, inclusive. Passed upstream, so a narrow window reaches lots the cheapest-first book alone would not.0–1, inclusive. Passed upstream.next_cursor. Pages are always cheapest-first.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). |
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 withGET /v1/listings?name=, seed from the price snapshot and follow the stream for new and gone. Call depth on the item you are about to buy.
Example
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_..."
{
"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"
}
{ "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.Authorizations
Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.
Query Parameters
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.
730, 570, 252490 Exact Steam market_hash_name (case-insensitive). Required.
256Doppler / Gamma Doppler phase as doppler_phase carries it: Phase 1–Phase 4, Ruby, Sapphire, Black Pearl, Emerald. Passed upstream and applied to the answer.
32Delivery bucket, as on /v1/listings. hold skips the upstream refresh — held rows only ever come from the shelf.
instant, up_to_12h, hold Lower float bound, 0–1, inclusive. Passed upstream.
0 <= x <= 1Upper float bound, 0–1, inclusive. Passed upstream.
0 <= x <= 1Only lots at or above this USD price.
Only lots at or below this USD price.
Keyset cursor from next_cursor. Pages are always cheapest-first.
1–200. Default 100.
1 <= x <= 200Response
The item’s book, cheapest first.
curl --request GET \
--url https://csboard.com/v1/listings/depth \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/listings/depth"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/listings/depth', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/listings/depth",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/listings/depth"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/listings/depth")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/listings/depth")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"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"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}