Odds
Retrieve a listing of current odds data for the specific league and market type.
URL Parameters
|
Parameter |
Type |
Description |
|---|---|---|
|
league |
String |
The league for which to retrieve data. |
|
marketType |
String |
Type of market (see below) |
Market Types
-
straight - Standard game markets (moneyline, spread, totals)
-
futures - Season-long betting markets (championships, awards)
-
props - Proposition bets (player props, team props, game props)
Response Structure
The Unabated API returns odds data in a hierarchical JSON structure organized by league, period type, and game state. This structure provides comprehensive betting market information including event details, team information, and market source lines.
Objet keys throughout this structure are for navigational purposes only, and can be directly keyed into via the marketLineKey property of our websocket payloads.
These keys are not meant to be parsed for data consumption.
If you are looking for a unique key for a particular market line, you want to be using the marketLineId which is guaranteed to be unique for the given market and market source.
{
"odds": {
"{leagueCode}": {
"leagueId": integer,
"periodTypes": {
"{periodTypeName}": {
"periodTypeId": integer,
"{gameState}": {
"{marketKey}": { /* Market Group Object */ }
}
}
}
}
},
"lastUpdated": timestamp
}
Root Fields
|
Field |
Type |
Description |
|---|---|---|
|
odds |
Object |
Contains all odds data organized by league |
|
lastUpdated |
Integer |
Unix timestamp of when the data was last updated |
League Structure
Each league is identified by its short code (e.g., "nba", "nfl", "mlb") and contains:
|
Field |
Type |
Description |
|---|---|---|
|
leagueId |
Integer |
Unique identifier for the league |
|
periodTypes |
Object |
Period types available for this league |
Period Types Structure
Period types are organized by name (e.g., "game", "firstHalf") and contain:
|
Field |
Type |
Description |
|---|---|---|
|
periodTypeId |
Integer |
Unique identifier for the period type |
|
{gameState} |
Object |
Game state containers (pregame, live) |
Game States
-
pregame - Markets for games that haven't started
-
live - Markets for games currently in progress
Market Key
Market keys follow this standardized format:
eid{eventId}:bt{betTypeId}:bst{betSubType}:pt{periodTypeId}:pid{personId}:tid{teamId}:sid{sideIndex}:{gameState}
Examples:
-
eid940356:bt72:bst0:pt1:pregame- Pregame full game market for event 940356 -
eid940356:bt104:bst1:pt2:live- Live first half market for event 940356
Market Key Components
|
Component |
Description |
Example |
|---|---|---|
|
eid |
Event ID |
eid940356 |
|
bt |
Bet Type ID |
bt72 |
|
bst |
Bet Sub Type (0 if none) |
bst0 |
|
pt |
Period Type ID |
pt1 |
|
gameState |
pregame or live |
pregame |
|
pid |
Person Id (0 if none) |
pid41840 |
|
tid |
Team Id (0 if none) |
tid4883 |
Market Group Object
Each market group contains comprehensive information about a specific betting market:
Core Market Fields
|
Field |
Type |
Description |
|---|---|---|
|
eventId |
Integer |
Unique identifier for the event |
|
isLive |
Boolean |
Whether the market is currently live |
|
eventStart |
String |
Event start time in ISO 8601 format (UTC) |
|
eventEnd |
String |
Event end time in ISO 8601 format (UTC) |
|
statusId |
Integer |
Current event status (see Event Status reference) |
|
betTypeId |
Integer |
Type of bet (see Bet Types reference) |
|
betSubType |
String |
Additional bet type context if applicable |
|
gameClock |
String |
Current game clock display |
|
overtimeNumber |
Integer |
Number of overtime periods (0 if none) |
|
eventName |
String |
Full display name of the event |
|
playerPosition |
String |
Player position for player props (empty for non-player markets) |
|
tournamentName |
String |
Tournament name if applicable |
Event Teams Structure
The eventTeams object contains team information organized by side index:
"eventTeams": {
"0": {
"teamId": 75,
"rotationNumber": 501,
"sideIndex": 0,
"score": 0
},
"1": {
"teamId": 84,
"rotationNumber": 502,
"sideIndex": 1,
"score": 0
}
}
Event Team Fields
|
Field |
Type |
Description |
|---|---|---|
|
teamId |
Integer |
Unique identifier for the team |
|
rotationNumber |
Integer |
Sportsbook rotation number |
|
sideIndex |
Integer |
0 = Away/Over, 1 = Home/Under |
|
score |
Integer |
Current score (0 for pregame) |
Sides Structure
The sides object contains market lines organized by side keys:
Side Key Format
Side keys follow this pattern:
si{sideIndex}:tid{teamId}
Examples:
-
si0:tid75- Away team (side 0) with team ID 75 -
si1:tid84- Home team (side 1) with team ID 84
For player props, the format includes player ID:
si{sideIndex}:pid{playerId}
Side Object Structure
Each side contains market participant information and market source lines:
"si0:tid75": {
"sideIndex": 0,
"sideName": "",
"teamId": 75,
"personId": null,
"marketSourceLines": {
"{marketSourceId}": { /* Market Source Line Object */ }
}
}
Side Fields
|
Field |
Type |
Description |
|---|---|---|
|
sideIndex |
Integer |
0 = Away/Over, 1 = Home/Under |
|
sideName |
String |
Custom side name (empty if standard) |
|
teamId |
Integer|null |
Team ID for team-based markets |
|
personId |
Integer|null |
Player ID for player-based markets |
|
marketSourceLines |
Object |
Market lines from different sources |
Market Source Lines
Market source lines contain odds data from specific books or sources:
Market Source Line Object
"91": {
"marketId": 43907422,
"marketLineId": 3181318560,
"marketSourceId": 91,
"points": 230.5,
"price": -110,
"sourcePrice": -110,
"sourceFormat": 1,
"statusId": 1,
"sequenceNumber": 1749141120194,
"edge": -0.0642,
"bestAltPrice": -110,
"bestAltPoints": 230.5,
"bestAltEdge": -0.0842,
"disabled": false,
"marketLineKey": "",
"modifiedOn": "2025-06-05T16:32:07.592989Z",
"alternateLines": [ /* Array of alternate line objects */ ]
}
Market Source Line Fields
|
Field |
Type |
Description |
|---|---|---|
|
marketId |
Integer |
Unique market identifier |
|
marketLineId |
Integer |
Unique market line identifier |
|
marketSourceId |
Integer |
Source/sportsbook identifier |
|
points |
Number|null |
Point spread or total (null for moneyline) |
|
price |
Integer |
Price in American odds format |
|
sourcePrice |
Number |
Original price from the source |
|
sourceFormat |
Integer |
Price format (1=American, 2=Decimal) |
|
statusId |
Integer |
Status of the market line (see Market Line Status reference) |
|
sequenceNumber |
Integer |
Update sequence for ordering |
|
edge |
Number |
Calculated edge value |
|
bestAltPrice |
Integer |
Best available alternate price |
|
bestAltPoints |
Number |
Points for best alternate price |
|
bestAltEdge |
Number |
Edge for best alternate price |
|
disabled |
Boolean |
Whether the line is disabled |
|
marketLineKey |
String |
Additional line identifier |
|
modifiedOn |
String |
Last modification time (ISO 8601) |
Alternate Lines
Alternate lines provide additional betting options with different points/prices:
"alternateLines": [
{
"marketId": 43907422,
"marketLineId": 3181318560,
"marketSourceId": 91,
"alternateNumber": 1,
"points": 231.5,
"price": -120,
"sourcePrice": -120,
"statusId": 1,
"sequenceNumber": 1749141120194,
"edge": -0.0842,
"modifiedOn": "2025-06-05T16:32:07.592989Z"
}
]
Alternate Line Fields
|
Field |
Type |
Description |
|---|---|---|
|
alternateNumber |
Integer |
Sequence number for the alternate |
|
points |
Number |
Alternate point value |
|
price |
Integer |
Price for alternate line |
|
edge |
Number |
Calculated edge for alternate |
|
(other fields) |
Various |
Same as main market source line |
Data Navigation Examples
Accessing a Specific Market Line
To access odds for a specific sportsbook on a particular side:
const nbaOdds = response.odds.nba;
const gameMarkets = nbaOdds.periodTypes.game.pregame;
const market = gameMarkets['eid940356:bt72:bst0:pt1:pregame'];
const awaySide = market.sides['si0:tid75'];
const draftkingsLine = awaySide.marketSourceLines['91'];
Iterating Through All Markets
// Iterate through leagues
for (const [leagueCode, leagueData] of Object.entries(response.odds)) {
// Iterate through period types
for (const [periodName, periodData] of Object.entries(leagueData.periodTypes)) {
// Iterate through game states (pregame/live)
for (const [gameState, markets] of Object.entries(periodData)) {
if (gameState === 'periodTypeId') continue; // Skip metadata
// Iterate through markets
for (const [marketKey, marketData] of Object.entries(markets)) {
// Process market data
console.log(`Market: ${marketKey}`);
console.log(`Event: ${marketData.eventName}`);
}
}
}
}