There is a new POST endpoint that you can use to override the copilot specific prices for parlay pricing.
https://developer.opticodds.com/reference/post_copilot-parlay-odds
For pagination, we will be switching from total_pages to has_more being true or false to improve performance and decrease latency.
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
The following 2 books will no longer have odds and are being replaced by:
- Underdog Sportsbook -> Underdog Predictions
- Underdog Fantasy -> Underdog Fantasy (6 Pick)
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.