curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/sgp?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/sgp?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/sgp?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/sgp?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/sgp?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/sgp?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/sgp?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"
}
},
"sgp": {
"bet365": {
"id1400003160574217:bet365:141:0,id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"active": true,
"price": 6.5,
"priceFractional": "11/2",
"priceAmerican": 550,
"limit": 500,
"singlesPrice": 7.98,
"changedAt": 1766667441097,
"bookmakerParlayId": "B365-2493810567",
"bookmakerChangedAt": 1766667440813,
"betslip": "https://www.bet365.com/dl/sportsbookredirect?bs=..."
}
}
}
}Same-Game Parlay Odds
Price a correlated same-game parlay (SGP) from selected oddsIds.
All oddsIds must belong to one fixture. The legs are priced by the bookmaker itself, so price reflects the correlation between them; singlesPrice is the naive product and the gap is the correlation margin. Several bookmakers may be requested at once and are returned side by side.
Returns ONE fixture view with an sgp section added.
Max 20 legs per request.
curl --request GET \
--url 'https://v5.oddspapi.io/en/fixtures/odds/sgp?apiKey='import requests
url = "https://v5.oddspapi.io/en/fixtures/odds/sgp?apiKey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://v5.oddspapi.io/en/fixtures/odds/sgp?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/sgp?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/sgp?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/sgp?apiKey=")
.asString();require 'uri'
require 'net/http'
url = URI("https://v5.oddspapi.io/en/fixtures/odds/sgp?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"
}
},
"sgp": {
"bet365": {
"id1400003160574217:bet365:141:0,id1400003160574217:bet365:146:0": {
"bookmaker": "bet365",
"active": true,
"price": 6.5,
"priceFractional": "11/2",
"priceAmerican": 550,
"limit": 500,
"singlesPrice": 7.98,
"changedAt": 1766667441097,
"bookmakerParlayId": "B365-2493810567",
"bookmakerChangedAt": 1766667440813,
"betslip": "https://www.bet365.com/dl/sportsbookredirect?bs=..."
}
}
}
}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. All must share one fixture.
Response
One FixtureSgpResponse for the fixture the legs belong to.
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 and nothing else — inactive ones included (no activeOnly filtering).
Show child attributes
Show child attributes
bookmakerSlug -> (parlayId -> SgpEntry). parlayId is built exactly as on /fixtures/odds/parlay, so the two are directly comparable. A bookmaker is omitted — leaving {} — when its legs were not all found, or when they were but its own pricing service could not quote the parlay (in which case there is no missingOddsIds).
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.