Odds stream¶
GET /odds/stream[?league=<league>]
The prices of /odds pushed as they change, on odds.halfpoint.tech. Needs the
Realtime or Risk plan; otherwise 403. Your plan decides the fields, as in
/odds.
| parameter | ||
|---|---|---|
league |
optional | one league, default all |
It is plain Server-Sent Events
over HTTP: one JSON object per event, with the key sent as usual. Errors (401, 402, 403,
429) are normal status codes before the stream starts.
A key may have 8 streams open at once, counted with the live stream together (2 while its only plans
are trials); another one answers 429, too many open streams for this key (8); close one or
contact us. Closing a stream frees its slot. See Plans.
curl -N -H "X-Api-Key: $KEY" "https://odds.halfpoint.tech/odds/stream?league=nba"
event: price
id: 48213
data: {"id":"nba-261030-mia-cha","league":"nba","start":"2026-10-30T23:40:00.000Z","markets":{"moneyline":{"home":0.46,"away":0.54,"recent":true,"at":"2026-10-30T23:36:42.915Z"}}}
event: remove
id: 48214
data: {"id":"nba-261030-mia-cha","market":"moneyline"}
: ping
First comes the current state, one price event per fixture; then every change.
| event | data |
|---|---|
price |
a fixture as in /odds, with all its markets: it replaces what you hold |
remove |
id, market: the market is gone (see Recent) |
Lines starting with : are comments that keep the connection open, about every 30 s. SSE clients
ignore them.
Reconnecting¶
Reconnect whenever the connection drops, and start over from what the stream sends first: there
is no replay of missed events, so anything you hold that isn't in the new state is gone. Last-Event-ID isn't
supported. A client more than 1,024 events behind is disconnected the same way.
The stream's subscription is its league: to change it, reconnect.