Up to 5 second edge
Settlements detected and enriched before on-chain confirmation — typically 2–5 seconds (1–2 blocks) early.
Filtered subscriptions
Subscribe by wallet, token, market slug, side, size, or event type. Only receive what you need.
Enriched events
Every event includes market title, outcome name, slug, and image. No secondary lookups needed.
Chainlink price feeds
Real-time BTC/USD prices from Chainlink Data Streams (~1/second). Subscribe with
"type": "chainlink" on the same connection.Oracle resolution stream
UMA Optimistic Oracle events: market resolutions, disputes, proposals, and admin actions. Subscribe with
"type": "oracle" to track the full resolution lifecycle.Quick start
Connection URL
pn_live_ or qm_live_ are accepted.
Multiple streams, one connection
PolyNode supports multiple subscription types on the same WebSocket:| Stream | Purpose | Subscribe |
|---|---|---|
| Settlements | Decoded Polymarket events with filtering | {"action": "subscribe", "type": "settlements"} |
| Oracle | UMA resolution lifecycle (resolutions, disputes, flags) | {"action": "subscribe", "type": "oracle"} |
| Chainlink | Real-time BTC/USD prices from Data Streams | {"action": "subscribe", "type": "chainlink"} |
Heartbeat
The server sends a heartbeat every 30 seconds:- A WebSocket-level Ping frame (handled automatically by WS clients)
- A text message:
{"type": "heartbeat", "ts": 1772386305181}
{"type": "pong"}
Connection lifecycle
Error handling
Invalid messages return structured errors:| Error code | Cause |
|---|---|
invalid_json | Message is not valid JSON |
invalid_message | Unknown action or missing required fields |
unresolved_slugs | Slug not found in market metadata |
unresolved_condition_ids | Condition ID not found in metadata |

