Scores Integration Guide
🔁 Ingestion Methods
1. REST API Ingestion (Simple Polling)
This is the easiest method to implement. You can make standard API requests to our poll endpoints to retrieve current snapshots of data for specific fixture_ids.
2. SSE / Streaming Ingestion (Live Updates)
This method enables real-time data updates via HTTP streaming. Subscribe to specific streams and receive updates as they happen. Visit our streaming endpoints section for more details.
3. RabbitMQ Ingestion (Scalable Queue-Based)
A more advanced option that provides full control over message consumption. Use this method to pull messages from a queue at your preferred pace.
🔐 Get Your RabbitMQ Credentials
Contact your sales representative to obtain (same as the ones you are using for your odds integration):
- rabbitmq_username
- rabbitmq_password
Getting Started
Make sure to follow the instructions at https://developer.opticodds.com/docs/getting-started#/ to get the information you need.
⚙️ Enable Your Queue
To initialize your message queue and begin receiving data:
- Make a POST request to: v3/copilot/results/queue/start
- This will return your queue details. Example response:
{
"data": [
{
"id": 2,
"queue_name": "YxdEA6RX_2_copres_EDH6ASN9ZTDGKNKW",
"enabled": false,
"version": {
"id": 1,
"name": "Default"
},
"num_consumers": null,
"num_messages": null,
"messages_per_second": null
}
]
}
📦 Message Types
All messages are sent as JSON-encoded byte streams. Below are examples of supported event types.
🔄 ping
A basic heartbeat message.
{
"event": "ping",
"timestamp": "1743541426",
"data": "2024-08-28T18:57:49Z"
}
🎯 fixture-results
Live score updates for fixtures.
{
"event":"fixture-results",
"timestamp":1746109375,
"data":{
"fixture_id":"2025050128AD6D61",
"sport":"tennis",
"league":"ITF Women",
"is_live":true,
"score":{
"sport":{
"id":"tennis",
"name":"Tennis",
"numerical_id":25
},
"league":{
"id":"itf_women",
"name":"ITF Women",
"numerical_id":605
},
"fixture":{
"id":"2025050128AD6D61",
"numerical_id":242184,
"game_id":"45040-10517-2025-17",
"start_date":"2025-05-01T08:00:00+00:00",
"home_competitors":[
{
"id":"F8ED4FE9C4698E9D",
"name":"Amandine Hesse",
"numerical_id":43219,
"base_id":2213,
"abbreviation":"",
"logo":"https://cdn.opticodds.com/team-logos/tennis/2213.png"
}
],
"away_competitors":[
{
"id":"03C08D67548BE1EE",
"name":"Aravane Rezai",
"numerical_id":67335,
"base_id":52105,
"abbreviation":"",
"logo":"https://cdn.oddsjam.com/team-logos/unknown.jpg"
}
],
"home_team_display":"Amandine Hesse",
"away_team_display":"Aravane Rezai",
"status":"live",
"is_live":true,
"season_type":"ITF W50 Yecla Women",
"season_year":"2025",
"season_week":"round of 16",
"venue_name":null,
"venue_location":null,
"venue_neutral":false
},
"scores":{
"home":{
"total":1.0,
"periods":{
"period_1":6.0,
"period_2":3.0
},
"aggregate":null
},
"away":{
"total":0.0,
"periods":{
"period_1":1.0,
"period_2":2.0
},
"aggregate":null
}
},
"in_play":{
"period":"2",
"clock":null,
"last_play":null,
"time_min":null,
"time_sec":null,
"balls":null,
"outs":null,
"strikes":null,
"runners":null,
"batter":null,
"pitcher":null,
"possession":null,
"down":null,
"distance_to_go":null,
"field_position":null,
"game_score":null
},
"events":[
],
"stats":{
"home":[
{
"period":"all",
"stats":{
"aces":4.0,
"double_faults":4.0,
"service_games_won":6.0,
"max_games_in_a_row":4.0,
"service_points_won":27.0,
"max_points_in_a_row":10.0
}
}
],
"away":[
{
"period":"all",
"stats":{
"aces":2.0,
"double_faults":3.0,
"service_games_won":3.0,
"max_games_in_a_row":1.0,
"service_points_won":20.0,
"max_points_in_a_row":7.0
}
}
]
},
"extra":{
"id":"2025050128AD6D61",
"clock":null,
"sport":"tennis",
"league":"ITF Women",
"period":"2",
"source":"sofascore",
"status":"Live",
"game_id":"45040-10517-2025-17",
"is_live":true,
"away_team":"Aravane Rezai",
"home_team":"Amandine Hesse",
"start_date":"2025-05-01T08:00:00+00:00",
"team_stats":{
"away_stats":{
"stat_aces":2.0,
"stat_double_faults":3.0,
"stat_service_games_won":3.0,
"stat_max_games_in_a_row":1.0,
"stat_service_points_won":20.0,
"stat_max_points_in_a_row":7.0
},
"home_stats":{
"stat_aces":4.0,
"stat_double_faults":4.0,
"stat_service_games_won":6.0,
"stat_max_games_in_a_row":4.0,
"stat_service_points_won":27.0,
"stat_max_points_in_a_row":10.0
}
},
"description":"A. Rezai vs A. Hesse",
"away_team_id":"03C08D67548BE1EE",
"home_team_id":"F8ED4FE9C4698E9D",
"is_clock_stopped":false,
"score_away_total":0.0,
"score_home_total":1.0,
"score_away_period_1":1.0,
"score_away_period_2":2.0,
"score_home_period_1":6.0,
"score_home_period_2":3.0
},
"retirement_info":null
},
"player_results":[
{
"player":{
"id":"F8ED4FE9C4698E9D",
"name":"Amandine Hesse",
"position":null,
"number":null,
"numerical_id":1365689,
"base_id":39572
},
"team":{
"id":"F8ED4FE9C4698E9D",
"name":"Amandine Hesse",
"numerical_id":43219,
"base_id":2213
},
"status":"live",
"stats":[
{
"period":"all",
"stats":{
"aces":4.0,
"double_faults":4.0,
"service_games_won":6.0,
"max_games_in_a_row":4.0,
"service_points_won":27.0,
"max_points_in_a_row":10.0
}
}
],
"is_starter":false
},
{
"player":{
"id":"03C08D67548BE1EE",
"name":"Aravane Rezai",
"position":null,
"number":null,
"numerical_id":1449774,
"base_id":723855
},
"team":{
"id":"03C08D67548BE1EE",
"name":"Aravane Rezai",
"numerical_id":67335,
"base_id":52105
},
"status":"live",
"stats":[
{
"period":"all",
"stats":{
"aces":2.0,
"double_faults":3.0,
"service_games_won":3.0,
"max_games_in_a_row":1.0,
"service_points_won":20.0,
"max_points_in_a_row":7.0
}
}
],
"is_starter":false
}
]
}
}
⚠️ Error Handling
If more than 1,500 unread messages accumulate in your queue:
- The queue will be automatically cleared and deleted.
- You must re-initiate the /queue/start flow to resume consumption
Updated about 4 hours ago