Skip to content

Each book's opening line for one fixture

GET
/v1/historical/sports/{sport}/events/{id}/openers
curl --request GET \
--url 'https://oddslink.app/v1/historical/sports/americanfootball_nfl/events/nfl%3Afalcons-panthers%3A2026-09-20/openers?markets=h2h%2Cspreads%2Ctotals&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso' \
--header 'X-API-Key: <X-API-Key>'

The first price each book showed for each market on this fixture, its opening line. Requires the Scale plan or above, with the same 14-day-or-everything split as the series endpoint (an older fixture on Scale is a 403 PLAN_REQUIRED naming business). A market with nothing recorded is returned with status: not_recorded rather than left out of the list.

sport
required
string

A sport key, for example americanfootball_nfl or soccer_epl.

Example
americanfootball_nfl
id
required
string

A fixture id, as returned by GET /v1/sports/{sport}/events. Treat as opaque.

Example
nfl:falcons-panthers:2026-09-20
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).

Opening lines for this fixture.

Media typeapplication/json
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
markets
required
Array<object>
object
key
required
string
status
required

recorded or not_recorded today. More values may be added.

string
recorded_at
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
Array<string>
Examples
Exampleopeners

One recorded market, one never captured

{
"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": "draftkings",
"title": "DraftKings",
"markets": [
{
"key": "spreads",
"status": "recorded",
"recorded_at": "2026-09-15T14:00:03Z",
"outcomes": [
{
"name": "Atlanta Falcons",
"price": -110,
"point": 3
},
{
"name": "Carolina Panthers",
"price": -110,
"point": -3
}
]
},
{
"key": "h2h_h1",
"status": "not_recorded",
"recorded_at": null,
"outcomes": []
}
]
}
],
"unmatched_bookmakers": []
}
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 key’s plan does not include history (Scale plan and up), or does not reach back to this fixture: Scale covers fixtures that started in the last 14 days, Business covers everything recorded.

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

History is not on this plan

{
"error": {
"code": "PLAN_REQUIRED",
"message": "History requires the Scale plan or above.",
"docs_url": "https://oddslink.app/docs/errors/#plan-required",
"request_id": "req_01hz8k4c4j6z0a5b",
"current_plan": "growth",
"required_plan": "scale"
}
}
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, or the fixture id within it, 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
Examples

No fixture with this id under this sport key

{
"error": {
"code": "UNKNOWN_EVENT",
"message": "Unknown fixture id for americanfootball_nfl: nfl:falcons-panthers:2026-09-27",
"docs_url": "https://oddslink.app/docs/errors/#unknown-event",
"request_id": "req_01hz8k4d6m8b2c7d"
}
}
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.