Skip to main content
Room ID: polymarket_events_stream
Endpoint: wss://api.struct.to/ws
Rate: 0.025 credits per message
Low-latency push feed of PolymarketEvent rows — same shape that GET /polymarket/events returns. The server maintains an in-memory cache of open events only, refreshed via a slow full poll plus a fast 500ms newest-first poll, and merged live from the prediction_event_metrics and prediction_trades Kafka streams with per-timeframe block/timestamp ordering. No initial snapshot is pushed on subscribe. Clients seed local state from GET /polymarket/events and then apply deltas from this stream.
Related guide: Building a live trending feed seeds from the events list and pushes deltas through this stream.

Subscription model

Each client has up to 8 active slots per room (4 cadences × 2 modes). Re-subscribing to the same (interval_ms, mode) pair replaces the previous subscription. Unsubscribe one slot with action: "unsubscribe" plus interval_ms and mode, or clear everything with action: "unsubscribe_all".
  • Cadence (interval_ms): 500, 1000, 3000, or 10000. Each cadence is a separate flush bucket.
  • Filter mode: evaluated in-memory on every flush against rows that actually changed since the last tick. Same validation as the REST list endpoint.
  • Ids mode: filter by explicit event_slugs and/or event_ids. Max 500 ids per subscription.
Updates fire only when a cache row is dirtied by (a) a fresh Kafka metric snapshot with latest_block >= cached, (b) a confirmed trade with block >= cached, (c) a slow-poll field diff, or (d) the fast newest-first poll discovering a brand-new event. Quiet events produce zero messages.

Subscribe

Message fields

Filter fields (mode=filter)

search is a case-insensitive substring match on title (3–100 chars). All other fields follow the same validation as the REST list endpoint (timeframe, list size caps).

Example — filter mode

Example — ids mode

Unsubscribe one slot

Response

Events

events_stream_update

Server-pushed event fired only for rows that changed AND matched this subscription since the last flush tick. data contains full PolymarketEvent rows — not deltas — so clients should merge by id.

Envelope

PolymarketEvent

SimpleTimeframeMetrics

PolymarketTag

EventMarket

EventMarketOutcome

PolymarketSeries

See the Markets Stream room for the ClobReward shape — it is shared across both stream rooms.

Example

Last modified on June 8, 2026