curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/parlay?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/parlay?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/parlay?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/parlay?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/parlay?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/parlay?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/parlay?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_body[
{
"fixtureId": "id1400003160574217",
"status": {
"live": false,
"statusId": 0,
"statusName": "Pre-Game"
},
"sport": {
"sportId": 14,
"sportName": "American Football"
},
"tournament": {
"tournamentId": 31,
"tournamentName": "NFL",
"categoryName": "USA"
},
"season": {
"seasonId": 31625,
"seasonName": "NFL 25/26",
"seasonRound": 16
},
"venue": {
"venueId": 5821,
"venueSlug": "ford-field",
"venueName": "Ford Field",
"venueLocation": "Detroit, MI, USA"
},
"startTime": 1766698200,
"participants": {
"participant1Id": 4423,
"participant1RotNr": 271,
"participant1Name": "Minnesota Vikings",
"participant1ShortName": "Minnesota",
"participant1Abbr": "MIN",
"participant2Id": 4419,
"participant2RotNr": 272,
"participant2Name": "Detroit Lions",
"participant2ShortName": "Detroit",
"participant2Abbr": "DET"
},
"scores": {},
"clock": {
"currentPeriod": null,
"currentTime": null,
"remainingTime": null,
"remainingTimeInPeriod": null,
"stopped": null
},
"expectedPeriods": 4,
"periodLength": 15,
"externalProviders": {
"betgeniusId": 13755104,
"betradarId": 60574217,
"pinnacleId": 1620331774
},
"odds": {
"bet365": {
"id1400003160574217:bet365:141:0": {
"bookmaker": "bet365",
"outcomeId": 141,
"playerId": 0,
"active": true,
"price": 3.8,
"marketActive": true,
"mainLine": true,
"priceAmerican": 280,
"marketId": 141,
"changedAt": 1766667441097
},
"id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"outcomeId": 146,
"playerId": 0,
"active": true,
"price": 2.1,
"marketActive": true,
"mainLine": true,
"priceAmerican": 110,
"marketId": 146,
"changedAt": 1766667441097
}
}
},
"bookmakers": {
"bet365": {
"bookmaker": "bet365",
"bookmakerFixtureId": "186526495",
"fixturePath": null,
"hasOdds": true,
"staleOdds": false,
"suspended": false,
"participantsRotated": false,
"updatedAt": "2025-12-16T23:21:33.763847+00:00"
}
},
"parlay": {
"bet365": {
"id1400003160574217:bet365:141:0,id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"active": true,
"price": 7.98,
"priceFractional": "349/50",
"priceAmerican": 698,
"singlesPrice": 7.98,
"changedAt": 1766667441097
}
}
}
}
]Parlay Odds
Price a parlay (accumulator) from selected oddsIds.
The legs are grouped by bookmaker and each group’s prices are multiplied locally — no bookmaker round-trip and no correlation adjustment. Legs may span several fixtures and sports; for a correlated same-game price use /fixtures/odds/sgp.
Returns one normal fixture view per fixture a leg belongs to, ordered by fixtureId, each with a parlay section added. A cross-fixture parlay appears on every involved fixture with the same entry.
Max 20 legs per request.
curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/parlay?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/parlay?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/parlay?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/parlay?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/parlay?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/parlay?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/parlay?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_body[
{
"fixtureId": "id1400003160574217",
"status": {
"live": false,
"statusId": 0,
"statusName": "Pre-Game"
},
"sport": {
"sportId": 14,
"sportName": "American Football"
},
"tournament": {
"tournamentId": 31,
"tournamentName": "NFL",
"categoryName": "USA"
},
"season": {
"seasonId": 31625,
"seasonName": "NFL 25/26",
"seasonRound": 16
},
"venue": {
"venueId": 5821,
"venueSlug": "ford-field",
"venueName": "Ford Field",
"venueLocation": "Detroit, MI, USA"
},
"startTime": 1766698200,
"participants": {
"participant1Id": 4423,
"participant1RotNr": 271,
"participant1Name": "Minnesota Vikings",
"participant1ShortName": "Minnesota",
"participant1Abbr": "MIN",
"participant2Id": 4419,
"participant2RotNr": 272,
"participant2Name": "Detroit Lions",
"participant2ShortName": "Detroit",
"participant2Abbr": "DET"
},
"scores": {},
"clock": {
"currentPeriod": null,
"currentTime": null,
"remainingTime": null,
"remainingTimeInPeriod": null,
"stopped": null
},
"expectedPeriods": 4,
"periodLength": 15,
"externalProviders": {
"betgeniusId": 13755104,
"betradarId": 60574217,
"pinnacleId": 1620331774
},
"odds": {
"bet365": {
"id1400003160574217:bet365:141:0": {
"bookmaker": "bet365",
"outcomeId": 141,
"playerId": 0,
"active": true,
"price": 3.8,
"marketActive": true,
"mainLine": true,
"priceAmerican": 280,
"marketId": 141,
"changedAt": 1766667441097
},
"id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"outcomeId": 146,
"playerId": 0,
"active": true,
"price": 2.1,
"marketActive": true,
"mainLine": true,
"priceAmerican": 110,
"marketId": 146,
"changedAt": 1766667441097
}
}
},
"bookmakers": {
"bet365": {
"bookmaker": "bet365",
"bookmakerFixtureId": "186526495",
"fixturePath": null,
"hasOdds": true,
"staleOdds": false,
"suspended": false,
"participantsRotated": false,
"updatedAt": "2025-12-16T23:21:33.763847+00:00"
}
},
"parlay": {
"bet365": {
"id1400003160574217:bet365:141:0,id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"active": true,
"price": 7.98,
"priceFractional": "349/50",
"priceAmerican": 698,
"singlesPrice": 7.98,
"changedAt": 1766667441097
}
}
}
}
]Authorizations
Your API key as the apiKey query parameter.
Query Parameters
Comma- or space-separated oddsIds in the form {fixtureId}:{bookmaker}:{outcomeId}:{playerId}. Duplicates are removed and the list is sorted. Each bookmaker's legs form one parlay. Max 20 legs.
Response
One FixtureParlayResponse per involved fixture, ordered by fixtureId.
Fixture identifier: {prefix}{sportId}{tournamentId}{nativeId} — see Core Concepts → ID structure.
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, …).
bookmakerSlug -> BookmakerFixtureMeta, for the requested bookmakers only.
Show child attributes
Show child attributes
The requested legs of this fixture and nothing else — inactive ones included (no activeOnly filtering). Identical in shape and content to what /fixtures/odds returns for those rows.
Show child attributes
Show child attributes
bookmakerSlug -> (parlayId -> ParlayEntry). parlayId is the sorted, deduped oddsIds joined by ,. A bookmaker whose legs could not all be found is omitted entirely, so this object can be {}.
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.
Requested oddsIds of this fixture that could not be found (unknown bookmaker, unknown or expired oddsId). Present only when at least one leg is missing.