Subscribe once to the markets you care about. Every price move arrives as it happens — a burst while the game moves, silence when it doesn't. Silence is normal, not an outage. Push access is included on the Full plan ($149/mo); Free and Basic keys are REST-only.
| Push WebSocket | Polling loop | |
|---|---|---|
| When updates arrive | The moment the book moves | On your next request cycle |
| Wasted requests | None — no move, no message | Most polls see no change |
| Cost to scale frequency | Zero — pushes don't consume quota | More polls = more requests = more spend |
| Market status | OPEN ↔ SUSPENDED flips pushed live | You infer it from diffs |
| Live & pre-match | One subscription, both | Two schedules to babysit |
Connect with your Full-plan key, then send one subscribe message. It takes the same filters as REST: league, game, market category and period.
wss://api.fanlinewire.com/v1/stream?key=YOUR_KEY
{"action":"subscribe","state":"nj","league":"nfl","category":["spread","total"],"period":["game","1h"]}
You get a snapshot of every matching market (in chunks), a subscribed frame, then an update frame each time a market changes. Change your filter any time by sending another subscribe. Full guide: docs.
Every update carries the whole market, so you replace what you hold:
| Field | Meaning |
|---|---|
event, away_team, home_team, start_time | The game. |
market_name, period, category | For example 1st Half Spread, 1h, spread. |
status | OPEN or SUSPENDED — pushed the moment it flips. |
selections[].handicap | The line. |
selections[].american / decimal | Both odds formats. |
selections[].betslip_url | Opens that pick on the FanDuel bet slip in that state. |
The keyless public snapshot is leaner per price — selection_id and american only — so don't look for these fields in odds.json.
The public demo snapshot exposes the same board the WebSocket subscription watches — live and pre-match totals, per-sport breakdown, and a tape of the latest price moves:
curl https://fanlinewire.com/odds.json
Fetch it twice a minute apart and compare: the sequence counter climbs with every collector tick, the fixtures tape reorders, and the drops list records every move against the bettor. That is the subscription's view of the board, at snapshot pace — poll it no faster than every 10 seconds (a politeness floor on a shared endpoint, not a plan quota; per-key REST discovery limits are separate and are listed in pricing).
Yes — on the Full plan. Connect to wss://api.fanlinewire.com/v1/stream?key=YOUR_KEY, send one JSON subscribe message with your filters (league, game, market category, period), get a snapshot, then every change as it happens.
Three reasons: latency (the tick arrives when the book moves, not on your next cycle), waste (a quiet market costs nothing — a poll costs a request), and signal (OPEN ↔ SUSPENDED flips arrive as events, so you can alert on them).
One subscription can cover a whole league — every NFL, NCAAF, NBA or NCAAB game and market. The snapshot arrives in chunks, then only changes.
A push socket goes quiet when nothing is moving. That is healthy. Judge feed health by your subscription acks and market-status flips — never by tick count. During live action you get bursts; measured median gap inside a burst is 0.35 s on the reference run.
No. The push stream is included on the Full plan ($149/mo) — the message rate can't change your bill. That is the structural difference vs credit-priced polling APIs.