API-key-authenticated SSE. Same data feed as the WebSocket channel above. One-way (server to client). Each message is a single `data:` line carrying the JSON envelope. Heartbeat every 5 seconds by default to prove the stream is live through corporate proxies.
Query params: apiKey, event_id, bookmakers, markets, kinds, heartbeat_s, limit, since, diff.
Receive odds updates as Server-Sent Events. Same data, different transport.
Messages
connected
Sent once immediately after upgrade. Confirms auth, tier, push mode, and any active query-param filters.
Content-Type:
hot_feed_status
Sent once after `connected`, before `initial_state`. Carries the per-source freshness map at connect time so clients can decide whether to trust the immediate snapshot.
Content-Type:
initial_state
Sent once after `connected`. Carries every active row for the subscribed sport, filtered by any active query params. Honors the `since` resume cursor when within the 60-minute lookback window; falls b
Content-Type:
odds_update
Sent every time a row in `odds_snapshots` or `prop_snapshots` for this sport changes. Payload shape varies by `diff_mode`: when off, every field of the affected row is included; when on, only the chan
Content-Type:
heartbeat
Sent on idle channel timeout (default 30 s for WS, configurable 1-30 s for SSE via `heartbeat_s`). Carries server timestamp; clients should treat absence of any frame for 2x heartbeat as a disconnect
Content-Type:
stream_status
Reports unresolved Pinnacle fixture families once per subscription generation. It contains no odds. Valid families continue; a fresh current snapshot is required to clear the incomplete-coverage warni
Content-Type:
About AsyncAPI
The AsyncAPI specification describes event-driven APIs the way OpenAPI describes request/response APIs. A channel is the named pipe — a webhook URL, a Kafka topic, a WebSocket route, an MQTT subject — that producers and consumers publish or subscribe to. Each channel carries one or more messages with structured payloads, and an operation declares whether a given party sends or receives on that channel.
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.