Player props for one fixture
const url = 'https://oddslink.app/v1/sports/americanfootball_nfl/events/nfl%3Afalcons-panthers%3A2026-09-20/props?markets=player_anytime_td%2Cplayer_pass_yds&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/props?markets=player_anytime_td%2Cplayer_pass_yds&bookmakers=draftkings%2Cfanduel&oddsFormat=american&dateFormat=iso' \ --header 'X-API-Key: <X-API-Key>'The same row shape as listProps, scoped to exactly one fixture. Growth plan and up.
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 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).
Responses
Section titled “ Responses ”This fixture’s props.
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
NFL anytime-TD and passing-yards props for one fixture
{ "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, 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.