List fixtures in play, no prices
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://oddslink.app/v1/sports/nfl/events/live?league=epl&tournament=atp_beijing&dateFormat=iso&commenceTimeFrom=2026-09-20T00%3A00%3A00.000Z&commenceTimeTo=2026-09-21T00%3A00%3A00.000Z"), 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/sports/nfl/events/live?league=epl&tournament=atp_beijing&dateFormat=iso&commenceTimeFrom=2026-09-20T00%3A00%3A00.000Z&commenceTimeTo=2026-09-21T00%3A00%3A00.000Z"
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/sports/nfl/events/live?league=epl&tournament=atp_beijing&dateFormat=iso&commenceTimeFrom=2026-09-20T00%3A00%3A00.000Z&commenceTimeTo=2026-09-21T00%3A00%3A00.000Z") .get() .addHeader("X-API-Key", "<X-API-Key>") .build();
Response response = client.newCall(request).execute();const url = 'https://oddslink.app/v1/sports/nfl/events/live?league=epl&tournament=atp_beijing&dateFormat=iso&commenceTimeFrom=2026-09-20T00%3A00%3A00.000Z&commenceTimeTo=2026-09-21T00%3A00%3A00.000Z';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/nfl/events/live?league=epl&tournament=atp_beijing&dateFormat=iso&commenceTimeFrom=2026-09-20T00%3A00%3A00.000Z&commenceTimeTo=2026-09-21T00%3A00%3A00.000Z' \ --header 'X-API-Key: <X-API-Key>'/live = fixtures in play now: started and not finished, using public is_live. Needs in-play odds (Growth and up), NOT the live feed add-on. The same selectors and formats as the upcoming list apply.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”A sport key, for example nfl, soccer, tennis, epl or tennis_atp_hangzhou. soccer and tennis are aggregate keys with optional competition selectors; their legacy per-competition keys remain aliases. A well-formed tennis tournament key is accepted; one we carry no fixtures for this week returns an empty list. Esports uses one key per game: cs2, lol, dota2, valorant; use tournament= to select a tournament within that game.
Example
nflQuery Parameters
Section titled “Query Parameters”Optional soccer competition selector, using its existing public alias key (epl, not an internal provider slug). Only valid with the aggregate soccer sport key. Omitting it returns every currently available soccer competition in one response, which may be larger.
Example
eplOptional tennis competition selector, without the legacy tennis_ path prefix (atp_beijing). The tournament.key a response carries (tennis_atp_beijing) is accepted too. Valid with aggregate tennis or an esports game key (cs2, lol, dota2, valorant). For esports, pass the fixture’s tournament.key unchanged. Omitting it returns every currently available tennis competition in one response, which may be larger.
Example
atp_beijingHow 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.
Only fixtures commencing at or after this ISO-8601 UTC instant.
Example
2026-09-20T00:00:00.000ZOnly fixtures commencing at or before this ISO-8601 UTC instant.
Example
2026-09-21T00:00:00.000ZResponses
Section titled “ Responses ”Fixtures for this sport.
object
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.
Example
[ { "id": "nfl:atlantafalcons-carolinapanthers:2026-09-20", "sport_key": "nfl", "sport_title": "NFL", "commence_time": "2026-09-20T17:00:00.000Z", "is_live": false, "score": { "clock": "67:12", "updated_at": "2026-09-20T17:00:00.000Z" }, "status_evidence": { "observed_at": "2026-09-20T17:00:00.000Z" }, "league": { "key": "epl", "title": "EPL" }, "tournament": { "key": "tennis_atp_hangzhou", "title": "ATP Hangzhou" }, "best_of": 1 }]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 in-play odds (Growth plan and up). A started fixture asked for by id and every /live list are refused. Upcoming lists exclude started fixtures for every plan.
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": "PLAN_REQUIRED", "message": "In-play odds require the Growth plan or above.", "docs_url": "https://oddslink.app/docs/errors/#plan-required", "request_id": "req_01hz8k4c6l8b2c7d", "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
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": "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.
The plan’s speed limit was exceeded; wait Retry-After seconds. A call that does not count against the allowance is never refused for a spent allowance.
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": "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_01hz8k4f7m9c3d8f" }}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.
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.