Real-time odds

Returns real-time Pinnacle odds for a sport. For the esports keys (cs2, lol, valorant, dota2) the response is the Pinnacle wire format unchanged and league is required; every other sport returns the normalized realtime event shape.

Returns real-time Pinnacle odds for a sport. For the esports keys (cs2, lol, valorant, dota2) the response is the Pinnacle wire format unchanged and league is required; every other sport returns the normalized realtime event shape.

meta.source names the real-time feed that answered; meta.available is false and meta.freshness.stale is true whenever the response is empty.

meta.feed.lastDataAgeSeconds is the time since this sport last produced any data, or null if it never has; it is the field to watch for a feed that has stopped. For a feed that is running but hearing nothing from Pinnacle, watch meta.feed.upstreamAgeSeconds.

meta.feed.upstreamAgeSeconds is the time since Pinnacle last sent anything for this sport, and meta.feed.resubscribing is true while the feed is subscribing again after a reconnect, when some leagues can be silent. lastDataAgeSeconds stays low while Pinnacle is quiet, because the board is rewritten on a schedule either way; upstreamAgeSeconds keeps growing. Both are null when unknown, which includes every response whose meta.source is not pinnacle and the moments before the feed has received anything since it started.

meta.feed.stalled is true when the board has an event in play (phase live) and Pinnacle has sent nothing for this sport for longer than its normal quiet spells during play (5 minutes for NFL and college football, 8 for soccer and MLB, 12 for tennis and WNBA, 18 for NHL and every other sport): prices can be out of date even though the board was rewritten seconds ago. It is false on a board with nothing in play, however quiet, and null when upstreamAgeSeconds is null or the events carry no phase. It does not change meta.freshness.stale. The pinnacle-realtime WebSocket event carries the same field in its feed object.

Each event carries status and isLive and may carry phase: scheduled (not started), live (in play, betting open), suspended (in play, betting paused for now; its markets carry suspended: true) or closed (betting over for good; the event is sent that way for a few minutes, then removed). phase can gain values, so treat an unknown one like a missing field. When phase is present, isLive is true while in-play betting on the match is running. Without phase, isLive can be false on a match that is in progress, so check status as well, and read phase first whenever it is present.

A main market (moneyline, spread, total or team total) that Pinnacle takes down while the rest of the match stays open also carries suspended: true, and loses it when Pinnacle offers it again or its period ends. On a spread or total the flag is on the main line only; its alternateLines are not flagged one by one, so read each rung's last_seen for those.

When meta.source is pinnacle, each event also carries lastUpdate and seenAt (epoch milliseconds) and freshness: { lastUpdate, ageSeconds, stale, refreshedAt, refreshedAgeSeconds }. freshness.lastUpdate is the price change the event's freshness is measured from and ageSeconds its age; refreshedAt is the last time the feed confirmed a price on the event, changed or not, and refreshedAgeSeconds its age. stale is true when the event reads as in play and ageSeconds is over 30 or unknown; pre-match prices can sit unchanged for hours and are not flagged. The event-level lastUpdate can be older than the newest price on an in-play event, so for the age of one market read that market's last_update.

markets[].last_update is when that market's price last changed, and last_seen, where present, when the feed last confirmed it. That holds for the main lines: h2h, spreads, totals, team_totals, total_games, and their corner, first_half_ and set versions. On special_ markets folded from a sub-matchup, on btts markets and on the other markets, last_update moves with the whole matchup or sub-matchup rather than the single market, so do not read it as that market's own age.

Each alternateLines rung (point and price) may carry its own last_seen, when the feed last confirmed that rung. Pinnacle does not resend every rung in every message, so a rung whose last_seen is well behind its market's is a hint that Pinnacle has taken it down, not proof.

meta.stream is { epoch, seq }, the position on the pinnacle-realtime stream that this response matches, or null when the response cannot be aligned with the stream. To follow pinnacle-realtime without gaps, wait up to 25 seconds for a frame whose stream.checkpoint is true (call at once if the frames carry no stream), then call this endpoint. If meta.stream is null, replace your board with data, apply every frame, and call again after 10, 20, 40 seconds and so on, up to every 5 minutes. If its epoch differs from the checkpoint's, or its seq is lower than the checkpoint's, call again at the next checkpoint. Otherwise replace your board with data and apply only frames with a seq above meta.stream.seq, in order; a skipped seq or a new epoch after that means calling again. The pinnacle-realtime event description has the full procedure.

When meta.stream is set, data is the board at that position after the league filter and the filters this endpoint applies to every response (confirmed finished events, events too old to still be live, duplicates), so an empty data array means no event matches, not a missing feed.

meta.freshness.droppedAsFinished and droppedAsStale count events removed because they were confirmed finished or their start time is too far past to still be live.

Esports rows each carry their own freshness; the top-level freshness is the freshest served event and stale is true only when no served event is fresh.

The SDK exposes the esports keys through getEsportsRealtime / get_esports_realtime, which enforce the league parameter.

Soccer women's and youth leagues: Pinnacle names the clubs as in the senior league and puts Women or the age only in the league label. The team names here carry that marker (Liverpool Women, Uzbekistan U23), and so does every outcome label that names a team, such as Draw No Bet, Double Chance (Draw Or Uzbekistan U23) and progression outrights. The v2 Pinnacle endpoints keep Pinnacle's own names.

get/api/v1/{sport}/realtime

Request

  • Base URL: https://api.owlsinsight.com
  • URL: https://api.owlsinsight.com/api/v1/{sport}/realtime
  • Auth: HTTP bearer

Path parameters

sportstring required

Query parameters

leaguestring

Substring of the league name to filter on (case-insensitive). Optional for team sports; required for the esports keys, which return 400 without it.

Response

OK

successboolean

Changes

No recorded changes to this operation across all 1 revision of this API.