Player props across a sport's fixtures
const url = 'https://oddslink.app/v1/sports/americanfootball_nfl/props?markets=player_anytime_td%2Cplayer_pass_yds&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso&eventIds=nfl%3Afalcons-panthers%3A2026-09-20%2Cnfl%3Aravens-saints%3A2026-09-20';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/props?markets=player_anytime_td%2Cplayer_pass_yds&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso&eventIds=nfl%3Afalcons-panthers%3A2026-09-20%2Cnfl%3Aravens-saints%3A2026-09-20' \ --header 'X-API-Key: <X-API-Key>'Player props for one or more fixtures in a sport. Requires the Growth plan or above. Each row covers one (player, stat, line) per book, with every outcome for that line (an over and an under, or a single side for a binary prop) together in one place. stat uses familiar market-key names such as player_pass_yds and batter_hits.
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_nflQuery Parameters
Section titled “Query Parameters”Comma-separated player-prop market keys, for example player_pass_yds or player_anytime_td. Required: there is no default set of props. GET /v1/markets lists every prop key.
Example
player_anytime_td,player_pass_ydsComma-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).
Comma-separated fixture ids, to narrow a list call to specific fixtures.
Example
nfl:falcons-panthers:2026-09-20,nfl:ravens-saints:2026-09-20Responses
Section titled “ Responses ”Props for the matching fixtures.
object
A readable, constructible fixture id. Treat as opaque.
object
A market key, period suffix included, for example player_pass_yds.
The line for this stat. Absent for a binary (Yes/No) prop.
object
Over, Under, Yes or No today. More sides may be added.
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.
Examples
One fixture's anytime-TD and passing-yards props
[ { "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", "props": [ { "bookmaker": { "key": "betrivers", "title": "BetRivers", "last_update": "2026-09-18T18:07:25Z" }, "player": "Bijan Robinson", "stat": "player_anytime_td", "outcomes": [ { "name": "Yes", "price": -195 } ] }, { "bookmaker": { "key": "bovada", "title": "Bovada", "last_update": "2026-09-18T18:07:31Z" }, "player": "Bryce Young", "stat": "player_pass_yds", "point": 224.5, "outcomes": [ { "name": "Over", "price": -115 }, { "name": "Under", "price": -105 } ] } ], "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 key’s plan does not include props (Growth plan and up).
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": "PLAN_REQUIRED", "message": "Props require the Growth plan or above.", "docs_url": "https://oddslink.app/docs/errors/#plan-required", "request_id": "req_01hz8k4c3h5y9z4a", "current_plan": "starter", "required_plan": "growth" }}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 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.
Example
{ "error": { "code": "UNKNOWN_SPORT", "message": "Unknown sport key: basketbal_nba", "docs_url": "https://oddslink.app/docs/errors/#unknown-sport", "request_id": "req_01hz8k4d4j6z0a5b" }}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.