Each book's closing line for one fixture
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://oddslink.app/v1/historical/sports/nfl/events/nfl%3Aatlantafalcons-carolinapanthers%3A2026-09-20/closing?markets=h2h%2Cspreads%2Ctotals&periods=full%2C1h&bookmakers=draftkings%2Cfanduel&oddsFormat=american&devig=true&fees=taker&dateFormat=iso"), Headers = { { "X-API-Key", "<X-API-Key>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://oddslink.app/v1/historical/sports/nfl/events/nfl%3Aatlantafalcons-carolinapanthers%3A2026-09-20/closing?markets=h2h%2Cspreads%2Ctotals&periods=full%2C1h&bookmakers=draftkings%2Cfanduel&oddsFormat=american&devig=true&fees=taker&dateFormat=iso"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<X-API-Key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://oddslink.app/v1/historical/sports/nfl/events/nfl%3Aatlantafalcons-carolinapanthers%3A2026-09-20/closing?markets=h2h%2Cspreads%2Ctotals&periods=full%2C1h&bookmakers=draftkings%2Cfanduel&oddsFormat=american&devig=true&fees=taker&dateFormat=iso") .get() .addHeader("X-API-Key", "<X-API-Key>") .build();
Response response = client.newCall(request).execute();const url = 'https://oddslink.app/v1/historical/sports/nfl/events/nfl%3Aatlantafalcons-carolinapanthers%3A2026-09-20/closing?markets=h2h%2Cspreads%2Ctotals&periods=full%2C1h&bookmakers=draftkings%2Cfanduel&oddsFormat=american&devig=true&fees=taker&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/historical/sports/nfl/events/nfl%3Aatlantafalcons-carolinapanthers%3A2026-09-20/closing?markets=h2h%2Cspreads%2Ctotals&periods=full%2C1h&bookmakers=draftkings%2Cfanduel&oddsFormat=american&devig=true&fees=taker&dateFormat=iso' \ --header 'X-API-Key: <X-API-Key>'The last recorded closing price for each selection strictly before the selected stored kickoff. Rows at or after that kickoff are omitted; conflicting stored kickoffs require storedCommenceTime. A stored kickoff does not establish actual kickoff. commence_time is the scheduled start; team sports often start a minute or two late, so a close’s recorded_at can fall shortly after it and is still a pre-game price. The closing line is the single most valuable row in the archive. Same shape, plan and 2-years-or-everything split as openers, including the 403 PLAN_REQUIRED for a fixture older than the plan covers.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”A historical sport key: nfl, ncaaf, nba, wnba, mlb, nhl, mma, aggregate soccer or aggregate tennis. nhl and mlb serve the same franchise fixtures as their live routes. A soccer league key such as epl serves fixtures with a recorded league matching that key, including older fixtures. Fixtures without a recorded league are served by the aggregate soccer key only. An event outside the key’s league answers 404 UNKNOWN_EVENT, like an unknown ID. League and tournament query selectors are rejected with 400 BAD_REQUEST. Tournament-specific tennis_* keys are not supported by history. Esports history also accepts cs2, lol, dota2, valorant, from the start of recording; earlier esports prices are not backfilled.
Example
nflA fixture id, as returned by GET /v1/sports/{sport}/events. Treat as opaque.
Example
nfl:atlantafalcons-carolinapanthers:2026-09-20Query Parameters
Section titled “Query Parameters”Select an exact stored listed kickoff from error.stored_commence_times or historical discovery. ISO with timezone or Unix seconds. Required when multiple eligible stored kickoffs remain. Empty duplicate kickoffs are not choices when another kickoff has recorded prices; selecting one returns INVALID_STORED_COMMENCE_TIME. Entirely empty tracked fixtures remain selectable. No archival prices are rewritten.
Comma-separated market keys, with no period in them (h2h, h2h_3_way, spreads, totals, team_totals, …); choose periods with periods. Omitting it returns the available main markets (h2h,spreads,totals). Requesting full-game spreads, totals or team_totals includes its main line followed by every available alternate line in that one market object (one object per team for team_totals). A period market has the same shape: one object per market key and period, holding every line the bookmaker posts, main line first. Outside soccer, a moneyline with a separately priced Draw uses h2h_3_way; two-way prices stay under h2h. Soccer keeps its standard result including Draw under h2h. NHL regulation-time results use h2h_3_way with period: reg. Request markets=h2h,h2h_3_way to receive both contracts, and select periods separately (for example periods=1q). Default markets remain h2h,spreads,totals and exclude h2h_3_way. Esports map-count keys are maps_handicap and maps_total; per-map round keys are rounds_handicap, rounds_total (CS2, Valorant) and kill keys are kills_handicap, kills_total (LoL, Dota 2). Request these explicitly.
Example
h2h,spreads,totalsComma-separated periods for the requested markets: 1h, 2h (halves), 1q..4q (quarters), 1p..3p (hockey periods), f5 (baseball first 5 innings), 1i (baseball first inning), 1s..5s (tennis sets), reg (hockey regulation time). Omitting it returns the full game only. full asks for the full game beside other periods (periods=full,1h); it is accepted here only, since a full-game market carries no period. all returns the full game and every period. An unknown period is 422 INVALID_MARKET. There are no F3 or F7 markets. Esports also accepts map1, map2, map3, map4, map5; use periods=full,map1 for full-match and first-map prices.
Example
full,1hComma-separated, case-sensitive book keys from /v1/bookmakers. A typo or wrong case returns 422 INVALID_BOOKMAKER with a suggested key and valid_bookmakers; it does not count against your allowance. Defaults to every book when omitted. On the odds and props routes, any book you name that returns no markets for a fixture is listed in that fixture’s unmatched_bookmakers.
Example
draftkings,fanduelOne number per price.
Adds fair_prob and fair_price to every outcome that has its complete set of sides: the price with the bookmaker’s margin removed. devig=true uses power. Methods: power (the margin comes off in proportion to each price raised to a power; keeps the favourite-longshot shape), multiplicative (the margin comes off in proportion to each implied probability; what a basic no-vig calculator shows), shin, additive (for a two-way market shin and additive give the same numbers). On a lopsided market power and multiplicative differ by a point or more (1.20/5.00: 82.2 % vs 80.7 %). The method used comes back in the X-Devig-Method header. An outcome whose partner side is missing, or whose set is crossed or an exchange stub, carries no fair_* fields. Exchange and prediction-market prices are asks, so the gap between the two sides is the spread, not a margin; fair_prob is then the middle of the spread. Requires the Starter plan or above (403 PLAN_REQUIRED on Free).
fees=taker adds net_price to the outcomes of exchanges and prediction markets that charge a fee, and a fees object to each such market describing the published schedule used. net_price is the price after the taker fee, in the same oddsFormat as price (decimal to 3 places). Per-contract venues (Polymarket, Kalshi, Novig): the fee grows with price x (1 - price) and the figure is for a large order (Kalshi and Fanatics round each order up to the cent). Commission venues (SX Bet, ProphetX, Betfair, 4Casters): commission on winnings, so net_price is the price if the bet wins. Fanatics Markets prices already include its fee (fees.model is included, no net_price). Account tiers, discounts and promotions change what you pay; the published rate is shown. A venue or date with no published schedule carries neither field. Requires the Starter plan or above.
How commence_time, every last_update and recorded_at, and archive_from are written: ISO-8601 UTC strings with exactly three fractional digits and trailing Z (iso, e.g. 2026-10-11T13:00:00.000Z) or unix seconds (unix). ISO sub-millisecond digits are truncated. Unix price clocks may be fractional; fixture and gameline archive times use whole seconds.
Responses
Section titled “ Responses ”Closing lines for this fixture.
object
Fixture-level recording result; recorded_no_rows means a stored fixture has no returned price rows; it makes no claim about price movement.
Explanation of the stored history result.
A readable, constructible fixture id. Treat as opaque.
true from scheduled commence_time until the sport-specific live-window cutoff; false outside that window. Inferred from time, not a confirmed match-status or final-result feed, except reliable source terminal evidence makes it false. See the additive status and status_evidence fields. A delayed start, early finish or unusually long fixture can disagree with this flag. Evaluated when the response is served, so it can flip without a price change. On the WebSocket feed a flip arrives as a status upsert. Historical routes apply the same time-derived rule.
On current fixture routes, scheduled means the fixture has not started, including a delayed start. Live requires is_live to be true and a fresh observation of a linked book’s own in-play state, identified by status_evidence. Unknown means neither live play nor finish is confirmed. Finished requires retained explicit terminal evidence. These values are additive; clients must accept new values. Historical props use their separately documented recording status. Archive presence and absent prices alone never prove finish.
Present only for covered live soccer and tennis fixtures with a fresh observation. All sides follow home_team and away_team. Soccer clocks are cumulative observed match time, without extrapolation. Tennis totals count completed sets; ambiguous totals are omitted. Uncovered or stale scores are absent.
object
object
object
The book, its observed state and observation time supporting live or finished status. Absent when no supporting observation is available.
Soccer fixtures only: the league a fixture belongs to. key is the public sport key when the league has one (epl; pass it as soccer?league= or as the sport key), else a stable key for that league; title is its display name. null when the league is not known for the fixture. Historical bodies carry the same object; a fixture archived before its league was recorded has league: null unless the sport key you asked with names one (epl). Other sports carry no league (tennis and esports carry tournament; every other sport key is one league).
object
Tennis and esports fixtures: the tournament a match belongs to. key is the tournament’s public sport key (tennis_atp_hangzhou; pass it as tennis?tournament= or as the sport key); title is its display name. null when the tournament is not known. Historical bodies carry the same object. For esports, key identifies the tournament within the requested game and is accepted by tournament= on events and odds lists.
object
Esports series format. Present only when known and the books agree; absent when unknown. A BO2 Draw is represented by h2h_3_way independently of this field.
object
object
The slice of the game a market settles on: 1h/2h halves, 1q..4q quarters, 1p..3p hockey periods, f5 baseball’s first 5 innings, 1i baseball’s first inning, 1s..5s tennis sets, reg hockey regulation time. Absent on a full-game market; never full. More periods may be added. There are no F3 or F7 markets. Esports map periods are map1 through map5; full-match markets omit the period field.
recorded or not_recorded today. More values may be added.
Team names match the fixture’s display names. Moneyline outcomes are away, home, then Draw; spreads are away then home per mirrored rung. Totals are Over then Under per rung.
A recorded sportsbook price or exchange/prediction-market probability quote. Probability quotes use the existing bookmaker key (polymarket, kalshi, sxbet, shuffle or sportbet). Their price is null in either odds format; bid_prob, ask_prob and mid_prob are present, with null for any missing value. No complementary side or American/decimal price is inferred. Venue checkpoints have no opening line. Size is not recorded for these quotes.
object
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; no bookmaker uses it today (Kalshi and Polymarket report resting_depth in dollars at the best price). More kinds may be added. The kind is fixed per bookmaker (GET /v1/bookmakers size_kind).
Always a positive number. A posted_limit or resting_depth amount is in the bookmaker’s own currency; a contracts amount is a count. The same object appears on every line the bookmaker states a size for, including alternate lines and periods.
Mean of bid and ask when both exist, otherwise null.
With devig, as on live odds. Absent where the set of sides is not complete.
With devig, fair_prob as a price in the request’s oddsFormat.
With fees: price after the taker fee under the schedule in force on recorded_at. Computed from ask_prob for an exchange quote that has no price. Absent where no schedule covers that date.
With fees: the published fee schedule behind this market’s net_price values. included means the venue’s price already contains the fee and no net_price is added.
object
per_contract: a fee per contract that grows with price x (1 - price) (Polymarket, Kalshi, Novig). on_winnings: commission on winnings (SX Bet, ProphetX, Betfair, 4Casters). included: already in price (Fanatics Markets).
The rate net_price uses. Absent when model is included. Where the venue’s rate depends on the customer’s country (Betfair, Matchbook) this is the rate for its home countries (UK and Ireland) and rate_elsewhere is the rate for everyone else.
Present only where the rate depends on the customer’s country.
published: the venue’s published rate for this book. schedule: a sport-level schedule (Polymarket sets its rate per market, and we apply the rate that sport’s markets carry); a market created before the sport’s last rate change can differ.
The day this rate took effect.
Examples
The last price recorded before kickoff
{ "id": "nfl:atlantafalcons-carolinapanthers:2026-09-20", "sport_key": "nfl", "sport_title": "NFL", "commence_time": "2026-09-20T17:00:00.000Z", "is_live": false, "home_team": "Atlanta Falcons", "away_team": "Carolina Panthers", "bookmakers": [ { "key": "draftkings", "title": "DraftKings", "markets": [ { "key": "spreads", "status": "recorded", "recorded_at": "2026-09-20T16:59:41.000Z", "outcomes": [ { "name": "Atlanta Falcons", "price": 100, "point": 2.5, "main": true }, { "name": "Carolina Panthers", "price": -120, "point": -2.5, "main": true } ] } ] } ], "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
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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 X-API-Key header is missing or invalid.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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" }}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 history (Scale plan and up), or does not reach back to this fixture: Scale covers fixtures that started in the last 2 years, Business covers everything recorded.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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
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" }}This fixture is older than the plan's 2-year window
{ "error": { "code": "PLAN_REQUIRED", "message": "The Scale plan covers fixtures that started in the last 2 years. This one started 2024-09-02; the Business plan covers everything recorded.", "docs_url": "https://oddslink.app/docs/errors/#plan-required", "request_id": "req_01hz8k4c5k7a1b6c", "current_plan": "scale", "required_plan": "business" }}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
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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 nfl: nfl:atlantafalcons-carolinapanthers: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.
Conflicting listed kickoffs; select an exact stored choice.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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": "AMBIGUOUS_EVENT", "message": "Select a stored kickoff with storedCommenceTime.", "stored_commence_times": [ 1790528400, 1790539200 ], "docs_url": "https://oddslink.app/docs/errors/#ambiguous-event", "request_id": "req_example" }}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.
Malformed history filter, cursor, market or stored kickoff selection.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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
{ "error": { "code": "INVALID_STORED_COMMENCE_TIME", "message": "Select an exact stored kickoff.", "docs_url": "https://oddslink.app/docs/errors/#invalid-stored-commence-time", "request_id": "req_example" }}{ "error": { "code": "INVALID_CURSOR", "message": "Cursor is invalid or belongs to different filters.", "docs_url": "https://oddslink.app/docs/errors/#invalid-cursor", "request_id": "req_example" }}{ "error": { "code": "INVALID_PARAMETER", "message": "Use an ISO timestamp with timezone or Unix seconds.", "docs_url": "https://oddslink.app/docs/errors/#invalid-parameter", "request_id": "req_example" }}{ "error": { "code": "INVALID_BOOKMAKER", "message": "Unknown bookmaker 'DraftKings'; did you mean draftkings? Valid keys are listed in error.valid_bookmakers.", "valid_bookmakers": [ "1xbet", "4casters", "888sport", "ballybet", "bet105", "bet365", "betano", "betfair", "betmgm", "betonline", "betr", "betrivers", "betus", "betway", "bovada", "bwin", "caesars", "circa", "cloudbet", "draftkings", "fanatics", "fanaticsmarkets", "fanduel", "fliff", "hardrock", "kalshi", "ladbrokes", "lowvig", "matchbook", "novig", "pinnacle", "polymarket", "prizepicks", "prophetx", "rebet", "sbobet", "shuffle", "skybet", "sportbet", "stake", "sxbet", "thescore", "thunderpick", "underdog", "unibet", "williamhill" ], "docs_url": "https://oddslink.app/docs/errors/#invalid-bookmaker", "request_id": "req_example" }}{ "error": { "code": "INVALID_MARKET", "message": "Invalid markets: unknown", "docs_url": "https://oddslink.app/docs/errors/#invalid-market", "request_id": "req_example" }}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
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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 on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE.
No built prices are available yet. Retry after the indicated number of seconds.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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": "ODDS_UNAVAILABLE", "message": "No built prices are available yet.", "docs_url": "https://oddslink.app/docs/errors/#odds-unavailable", "request_id": "req_example" }}Headers
Section titled “Headers”Seconds to wait before retrying on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE.
Something failed on our side.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
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.