/ws/live channel emits only events that describe game state. No price changes, no market movement, no odds. If you want a scoreboard UI, this is your channel.
Event types on this channel
Event type | When it fires |
|---|---|
welcome | Once, on connect. First frame. |
snapshot | Once, right after welcome. Full state of every live game as a baseline. |
new_game | First time we see a given game_id (e.g., matchday starts) |
score_change | Score, period, or clock changes |
status_change | Game transitions unplayed → live → final |
game_final | Game ends (paired with the matching status_change) |
price_change events are delivered on this channel.
Real captured sample
This is the exact wire content fromwss://books.polynode.dev/ws/live during a live Copa Libertadores match (Estudiantes 2-1 Cusco, 94’ stoppage):
10035-20332-2026-04-14) is polynode-unmapped (pn_slug: null) — a Nacional @ Tolima fixture whose teams aren’t in polynode’s roster. The second is lib-gar-est-2026-04-14 (Estudiantes vs Cusco FC, currently 2-1).
Why is this channel quiet sometimes?
During calm windows — no goals, no score changes, no clock rollovers, no games going live — this channel emits nothing exceptwelcome and occasional heartbeat pings. That’s correct. It’s a state-change channel, not a heartbeat channel.
If you’re building an idle-tolerance UI: show connection status from the TCP/WebSocket state, not from “did we get a message in the last N seconds.” A live /ws/live stream with zero messages for 5 minutes just means no goals were scored.
Filtering
Server-side filtering is not yet implemented in v1. All subscribers to/ws/live receive all live events for all mapped sports and leagues. Filter client-side on pn_league_code, sport_category (via a lookup from pn_league_code), or pn_slug.
Example: Python client
Example: Node.js client
See also
- Event Reference — full schema for
score_change,status_change,game_final,new_game - Odds Channel — for price events alongside live state

