Skip to main content
The Feed API pushes item-level price and bid changes to you as they’re detected, over a Server-Sent Events (SSE) connection, so you don’t have to poll GET /prices or GET /bids on a timer.
Event cadence follows provider scrape cadence, not ticks. Each provider is re-scraped on its own interval (typically every few minutes), and an event only fires when that scrape detects a change. This is not a tick-by-tick order-book feed — expect bursts of events after each provider refresh, not a steady stream.
Delivery is fire-and-forget: there is no event history and nothing is buffered while you’re disconnected. If your connection drops, re-fetch current state from /prices or /bids before reconnecting to the feed — see Reconnecting below.

GET /feed/prices — Stream price changes

Opens an SSE stream of price changes across the providers you subscribe to. Tiers: Quant
FeedStream opens one connection per call and yields events as they arrive. Leaving the loop closes the connection. Heartbeat comments are consumed for you, so every value you receive is a real event: ready first, then prices.changed.

Query parameters

string[]
Providers to stream. Repeat the parameter to pass more than one: providers=steam&providers=csfloat. Omit to stream all providers. Uses the same provider keys as GET /prices.
integer[]
Optional exact catalog item_id filter, repeatable: item_ids=17464&item_ids=17465. Uses the same IDs as GET /prices.
string[]
Optional market_hash_name filter, repeatable: market_hash_names=AK-47%20%7C%20Redline%20(Field-Tested).
The two filters are a union — an item is streamed if either parameter names it — and their combined length is capped at 100 values. Omit both to receive changes for every item on the selected providers. See Limits.
Prefer item_ids for phased items. Doppler, Gamma Doppler, and other phased finishes all share a single market_hash_name.

Event catalog

event
The first event on every connection. Confirms the subscription.
event
Fires when a provider refresh detects one or more added, updated, or removed listings.
comment
A : ping comment line sent roughly every 20 seconds while the stream is idle, so you can detect a dead connection without waiting on a TCP timeout. This is a raw SSE comment, not a named event — most SSE clients surface it only as a no-op keepalive.

Reconnecting

The feed has no replay buffer, so a disconnect always means you may have missed changes. On every reconnect:
  1. Fetch current state from GET /prices (or /bids for the bids feed) for the providers/items you care about.
  2. Open a new feed connection.
  3. Apply feed events on top of that fresh snapshot going forward.
Don’t try to diff against your last-seen event — there’s no ordering or sequence guarantee across a reconnect, only within a single open connection.

Limits

The concurrent-connection cap is enforced per API key, not per IP or session. If you need more than 2 concurrent feed connections (for example, separate processes for prices and bids), use separate API keys or consolidate into fewer, broader-scoped connections.

Possible errors

  • 503 SERVICE_UNAVAILABLE — the feed is temporarily disabled or its backing store is unreachable. Retry with backoff.
  • 422 VALIDATION_ERRORitem_ids and market_hash_names exceed 100 values combined, an item_ids value is not an integer, or an unknown provider key was passed.
  • 429 RATE_LIMIT_FEED_CONNECTIONS_EXCEEDED — you already have the maximum concurrent feed connections open for this API key. Check the Retry-After header, close an existing connection, or wait it out.
See the error codes reference for the full list.

GET /feed/bids — Stream bid changes

Opens an SSE stream of buy-order (bid) changes across the providers you subscribe to. Where /feed/prices tracks the cheapest listing, this tracks the best standing offer to buy — use the two together to watch a spread live. Tiers: Quant
From the SDKs, use feed.stream_bids(...) (Python) or feed.streamBids({...}) (TypeScript). They take the same arguments and yield the same event shape as the price feed shown above, carrying bids.changed instead of prices.changed.

Query parameters

Identical to /feed/prices: providers, item_ids, and market_hash_names, all repeatable. item_ids and market_hash_names are a union capped at 100 values combined, and the same phased-item advice applies — prefer item_ids, since one market_hash_name covers every Doppler phase.

Event catalog

event
The first event on every connection. Same shape as the prices feed.
event
Fires when a provider refresh detects one or more added, updated, or removed buy orders.
comment
A : ping comment line roughly every 20 seconds while the stream is idle, exactly as on the prices feed.

Reconnecting

Same rule, different resync endpoint: on every reconnect, fetch current state from GET /bids for the providers and items you care about, open a new connection, and apply events on top of that snapshot. There is no replay buffer and no cross-reconnect ordering guarantee. If you run both feeds, resync both — a disconnect drops price and bid events alike, and a stale bid against a fresh ask is a spread that never existed.

Limits

The concurrent-connection cap is shared between the two feeds. Slots are counted per API key across /feed/prices and /feed/bids together, so one connection to each already uses both of your 2 slots. A third connect returns 429 until one closes or its slot expires.
Otherwise identical to the prices feed: 100 filter values combined, ~20s heartbeat. See Limits above.

Possible errors

The same three as /feed/prices503 SERVICE_UNAVAILABLE, 422 VALIDATION_ERROR, and 429 RATE_LIMIT_FEED_CONNECTIONS_EXCEEDED. See Possible errors above for what each means and how to respond.
Last modified on September 10, 2026