curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/main?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyFixtures Odds Main
Get current main odds for multiple fixtures.
Lookup mode: provide exactly one of:
tournamentId(recommended)fixtureIds(fast path)
If since is provided, returns odds updates with changedAt >= since.
Capped at 100 fixtures per call. The limit is fixed and cannot be raised by a parameter — limit, offset, cursor and page are not supported and are ignored if sent. Truncation is silent: a tournamentId with more than 100 fixtures, or a fixtureIds list longer than 100, still returns 200 with only the first 100 entries and no warning. To cover a larger tournament, list the fixtures first with /fixtures?tournamentId=... (uncapped) and then request odds in chunks of 100 via fixtureIds.
Response size is driven by the number of bookmakers, not the number of fixtures. A single top-league call with bookmakers=* can return tens of MiB and take ten seconds, while the same call narrowed to one bookmaker returns well under a MiB in under a second. Always pass an explicit bookmakers list in production.
curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/main?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://v5.oddspapi.io/en/fixtures/odds/main?apiKey="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/main?apiKey=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyAuthorizations
Your API key as the apiKey query parameter.
Query Parameters
Single tournamentId. Required if fixtureIds is not provided. Only the first 100 fixtures of the tournament are returned; see the endpoint description for chunking.
Comma/space-separated fixtureIds (fast path). Required if tournamentId is not provided. Maximum 100 ids — anything beyond the first 100 is silently dropped.
Comma/space-separated bookmaker slugs (default: all).
changedAt >= since (ms). If provided, returns also inactive odds.
Response
Returns an array of fixtures (fixture meta + odds + bookmaker meta).
Fixture identifier: {prefix}{sportId}{tournamentId}{nativeId} — see Core Concepts → ID structure.
The fixture that replaced this one, when a cancelled fixture has been re-listed under a new id. null is the normal value: it is only ever populated on a cancelled fixture (status.statusId 3) whose replacement already exists in the feed, so permanent cancellations stay null, and a fixture can go from null to an id after you first saw it cancelled. One hop: if the replacement was itself cancelled, follow its own reissuedFixtureId.
The inverse of reissuedFixtureId: the cancelled fixture this one replaced. Unlike the forward pointer this sits on a normal scheduled or live fixture, so a fixture carries its own history even if you never saw the cancelled one. null is the normal value. One hop and one predecessor at most — follow it repeatedly to walk back to the start of a chain, where a fixture postponed twice gives A → B → C and B carries both previousFixtureId: A and reissuedFixtureId: C. Cleared again if a postponement is reverted.
Lifecycle status of the fixture.
Show child attributes
Show child attributes
Sport reference.
Show child attributes
Show child attributes
Tournament reference.
Show child attributes
Show child attributes
Season reference, when resolved.
Show child attributes
Show child attributes
Venue reference, when known.
Show child attributes
Show child attributes
Epoch seconds (UTC).
Both participants with names, rotation numbers and abbreviations.
Show child attributes
Show child attributes
Score rows keyed by period (result, p1, …).
Show child attributes
Show child attributes
Live match clock, while in play.
Show child attributes
Show child attributes
Native identifiers of this fixture at external providers (betradar, pinnacle, …).
Show child attributes
Show child attributes
Actual start time (ISO 8601), once known — may differ from the scheduled startTime.
Actual end time (ISO 8601), once known.
Number of regular periods expected for this fixture — use it (with periodLength) to interpret period keys per sport/league.
Length of a regular period in minutes.
Per-bookmaker availability and freshness metadata. Only populated when the bookmakers query parameter is present on the request — otherwise {}. Contains only bookmakers that currently offer valid realtime odds for this fixture. Present on odds endpoints; omitted on CLV, historical-odds and settlement responses.
Show child attributes
Show child attributes