All timestamps are UTC.
If a change affects data shape or behavior, it will be marked as Breaking.
2026-10-01
Everything below about markets β the newmarketType values, the renames, the
period changes β is a data change only. No endpoint, field or type
changed, and it all surfaces through GET /markets (and GET /fixtures/markets). Refetch the catalogue once on or after this date and you
are current; odds payloads are untouched, they just start carrying the new
outcomeIds.
β¨ Added
GET /{lang}/fixtures/odds/parlayβ price an accumulator from a list ofoddsIds, across fixtures and sports. See Parlays & SGP.GET /{lang}/fixtures/odds/sgpβ price a correlated same-game parlay, quoted by the bookmaker.pricecarries the correlation,singlesPricethe naive product.missingOddsIdson both new endpoints β names the requested legs that could not be found, so an empty section is never ambiguous.X-API-Keyheader authentication on every endpoint, alongside theapiKeyquery parameter. Send one or the other. See Authentication.- 64 new esports
marketTypevalues and 568 newmarketTypeΓperiodcombinations β objectives, first-objective and multikill markets across Counter-Strike, League of Legends, Dota, Valorant and Rainbow Six. Map-level markets arrive under a newsportId83 (ESport Mobile Legends). - 195 new
periodkeys, all sub-period grids βp1r1β¦p5r36(round within map) andp1g2β¦p5g6(tennis). The vocabulary goes from 19 values to 213 and stays append-only.
All 64 new marketType values
All 64 new marketType values
Totals / spreads / team totals on esports objectives β
totals-kills, totals-towers, totals-turrets, totals-dragons, totals-barons, totals-roshans, totals-inhibitors, totals-barracks, totals-rounds, totals-headshots, spreads-kills, spreads-towers, spreads-turrets, spreads-dragons, spreads-roshans, spreads-inhibitors, spreads-barracks, spreads-rounds, teamtotals-kills-team1/-team2, teamtotals-towers-team1/-team2, teamtotals-turrets-team1/-team2, teamtotals-dragons-team1/-team2, teamtotals-barons-team1/-team2, teamtotals-roshans-team1/-team2, teamtotals-inhibitors-team1/-team2, teamtotals-barracks-team1/-team2, teamtotals-rounds-team1/-team2First objective β firstblood, firsttower, firstbaron, firstroshan, firstinhibitor, firstbarracksMultikills β triplekill, quadrakill, pentakillOther β 1x2-kills, drawnobet-kills, oddeven-kills, oddeven-rounds, racetokills, winningmargin-rounds, playertotals-kills, playertotals-headshots, toqualifyRename targets that did not exist before β spreads-bookings, players-commitpenalty, players-goalieshutouts, players-goalsagainst, players-nextgoalscorer, players-powerplaypoints, players-secondgoalscorer, players-shorthandedgoals, players-shorthandedgoalscorer, players-thirdgoalscorer. These are new only because the market moved to them β see the rename table below.π Changed
- 24
marketTypevalues are renamed for cross-sport consistency, affecting 222 markets in Ice Hockey, Soccer and Cricket. The singular prefixesplayer-,spread-andtotal-become the pluralplayers-,spreads-andtotals-already used everywhere else. periodchanges on 74 markets. 28 move fromfulltimetoresultacross 26 sports that have no scoring phase after regulation, so the two values were names for one number β see Periods per sport. The other 46 had a blankperiodand are now populated.marketIds are unchanged throughout.- No market has an empty
periodany more. If you special-cased the blank, drop that branch.
All 74 period changes
All 74 period changes
fulltime β result β the 1x2 market in 26 sports: MMA 203, Boxing 213, Beach Volley 303, Squash 343, Basketball 3x3 353, Curling 393, Padel 403, Soccer Specials 443, Beach Handball 473, Athletics 483, Badminton 493, Bowls 503, Cross-Country 513, ESport Call of Duty 563, ESport Overwatch 573, ESport Rainbow Six 583, ESport Rocket League 593, ESport StarCraft 603, ESport Valorant 613, ESport Arena of Valor 623, ESport King of Glory 633, Judo 643, ESport Honor of Kings 653, Speedway 663, Golf 673, Cycling 683.Boxing also moves two Total Rounds lines (216, 218) β its last fulltime markets, in a sport whose other Total Rounds lines were already on result.Blank β populated, 46 markets:Full marketType rename table
Full marketType rename table
13 of these renames merge into a
marketType that already existed β
players-anytimegoalscorer, players-assists, players-blocks,
players-firstgoalscorer, players-goals, players-lastgoalscorer,
players-points, players-saves, players-shots, players-shotsongoal,
spreads-corners, totals-fours and totals-sixes were already in the
registry alongside their singular twin. If you group by marketType, those
groups get larger rather than disappearing β the duplicate spelling for
the same concept is gone.The moneyline β toqualify row is the one rename that is not cosmetic: a single Soccer market
typed moneyline becomes toqualify, which is what it always meant. It is also the only market
whose marketName changes in this release β Winner (incl. overtime) becomes To Qualify.2026-05-25
β¨ Added
- WebSocket
receiveType: "zstd"β dictless compression. Opt-in zstd egress with no dictionary handling: every data frame is a standalone dictless zstd frame (dictId 0), decoded in one line (zstd.decompress(frame)β JSON). ~5β6Γ smaller than JSON onoddsβ the simplest way to cut bandwidth. See Compression. - WebSocket
receiveType: "zstd-dict"β trained dictionaries. Maximum ratio (~7β9Γ onodds) using per-channel dictionaries the server pushes asdictcontrol frames at connect.
π Changed
receiveType: "zstd"now means dictless. During the zstd beta,"zstd"previously delivered trained dictionaries; that behavior moved to the new"zstd-dict". If you were decoding dictionary frames under"zstd", switch to"zstd-dict".- Dictionary version cache removed. The
dictslogin field is gone; the server now re-sends the (~32 KB) dictionaries on everyzstd-dictconnection, so clients no longer persist or version dictionaries across reconnects. Adictsfield, if still sent, is ignored.
2026-04-09
β¨ Added
- Fixture view:
venuesection β new nested object on all fixture responses withvenueId,venueName, andvenueLocation. Translated per language. - Fixture view:
clocksection β new nested object on all fixture responses withcurrentPeriod,currentTime,remainingTime,remainingTimeInPeriod, andstopped. All keys present withnullvalues until clock data is populated for a fixture. - Fixture view:
participant1ShortName/participant2ShortNameβ new fields in theparticipantssection of fixture responses, sourced from translated participant data. - Fixture view:
seasonRoundβ new field in theseasonsection of fixture responses. - Futures view:
marketIdβ themarketsection in future responses now includes themarketIdfrom the futures table. Name fields (marketName,marketType,playerMarket,participantMarket) remainnullfor now. - Participants endpoint:
participantShortNameβ theGET /{lang}/participantsresponse now includesparticipantShortNamefor each participant. - New REST endpoint:
GET /{lang}/venues?venueIds=...β returns venue data with translatedvenueNameandvenueLocation. - New WebSocket channel:
clocksβ delivers live clock updates per fixture (same routing asscores: filtered byfixtureId, sport, tournament). Supports resume/replay.
β οΈ Breaking
- Fixture response shape changed β all fixture endpoints (REST and WebSocket) now include three new top-level keys:
venue(object),clock(object), and updatedparticipants/seasonsections. Clients parsing fixture responses strictly should update their models.seasonnow includesseasonRound: integer | nullparticipantsnow includesparticipant1ShortName: string | nullandparticipant2ShortName: string | nullvenue: { venueId, venueName, venueLocation }added afterseasonclock: { currentPeriod, currentTime, remainingTime, remainingTimeInPeriod, stopped }added afterscores
- Future response shape changed β
market.marketIdis now populated (integer or null) instead of alwaysnull.
2025-12-12
β¨ Added
- WebSocket resume & replay support using
entryIdcursors - New WebSocket channels:
injurieslineupsstats
- AsyncAPI 3.0 reference for WebSocket gateway
π§ Improved
- Reduced WebSocket latency for
oddsandscores - Better filtering for
sportIds,tournamentIds, andbookmakers
π Fixed
- Fixed an issue where some
oddsupdates were delivered without bookmaker gating - Fixed incorrect
liveflag on some fixtures during transitions
2025-11-28
β οΈ Breaking
odds.payload.oddskeys are now always bookmaker-scoped- Old clients expecting a flat structure must update
β¨ Added
- Support for
receiveType: "binary"(MessagePack) - Added
entryIdto all update messages
2025-11-10
β¨ Added
- Initial WebSocket gateway
- Channels:
fixturesscoresoddsbookmakers