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.
Now the /markets endpoint will include a nullable market_type_id which can be cross referenced against the /market-types endpoint. This is part of our ongoing effort to standardize and make our market and names more uniform and consistent.
More information can be found here: https://developer.opticodds.com/reference/get_market-types#/
/copilot/fixtures
To make it simpler for copilot users, there is now a /copilot/fixtures endpoint that acts the same as /fixtures/active but will require a copilot_version_id that will allow you to get active fixtures that have or have had odds for your copilot version.
You will still need to use the normal /fixtures endpoint to get any fixture that has been completed in the past.
/copilot/results/queue/[start|stop|status]
You can now create copilot specific fixture results queues, this way you will only get results for the fixtures that have or have had copilot odds.
You can now also set up separate queues per copilot version.
The credentials to access these queues will be the same as the ones used to access your normal copilot odds queues.
The following rate limits apply for every 15s window, the limit resets after the 15s are completed:
- Historical Odds: 10 requests every 15 seconds.
- Streaming endpoints (new connections): 250 requests every 15 seconds.
- All other endpoints: 2500 requests every 15 seconds.
These will all reset after 15 seconds.
You can now request full snapshots of odds, locked-odds, and settled-odds data for Copilot. This new endpoint serves as a reliable fallback mechanism when your application loses sync with the RabbitMQ feed, ensuring continuous access to the latest odds data.
Key Features:
- Full data synchronization for specified fixtures
- Same data format as RabbitMQ events with
snapshot: trueidentifier - Preserves original timestamps for each odds update
- Supports recovery from connection interruptions
For complete implementation details, see: Snapshots API Documentation
You can now pass settled=True to the /copilot/fixtures/odds endpoint to get a current snapshot of all the settled odds. This param will return all odds that have a settlement. More information about the fields in the response can be found here: https://developer.opticodds.com/reference/get_copilot-fixtures-odds#/settledtrue
To surface fixtures that are more relevant to customer's use cases we have added 2 new query parameters to the /fixtures and /fixtures/active endpoint.
sportsbook: You can now pass an optional sportsbook, which will limit the fixtures returned to the ones that have had or currently have odds. Note that if all odds for a fixture are suspended, the fixture will still be returned.copilot_version_id: If you are a Copilot customer, you can now limit the fixtures being returned to only include the ones that have had or currently have odds for theversion_idyou pass to the request.