Skip to main content
GET
Every buyable listing in one file (gzipped NDJSON)
Every buyable listing as one gzipped NDJSON file. Each decompressed line is one Listing JSON object — the exact shape GET /v1/listings returns, with the same one-listing-per-physical-skin rule and your negotiated discount already applied. This is the way to hold a complete local copy of the shelf. Walking /v1/listings page by page works for a filtered subset; for everything, it is tens of thousands of reads per pass. Download this file once instead, then open /v1/listings/stream from the position the file hands you, and your copy stays current from there. Authentication required. Send your key as Authorization: Bearer csb_pub_.... Limit: six full downloads per hour per key. A 304 answer to a conditional request is free.

The pairing: file + stream

  1. Download the file. Keep the ETag and the X-Stream-Position response headers.
  2. Connect to /v1/listings/stream?last_event_id=<X-Stream-Position>. The stream replays everything that happened since the file was built, then goes live. Apply new as an upsert by id (a listing may already be in your copy) and gone as a delete.
  3. Re-download on your own cadence — hourly is plenty — with If-None-Match. A reprice of a listing that was already live is not a stream event; the next file carries it. Between files a stale price is refused at checkout with price_moved, never filled.
If the stream answers resync, your position has aged out of its history: download the file again and reconnect from its new X-Stream-Position.

Request headers

string
The ETag from your previous download. Unchanged → 304 Not Modified, no body, no charge against the hourly limit.
string
The Last-Modified from your previous download. Same effect as If-None-Match.

Response headers

Response body

A gzip stream. Every decompressed line is a Listing:
The file is not filtered: all three delivery buckets (instant, up_to_12h, hold) are in it. Filter on the field locally. It is rebuilt every 10 minutes while anyone is downloading it, CS2 only (appId is not read).

Example: download, then stream from the file’s position

Example: conditional re-download

304 means your file is the current one.

Responses other than 200

The price list by name — one row per market_hash_name with its cheapest ask — is a different, much smaller file: GET /v1/prices/snapshot.ndjson.gz.

Authorizations

Authorization
string
header
required

Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.

Headers

If-None-Match
string

Conditional request. Pass the ETag from a previous download to receive 304 if unchanged.

If-Modified-Since
string

Conditional request by the previous Last-Modified value.

Response

Gzipped NDJSON. Each decompressed line is one Listing JSON object.

The response is of type file.