Skip to main content

What it streams

Realtime odds updates for outcomes within markets, scoped to a specific fixtureId. Odds are grouped by bookmaker and keyed by a unique oddsId per outcome. Each entry represents a single oddsId (one price for one outcome).

Routing

  • Entity key: payload.fixtureId
  • Filters: sportIds, tournamentIds, fixtureIds, bookmakers
  • Access: determined by your apiKey
  • Bookmaker-gated: ✅ Yes

Delivery semantics

  • This channel is high throughput
  • Updates are latest-state only
  • The gateway may coalesce or drop intermediate updates under load
  • Do not assume tick-by-tick completeness
Treat every message as a state update, not a ledger.

Payload structure

oddsId:
<fixtureId>:<bookmaker>:<outcomeId>:<playerId>

outcome object (full schema)

Each odds entry is an outcome, with the following fields:
FieldTypeDescription
bookmakerstringBookmaker slug (e.g. "stake", "pinnacle", "polymarket")
outcomeIdintegerOutcome identifier
playerIdintegerPlayer ID (0 for non-player markets)
pricenumberDecimal odds
activebooleanWhether this outcome is currently available
marketActiveboolean | nullWhether the entire market is active
mainLineboolean | nullWhether this is the bookmaker’s main line
marketIdintegerMarket identifier
bookmakerMarketIdstring | nullNative bookmaker market ID
bookmakerOutcomeIdstring | nullNative bookmaker outcome ID
bookmakerChangedAtnumber | nullBookmaker-provided change timestamp (epoch ms)
priceFractional`string`Fractional odds (e.g. "5/2")
priceAmerican`integer`American odds (e.g. -110, +250)
limitnumber | nullMaximum accepted stake (if provided)
betslipstring | nullOptional bookmaker betslip or deeplink token
metaobject | nullBookmaker-specific metadata (orderbooks, ladders, etc.)
changedAtnumberGateway change timestamp (epoch ms, UTC)

Notes on timestamps

  • changedAt is always present and represents when the gateway accepted the update
  • bookmakerChangedAt (when present) reflects the bookmaker’s own timestamp
  • These values may differ — do not assume equality

Advanced metadata (meta)

Some bookmakers (e.g. prediction markets / exchanges) provide rich metadata. Example:
{
  "meta": {
    "lay": [
      { "price": 2.00, "size": 100.0 },
      { "price": 2.10, "size": 80.0 }
    ],
    "back": [
      { "price": 1.95, "size": 50.0 }
    ]
  }
}
Typical meta contents may include:
  • Orderbook ladders (back / lay)
  • Liquidity hints
  • Internal sizing or tick metadata
The schema of meta is bookmaker-specific and may evolve.

Example: traditional bookmaker odds

{
  "channel": "odds",
  "type": "UPDATE",
  "payload": {
    "fixtureId": "id1100013262924543",
    "odds": {
      "stake": {
        "id1100013262924543:stake:111:0": {
          "bookmaker": "stake",
          "outcomeId": 111,
          "playerId": 0,
          "active": true,
          "price": 1.91,
          "marketActive": true,
          "mainLine": true,
          "changedAt": 1766427330098
        }
      }
    }
  },
  "ts": 1766427330257,
  "entryId": "1766427330257-84805"
}

Example: prediction market odds (extended fields)

{
  "channel": "odds",
  "type": "UPDATE",
  "payload": {
    "fixtureId": "id1100064864029581",
    "odds": {
      "polymarket": {
        "id1100064864029581:polymarket:112:0": {
          "bookmaker": "polymarket",
          "outcomeId": 112,
          "playerId": 0,
          "active": true,
          "price": 6.369,
          "priceAmerican": 537,
          "limit": 4.71,
          "bookmakerMarketId": "1011497",
          "bookmakerOutcomeId": "4937...",
          "meta": {
            "back": [{ "price": 6.369, "size": 30.0 }],
            "lay": [{ "price": 100.0, "size": 15.0 }]
          },
          "marketActive": true,
          "changedAt": 1766939876376
        }
      }
    }
  },
  "ts": 1766939876700,
  "entryId": "1766939876700-653"
}

Implementation guidance

  • Always key storage by
    {fixtureId}:{bookmaker}:{outcomeId}:{playerId}
    
  • Group outcomes by marketId (see Concepts) for:
    • arbitrage detection
    • overround calculations
    • probability normalization
  • Treat active=false or marketActive=false as hard stops
  • Preserve unknown fields in meta to remain forward-compatible