Skip to main content
GET
Stream listings as they appear and disappear
A Server-Sent Events feed of the catalogue changing. One connection replaces any polling loop. Polling cannot answer “what is new?” cheaply — every client that tries ends up re-reading the same first page on a timer, and the answer is almost always “nothing”. It also cannot answer “what is gone?” at all: a poller only discovers an item sold by trying to buy it and failing. This endpoint pushes both. Authentication required. Send your key as Authorization: Bearer csb_pub_....

Query parameters

Filters are applied on our side, before anything is sent to you. They exist to save your bandwidth — one stream already carries the whole catalogue, so you never need several connections to cover different segments.
number
Only stream listings at or above this USD price.
number
Only stream listings at or below this USD price.
string
Only stream this category, e.g. Rifle, Knife, Gloves.
string
Only stream this rarity tier, e.g. Classified, Covert.
string
Only stream this wear bucket: Factory New, Minimal Wear, Field-Tested, Well-Worn, Battle-Scarred.
string
Exact market_hash_name (case-insensitive) — stream one specific item.
string
StatTrak™ filter. only or exclude.
string
Souvenir filter. only or exclude.
string
instant or hold. Narrows new events to one delivery bucket — a withdrawal bot subscribing with delivery=instant never sees an item it cannot ship today.gone events are never filtered: you may be holding the item from before your filter existed, and a missed removal is the ghost listing this feed exists to prevent.
string
Resume after this event id. Use only if your client cannot send the Last-Event-ID header — the header is the standard mechanism and is preferred.

Events

Listing
A listing entered the catalogue. The payload is exactly the Listing object GET /v1/listings returns, including listed_at.This fires for genuinely new inventory and for re-listings — items returning from cancelled orders, expired trade offers, or released holds. A re-listed item is new to you even though it existed before.
object
A listing left the catalogue — sold, reserved, or withdrawn. The payload is { "id": "..." }.Act on this one. Dropping items as they sell is the difference between your buy calls succeeding and your buy calls discovering the item was already gone. This is the half of the picture polling cannot give you at any frequency.
object
Your Last-Event-ID is older than the retained history, so a replay would be incomplete. Payload is { "reason": "last_event_id_expired", "detail": "..." }.Re-read GET /v1/listings?sort=newest to rebuild your view, then reconnect without Last-Event-ID. We send this rather than silently handing you a partial replay you would mistake for a complete one.

Reconnecting without gaps

Every event carries an id. Send the last id you processed back as the Last-Event-ID header on reconnect and you receive exactly what you missed — including across our deploys, which drop open connections by design. A : heartbeat comment arrives every 25 seconds. Treat a longer silence as a dead connection and reconnect; browsers’ EventSource does this and resends Last-Event-ID for you.

Limits

Three concurrent streams per API key. The connection itself is not rate-limited — once open, events flow as fast as the catalogue changes.

Example request

Example stream

Example client

EventSource cannot set an Authorization header — in a server-side runtime use an SSE client that can (or pass the key however your HTTP client allows). The snippet above shows the event handling, not the auth.

Error codes

If you are streaming, you do not need to poll /v1/listings on a timer at all — keep it for your initial catalogue load and for recovering after a resync. If you cannot hold a long-lived connection, the next best thing is GET /v1/listings with available_after, which turns each poll into a delta read.

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.

Query Parameters

min_price
number

Only stream listings at or above this USD price.

max_price
number

Only stream listings at or below this USD price.

category
string

e.g. Rifle, Knife, Gloves.

rarity
string

e.g. Classified, Covert.

wear
enum<string>

Exact wear name.

Available options:
Factory New,
Minimal Wear,
Field-Tested,
Well-Worn,
Battle-Scarred
name
string

Exact market_hash_name (case-insensitive).

stat_trak
enum<string>

Filter StatTrak™ items.

Available options:
only,
exclude
souvenir
enum<string>

Filter Souvenir items.

Available options:
only,
exclude
delivery
enum<string>

Narrow new events to one delivery bucket (instant or hold). gone events are never filtered — a missed removal is the ghost listing this feed exists to prevent.

Available options:
instant,
up_to_12h,
hold
last_event_id
string

Resume after this event id. Use only if your client cannot send the Last-Event-ID header.

min_refund_percent
number

Narrow new events to listings whose refund_percent is at least this (0-100). gone events are never filtered.

Required range: 0 <= x <= 100

Response

An open SSE stream. Stays open until you disconnect.

The response is of type string.