GET /v1/listings/stream — Live Feed of New and Sold Listings
Subscribe to CS2 listings the moment they appear and the moment they sell, over Server-Sent Events. Replaces polling, and tells you when items disappear.
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.Rifle, Knife, Gloves.Classified, Covert.Factory New, Minimal Wear, Field-Tested, Well-Worn, Battle-Scarred.market_hash_name (case-insensitive) — stream one specific item.only or exclude.only or exclude.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.Last-Event-ID header — the header is the standard mechanism and is preferred.Events
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.{ "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.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 anid. 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
Authorizations
Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.
Query Parameters
Only stream listings at or above this USD price.
Only stream listings at or below this USD price.
e.g. Rifle, Knife, Gloves.
e.g. Classified, Covert.
Exact wear name.
Factory New, Minimal Wear, Field-Tested, Well-Worn, Battle-Scarred Exact market_hash_name (case-insensitive).
Filter StatTrak™ items.
only, exclude Filter Souvenir items.
only, exclude 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.
instant, up_to_12h, hold Resume after this event id. Use only if your client cannot send the Last-Event-ID header.
Narrow new events to listings whose refund_percent is at least this (0-100). gone events are never filtered.
0 <= x <= 100Response
An open SSE stream. Stays open until you disconnect.
The response is of type string.