One fixture's prices, any market including periods and alternates
const url = 'https://oddslink.app/v1/sports/americanfootball_nfl/events/nfl%3Afalcons-panthers%3A2026-09-20/odds?markets=h2h%2Cspreads%2Ctotals&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso';const options = {method: 'GET', headers: {'X-API-Key': '<X-API-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://oddslink.app/v1/sports/americanfootball_nfl/events/nfl%3Afalcons-panthers%3A2026-09-20/odds?markets=h2h%2Cspreads%2Ctotals&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso' \ --header 'X-API-Key: <X-API-Key>'The same shape as listOdds for exactly one fixture, but not limited to main markets. Pass any market key GET /v1/markets documents, including period suffixes (spreads_h1), alternate ladders (alternate_spreads) and team totals (team_totals, where each outcome’s description names the team).
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”A sport key, for example americanfootball_nfl or soccer_epl.
Example
americanfootball_nflA fixture id, as returned by GET /v1/sports/{sport}/events. Treat as opaque.
Example
nfl:falcons-panthers:2026-09-20Query Parameters
Section titled “Query Parameters”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,totalsComma-separated book keys. Defaults to every book when omitted.
Example
draftkings,fanduelOne number per price.
How commence_time, every last_update and recorded_at, and archive_from are written: ISO-8601 UTC strings (iso) or integer unix seconds (unix).
Responses
Section titled “ Responses ”This fixture’s prices.
object
A readable, constructible fixture id. Treat as opaque.
object
object
Market key, period suffix included (spreads_h1).
object
The team, player or side this price is for. Never home/away.
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.
The line/spread/total this price is for, always written as a decimal number (2.5, -3.0). Absent (not present) on h2h.
object
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.
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.
Examples
markets=h2h_f5,totals_f5: first 5 innings
{ "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": []}markets=h2h_h1,spreads_h1,alternate_spreads,team_totals: first half, a spread ladder and team totals
{ "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": "bovada", "title": "Bovada", "last_update": "2026-09-18T18:09:03Z", "markets": [ { "key": "h2h_h1", "last_update": "2026-09-18T18:09:03Z", "outcomes": [ { "name": "Atlanta Falcons", "price": 112 }, { "name": "Carolina Panthers", "price": -136 } ] }, { "key": "spreads_h1", "last_update": "2026-09-18T18:09:03Z", "outcomes": [ { "name": "Atlanta Falcons", "price": -120, "point": 1.5 }, { "name": "Carolina Panthers", "price": 100, "point": -1.5 } ] }, { "key": "alternate_spreads", "last_update": "2026-09-18T18:08:40Z", "outcomes": [ { "name": "Atlanta Falcons", "price": -175, "point": 5.5 }, { "name": "Carolina Panthers", "price": 145, "point": -5.5 }, { "name": "Atlanta Falcons", "price": 120, "point": -0.5 }, { "name": "Carolina Panthers", "price": -145, "point": 0.5 } ] }, { "key": "team_totals", "last_update": "2026-09-18T18:08:40Z", "outcomes": [ { "name": "Over", "description": "Atlanta Falcons", "price": -111, "point": 20.5 }, { "name": "Under", "description": "Atlanta Falcons", "price": -115, "point": 20.5 }, { "name": "Over", "description": "Carolina Panthers", "price": -110, "point": 23.5 }, { "name": "Under", "description": "Carolina Panthers", "price": -116, "point": 23.5 } ] } ] }, { "key": "draftkings", "title": "DraftKings", "last_update": null, "markets": [ { "key": "spreads_h1", "last_update": null, "outcomes": [ { "name": "Atlanta Falcons", "price": -108, "point": 0.5 }, { "name": "Carolina Panthers", "price": -112, "point": -0.5 } ] } ] } ], "unmatched_bookmakers": []}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
A parameter was malformed.
object
object
403 only: the plan on the presented key.
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.
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" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
The API key (or session) is missing or invalid.
object
object
403 only: the plan on the presented key.
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.
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" }}Key does not exist or was revoked
{ "error": { "code": "INVALID_KEY", "message": "API key is not valid.", "docs_url": "https://oddslink.app/docs/errors/#invalid-key", "request_id": "req_01hz8k4b2g4x8y3z" }}No Authorization: Bearer header sent (account endpoints only)
{ "error": { "code": "MISSING_SESSION", "message": "Sign in and try again.", "docs_url": "https://oddslink.app/docs/errors/#missing-session", "request_id": "req_01hz8k4b9h5y0z1a" }}Session is expired or invalid (account endpoints only)
{ "error": { "code": "INVALID_SESSION", "message": "Your session has expired. Sign in again.", "docs_url": "https://oddslink.app/docs/errors/#invalid-session", "request_id": "req_01hz8k4c0j6z1a2b" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
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.
object
object
403 only: the plan on the presented key.
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.
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" }}Sport key does not exist
{ "error": { "code": "UNKNOWN_SPORT", "message": "Unknown sport key: basketbal_nba", "docs_url": "https://oddslink.app/docs/errors/#unknown-sport", "request_id": "req_01hz8k4d7n9c3d8e" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
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).
object
object
403 only: the plan on the presented key.
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.
Example
{ "error": { "code": "INVALID_MARKET", "message": "Invalid markets: not_a_market", "docs_url": "https://oddslink.app/docs/errors/#invalid-market", "request_id": "req_01hz8k4e5k7a1b6c" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
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.
object
object
403 only: the plan on the presented key.
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.
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" }}The month's allowance is used up
{ "error": { "code": "ALLOWANCE_SPENT", "message": "Monthly allowance of 100000 requests used. Resets 2026-10-01.", "docs_url": "https://oddslink.app/docs/errors/#allowance-spent", "request_id": "req_01hz8k4g7m9c3d8e" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
Seconds to wait before retrying (429 SPEED_LIMIT only).
Something failed on our side.
object
object
403 only: the plan on the presented key.
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.
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" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.