Skip to content

List a sport's fixtures with prices

GET
/v1/sports/{sport}/odds
curl --request GET \
--url 'https://oddslink.app/v1/sports/americanfootball_nfl/odds?markets=h2h%2Cspreads%2Ctotals&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso&eventIds=nfl%3Afalcons-panthers%3A2026-09-20%2Cnfl%3Aravens-saints%3A2026-09-20&commenceTimeFrom=2026-09-20T00%3A00%3A00Z&commenceTimeTo=2026-09-21T00%3A00%3A00Z' \
--header 'X-API-Key: <X-API-Key>'

Every fixture for one sport key, each with every book’s price for the requested markets. This is the call that counts against your allowance: one request regardless of how many fixtures or books come back.

sport
required
string

A sport key, for example americanfootball_nfl or soccer_epl.

Example
americanfootball_nfl
markets
string

Comma-separated market keys, period suffix included (spreads_h1, totals_f5). Defaults to the main full-game markets (h2h,spreads,totals) when omitted.

Example
h2h,spreads,totals
bookmakers
string

Comma-separated book keys. Defaults to every book when omitted.

Example
draftkings,fanduel
oddsFormat
string
default: american
Allowed values: american decimal

One number per price.

dateFormat
string
default: iso
Allowed values: iso unix

How commence_time, every last_update and recorded_at, and archive_from are written: ISO-8601 UTC strings (iso) or integer unix seconds (unix).

eventIds
string

Comma-separated fixture ids, to narrow a list call to specific fixtures.

Example
nfl:falcons-panthers:2026-09-20,nfl:ravens-saints:2026-09-20
commenceTimeFrom
string format: date-time

Only fixtures commencing at or after this ISO-8601 UTC instant.

Example
2026-09-20T00:00:00Z
commenceTimeTo
string format: date-time

Only fixtures commencing at or before this ISO-8601 UTC instant.

Example
2026-09-21T00:00:00Z

Fixtures with prices.

Media typeapplication/json
Array
object
id
required

A readable, constructible fixture id. Treat as opaque.

string
sport_key
required
string
sport_title
required
string
commence_time
required
Any of:

ISO-8601 UTC, always with a Z.

string format: date-time
home_team
required
string
away_team
required
string
bookmakers
required
Array<object>
object
key
required
string
title
required
string
last_update
required
Any of:
Any of:

ISO-8601 UTC, always with a Z.

string format: date-time
markets
required
Array<object>
object
key
required

Market key, period suffix included (spreads_h1).

string
last_update
required
Any of:
Any of:

ISO-8601 UTC, always with a Z.

string format: date-time
outcomes
required
Array<object>
object
name
required

The team, player or side this price is for. Never home/away.

string
description

Present where name alone does not say what the price is for. On team_totals (and its period variants) name is Over or Under and description is the team the total belongs to.

string
price
required
Any of:

American odds: an integer of +100 or more, or -100 or less (124, -110). Never between -100 and +100, and never fractional.

integer
>= -99 <= 99
point

The line/spread/total this price is for, always written as a decimal number (2.5, -3.0). Absent (not present) on h2h.

number
size
object
kind
required

posted_limit: one number that applies to both legs, a sportsbook’s maximum bet. resting_depth: a separate number per leg, an exchange’s live order book. contracts: a contract count, as an exchange like Kalshi reports it. More kinds may be added.

string
amount
required
number
unmatched_bookmakers
required

Book keys that had a price for this fixture but could not be safely matched to it. Present, and possibly empty, on every successful response. Never silently dropped.

Array<string>
Examples

Default format: American odds, ISO-8601 times

[
{
"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"
]
}
]
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

A parameter was malformed.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Example
{
"error": {
"code": "BAD_REQUEST",
"message": "commenceTimeFrom is not a valid ISO-8601 timestamp.",
"docs_url": "https://oddslink.app/docs/errors/#bad-request",
"request_id": "req_01hz8k3z9e2v6w1x"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

The API key (or session) is missing or invalid.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Examples

No X-API-Key header sent

{
"error": {
"code": "MISSING_KEY",
"message": "X-API-Key header is missing.",
"docs_url": "https://oddslink.app/docs/errors/#missing-key",
"request_id": "req_01hz8k4a1f3w7x2y"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

The sport key does not exist.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Example
{
"error": {
"code": "UNKNOWN_SPORT",
"message": "Unknown sport key: basketbal_nba",
"docs_url": "https://oddslink.app/docs/errors/#unknown-sport",
"request_id": "req_01hz8k4d4j6z0a5b"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

A parameter was well-formed but not valid (an unknown market key, for example).

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Example
{
"error": {
"code": "INVALID_MARKET",
"message": "Invalid markets: not_a_market",
"docs_url": "https://oddslink.app/docs/errors/#invalid-market",
"request_id": "req_01hz8k4e5k7a1b6c"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

Either the plan’s speed limit or its monthly allowance was exceeded. error.code tells you which. Only the calls that count against the allowance can answer ALLOWANCE_SPENT.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Examples

Too many requests this second (Retry-After is set)

{
"error": {
"code": "SPEED_LIMIT",
"message": "Speed limit exceeded: 10 requests/second on the Growth plan.",
"docs_url": "https://oddslink.app/docs/errors/#speed-limit",
"request_id": "req_01hz8k4f6l8b2c7d"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.

Retry-After
integer

Seconds to wait before retrying (429 SPEED_LIMIT only).

Something failed on our side.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
docs_url
required
string format: uri
request_id
required
string
current_plan

403 only: the plan on the presented key.

string
required_plan

403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.

string
Example
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Something went wrong on our side. It has been logged.",
"docs_url": "https://oddslink.app/docs/errors/#internal-error",
"request_id": "req_01hz8k4h8n0d4e9f"
}
}
x-requests-used
integer

Requests used this billing period.

x-requests-remaining
integer

Requests remaining this billing period.

x-requests-last
integer

What this one call cost against the allowance (0 for a free call).

X-RateLimit-Limit
integer

This plan’s speed limit, in requests per second.

X-RateLimit-Remaining
integer

Requests left in the current one-second window.

X-RateLimit-Reset
integer

Seconds until the speed-limit window resets.

X-Request-Id
string

This request’s id, for support and for matching against error.request_id.