Version: 2.0.0

Odds (Push Stream)

REQUIREMENT

You'll need a license key to use OddsJam's API. You can get one by emailing us at [email protected].

API Endpoint#

https://api-external.oddsjam.com/api/v2/stream/odds

Parameters#

NOTE

You must provide at least one of game_id or league per GET request.

key (required)#

Your OddsJam API license key.

sportsbooks (required)#

NOTE

You can pass in multiple of this parameter.

The sportsbooks that you want to recieve odd changes for.

game_id#

NOTE

You can pass in multiple of this parameter.

The id of the game that you want to recieve odd changes for.

market#

NOTE

You can pass in multiple of this parameter.

The name of the market that you want to recieve odd changes for (e.g. Moneyline).

league#

NOTE

You can pass in multiple of this parameter.

The league you want to receive odd changes for (e.g. NCAAB)

is_main#

If this is set to True, you will only get main lines and no alternates, if this is set to False, you will only get alternate lines. If this is ommitted, you will get all the lines.

last_entry_id#

If this is set, it will get all events after the entry with this id, you can use this on reconnection events so you do not miss any updates.

Best Practices#

While our endpoint supports passing multiple leagues and game ids, we recommend making a separate connection for each league or game id that you are trying to subscribe to. This will help reduce and isolate issues on a game or league basis. For instance, if you pass [game_id1, game_id2], if game_id2 ends and you are reconnecting to the stream, you will get an error saying game_id2 is no longer active.

Example Request#

import requests
from requests.exceptions import ChunkedEncodingError
import json
import sseclient # pip install sseclient-py
while True:
try:
r = requests.get(
"https://api-external.oddsjam.com/api/v2/stream/odds",
params={
"key": "1234-5678-124",
"sportsbooks": ["DraftKings", "FanDuel", "Hard Rock"],
"market": ["Moneyline"],
"league": ["NCAAB"],
# "is_main": True,
},
stream=True,
)
client = sseclient.SSEClient(r)
for event in client.events():
if event.event == "odds":
data = json.loads(event.data)
print("odds data", ":", data)
elif event.event == "locked-odds":
data = json.loads(event.data)
print("locked-odds data", ":", data)
else:
print(event.event, ":", event.data)
except ChunkedEncodingError as ex:
print("Disconnected, attempting to reconnect...")
except Exception as e:
print("Error:", r.status_code, r.text)
break

Example Raw Response (from CURL)#

We send a connected event.

event: connected
data: OK

We send a ping from the server to the client every 5 seconds.

event: ping
data: 2023-02-22 16:30:08.952760

If an odd gets locked. You can use this to tell if an odd is no longer available on a sportsbook.

id: 25236-38874-2023-03-06
event: locked-odds
data: {"entry_id": "1678113258940-2", "data": [{"id": null, "game_id": "25236-38874-2023-03-06", "bet_name": "Portland Trail Blazers", "bet_price": -222.0, "bet_points": null, "bet_type": "Moneyline", "sportsbook": "Suprabets", "is_main": true, "is_live": false, "sport": "basketball", "league": "NBA", "timestamp": 1678113258.6867926}]}
retry: 5000

If an odd gets changed or added.

id: 54023-35775-2023-03-06
event: odds
data: {"entry_id": "1678113198585-0", "data": [{"id": null, "game_id": "54023-35775-2023-03-06", "bet_name": "Denver Nuggets", "bet_price": -250.0, "bet_points": null, "bet_type": "Moneyline", "sportsbook": "Resorts World Bet", "is_main": true, "is_live": false, "sport": "basketball", "league": "NBA", "timestamp": 1678113198.4532623}]}
retry: 5000