There is a new extra field that will be included on the fixtures response. For now this will only be supported on esports fixtures and will include the following fields:

  • level : The tier of the match / tournament.
  • sub_league : The sub league of the esports game.
  • num_periods : The best of number of games/maps.
{
            "id": "2026010512854E5A",
            "numerical_id": 600030,
            "game_id": "35252-16764-2026-01-05-00",
            "start_date": "2026-01-05T08:00:00Z",
            "home_competitors": [
                {
                    "id": "9D67F088FACFA029",
                    "name": "OlyBet SB",
                    "numerical_id": 90354,
                    "base_id": 68483,
                    "abbreviation": "",
                    "logo": "https://cdn.oddsjam.com/team-logos/unknown.jpg"
                }
            ],
            "away_competitors": [
                {
                    "id": "A94EAEA85A31",
                    "name": "AaB esport",
                    "numerical_id": 57500,
                    "base_id": 42535,
                    "abbreviation": "AAB",
                    "logo": "https://cdn.opticodds.com/team-logos/esports/42535.png"
                }
            ],
            "home_team_display": "OlyBet SB",
            "away_team_display": "AaB esport",
            "status": "completed",
            "is_live": false,
            "season_type": "Urban Riga",
            "season_year": "Open#2 2026",
            "season_week": "playoffs",
            "venue_name": null,
            "venue_location": null,
            "venue_neutral": false,
            "sport": {
                "id": "esports",
                "name": "eSports",
                "numerical_id": null
            },
            "league": {
                "id": "cs2",
                "name": "CS2",
                "numerical_id": null
            },
            "home_starter": null,
            "home_starter_id": null,
            "home_record": null,
            "home_seed": null,
            "home_rotation_number": null,
            "away_starter": null,
            "away_starter_id": null,
            "away_record": null,
            "away_seed": null,
            "away_rotation_number": null,
            "tournament": null,
            "tournament_stage": null,
            "has_odds": false,
            "broadcast": "https://www.twitch.tv/aabesport | https://kick.com/urbancontenders",
            "result": null,
            "lineups": {
                "home": [],
                "away": []
            },
            "weather": null,
            "weather_temp": null,
            "extra": {
                "level": "D",
                "sub_league": "Urban Riga",
                "num_periods": 3
            },
            "source_ids": {}
        },

To make things simpler and easier to maintain, we are consolidating the following markets into a single one (To Advance).

  • To Lift The Cup
  • To Qualify

exclude_fees

You can pass exclude_fees=True to exclude any exchange commission. This will modify the price and the order_book to return the prices without fees where applicable.


Order Book

We are now exposing the order books for the exchanges we support that expose it. This can help provide a bigger picture of where users want to place bets.

Source Ids

We are now exposing the source ids for some exchanges to help facilitate matching. This is useful for hyper latency sensitive applications that connect directly to the exchange's apis and don't want to rely on our poll rate for pricing. This way you can make a single call to our api, get the necessary ticker / token / source ids for the exchange of interest and subscribe to the exchange directly or make orders via API.

Example:

These are available on both the /fixtures/odds and the /stream/odds endpoints.

{
                    "id": "40294-35775-2025-11-30:kalshi:moneyline:new_york_knicks",
                    "sportsbook": "Kalshi",
                    "market": "Moneyline",
                    "name": "New York Knicks",
                    "is_main": true,
                    "selection": "New York Knicks",
                    "normalized_selection": "new_york_knicks",
                    "market_id": "moneyline",
                    "selection_line": null,
                    "player_id": null,
                    "team_id": "6A36E386117E",
                    "price": 1.31,
                    "timestamp": 1764536802.4131637,
                    "grouping_key": "default",
                    "points": null,
                    "deep_link": null,
                    "limits": {
                        "max": 108.25
                    },
                    "order_book": [
                        [
                            1.31,
                            108.25
                        ],
                        [
                            1.293,
                            91866.72
                        ],
                        [
                            1.278,
                            25744.13
                        ]
                    ],
                    "source_ids": {
                        "market_id": "KXNBAGAME-25NOV30TORNYK-NYK",
                        "selection_id": "yes"
                    }
                },


Motivation

As the uses of our API are evolving, we are realizing that our API needs to evolve with it. One of the questions we get asked the most is "Do you have a mapping from your stats to your markets?". One reason for wanting this is to create a tracker for Player Props or Team Props or Totals.

Solution

We are introducing a market_stats field on both the fixture/results and fixture/player-results response that will allow direct mapping from our scores to our markets that are settleable. These will also come via our streaming or rabbitmq solutions.

Fixture Results example

"market_stats":{
   "home":{
      "team_total_steals":7,
      "1st_half_team_total":57,
      "team_total_rebounds":27,
      "team_total_blocks":9,
      "team_total_assists":23,
      "2nd_half_team_total":28,
      "1st_quarter_team_total":29,
      "2nd_quarter_team_total":28,
      "3rd_quarter_team_total":28,
      "team_total_made_threes":10,
      "team_total_consecutive_points":8,
      "team_total":85
   },
   "away":{
      "team_total":91,
      "team_total_blocks":2,
      "team_total_steals":8,
      "team_total_rebounds":43,
      "1st_quarter_team_total":37,
      "team_total_made_threes":10,
      "team_total_assists":20,
      "1st_half_team_total":61,
      "2nd_half_team_total":30,
      "2nd_quarter_team_total":24,
      "3rd_quarter_team_total":30,
      "team_total_consecutive_points":9
   }
},

Player Results example

"market_stats":{
   "player_points_+_assists":3,
   "player_points_+_rebounds":4,
   "player_free_throws_attempted":0,
   "player_two_pointers_attempted":2,
   "player_blocks":0,
   "player_points":2,
   "player_assists":1,
   "player_field_goals_made":1,
   "player_made_two_pointers":1,
   "player_defensive_rebounds":2,
   "player_field_goals_attempted":5,
   "player_rebounds":2,
   "player_made_threes":0,
   "player_threes_attempted":3,
   "player_offensive_rebounds":0,
   "player_rebounds_+_assists":3,
   "player_points_+_rebounds_+_assists":5,
   "player_fouls":1,
   "player_turnovers":0,
   "player_steals_+_blocks":1,
   "player_free_throws_made":0,
   "player_steals":1
},

On Nov 2, we will be removing the status field on each individual player's result. It is duplicated info from the status field on the fixture and is causing confusion.