Odds
GET /v1/sports/{sport}/odds lists every upcoming fixture for one sport with every requested book's price; GET /v1/sports/{sport}/events/{id}/odds scopes the same shape to one fixture you already have the id for. Both count once against your plan's request allowance no matter how many fixtures, books or markets come back.
Markets and periods
The markets parameter takes a comma-separated list of market keys. A period is a suffix on the key, never a separate parameter: spreads_h1 is the spread for the first half, totals_f5 is the total for the first 5 innings, and a key with no suffix (h2h, spreads, totals) is full-game. GET /v1/markets (in the Reference tables) lists every key we serve and which period it carries, so a client never has to guess from the spelling.
Sizes
Where a book publishes one, an outcome carries a typed size: a sportsbook's posted_limit is one number shared by both legs of a market; an exchange's resting_depth is per leg and changes by the second; a prediction market's contracts is a count, not a currency amount. A missing size means the book does not publish one there, not that the limit is zero.
Example
/v1/sports/americanfootball_nfl/odds?markets=h2h,spreadsGET/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds?markets=h2h_f5,totals_f5curl "https://oddslink.app/v1/sports/americanfootball_nfl/odds?markets=h2h,spreads" \
-H "X-API-Key: ok_live_..."import requests
resp = requests.get(
"https://oddslink.app/v1/sports/americanfootball_nfl/odds",
params={"markets": "h2h,spreads"},
headers={"X-API-Key": "ok_live_..."},
timeout=10,
)
resp.raise_for_status()
data = resp.json()
print(resp.headers["x-requests-remaining"])const res = await fetch(
"https://oddslink.app/v1/sports/americanfootball_nfl/odds?markets=h2h,spreads",
{ headers: { "X-API-Key": "ok_live_..." } }
);
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET",
"https://oddslink.app/v1/sports/americanfootball_nfl/odds?markets=h2h,spreads", nil)
req.Header.Set("X-API-Key", "ok_live_...")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$ch = curl_init("https://oddslink.app/v1/sports/americanfootball_nfl/odds?markets=h2h,spreads");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["X-API-Key: ok_live_..."],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);curl "https://oddslink.app/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds?markets=h2h_f5,totals_f5" \
-H "X-API-Key: ok_live_..."import requests
resp = requests.get(
"https://oddslink.app/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds",
params={"markets": "h2h_f5,totals_f5"},
headers={"X-API-Key": "ok_live_..."},
timeout=10,
)
resp.raise_for_status()
data = resp.json()
print(resp.headers["x-requests-remaining"])const res = await fetch(
"https://oddslink.app/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds?markets=h2h_f5,totals_f5",
{ headers: { "X-API-Key": "ok_live_..." } }
);
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET",
"https://oddslink.app/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds?markets=h2h_f5,totals_f5", nil)
req.Header.Set("X-API-Key", "ok_live_...")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$ch = curl_init("https://oddslink.app/v1/sports/baseball_mlb/events/mlb:orioles-brewers:2026-09-18/odds?markets=h2h_f5,totals_f5");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["X-API-Key: ok_live_..."],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);[
{
"id": "nfl:falcons-panthers:2026-09-20",
"sport_key": "americanfootball_nfl",
"sport_title": "NFL",
"commence_time": "2026-09-20T17:00:00Z",
"home_team": "Atlanta Falcons",
"away_team": "Carolina Panthers",
"bookmakers": [
{
"key": "betmgm",
"title": "BetMGM",
"last_update": "2026-09-18T18:08:20Z",
"markets": [
{
"key": "h2h",
"last_update": "2026-09-18T18:08:20Z",
"outcomes": [
{
"name": "Atlanta Falcons",
"price": 124
},
{
"name": "Carolina Panthers",
"price": -148
}
]
},
{
"key": "spreads",
"last_update": "2026-09-18T18:08:14Z",
"outcomes": [
{
"name": "Atlanta Falcons",
"price": 100,
"point": 2.5
},
{
"name": "Carolina Panthers",
"price": -120,
"point": -2.5
}
]
}
]
},
{
"key": "fanduel",
"title": "FanDuel",
"last_update": null,
"markets": [
{
"key": "h2h",
"last_update": null,
"outcomes": [
{
"name": "Atlanta Falcons",
"price": 120
},
{
"name": "Carolina Panthers",
"price": -142
}
]
},
{
"key": "spreads",
"last_update": null,
"outcomes": [
{
"name": "Atlanta Falcons",
"price": -102,
"point": 2.5,
"size": {
"kind": "posted_limit",
"amount": 5000
}
},
{
"name": "Carolina Panthers",
"price": -118,
"point": -2.5,
"size": {
"kind": "posted_limit",
"amount": 5000
}
}
]
}
]
}
],
"unmatched_bookmakers": [
"betano"
]
}
]{
"id": "mlb:orioles-brewers:2026-09-18",
"sport_key": "baseball_mlb",
"sport_title": "MLB",
"commence_time": "2026-09-18T23:06:00Z",
"home_team": "Baltimore Orioles",
"away_team": "Milwaukee Brewers",
"bookmakers": [
{
"key": "betano",
"title": "Betano",
"last_update": "2026-09-18T18:08:59Z",
"markets": [
{
"key": "h2h_f5",
"last_update": "2026-09-18T18:08:59Z",
"outcomes": [
{
"name": "Baltimore Orioles",
"price": 114
},
{
"name": "Milwaukee Brewers",
"price": -142
}
]
},
{
"key": "totals_f5",
"last_update": "2026-09-18T18:08:51Z",
"outcomes": [
{
"name": "Over",
"price": -120,
"point": 4.5
},
{
"name": "Under",
"price": -108,
"point": 4.5
}
]
}
]
},
{
"key": "prophetx",
"title": "ProphetX",
"last_update": null,
"markets": [
{
"key": "h2h_f5",
"last_update": null,
"outcomes": [
{
"name": "Baltimore Orioles",
"price": 118,
"size": {
"kind": "resting_depth",
"amount": 850
}
},
{
"name": "Milwaukee Brewers",
"price": -132,
"size": {
"kind": "resting_depth",
"amount": 600
}
}
]
}
]
}
],
"unmatched_bookmakers": []
}Formats
oddsFormat (american, the default, or decimal) and dateFormat (iso, the default, or unix) apply to every odds, props and history response the same way.