curl --request GET \
--url https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening', 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://api.sportquanta.com/v1/{league}/games/{id}/odds/opening",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.sportquanta.com/v1/{league}/games/{id}/odds/opening"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"data": {
"game_id": "<string>",
"league": "<string>",
"bookmakers": [
"<string>"
],
"markets": [
{
"market": "<string>",
"selection": "<string>",
"first_bookmaker": "<string>",
"first_observed_at": "2023-11-07T05:31:56Z",
"book_count": 123,
"books": [
{
"bookmaker": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"line": 123,
"price_decimal": 123,
"price_american": 123,
"source_id": "<string>",
"origin": "<string>",
"recorded_at": "2023-11-07T05:31:56Z"
}
],
"period": "<string>",
"first_tied_with": [
"<string>"
],
"lead_seconds": 123
}
]
}
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Opening lines
Which bookmaker posted each market first, at what line and price,
and when — read from a durable per-book ledger
(sportquanta_ingestion.openingOdds), not derived from ClickHouse
history. Unlike the current-odds and history endpoints, this does
not age out: an opener recorded here survives the 13-month
ClickHouse retention window that the odds-history endpoints are
bounded by.
Coverage note: “first” means first among the bookmakers that were actively being scraped at the time. A book whose route was enabled after a market opened cannot win, and the response does not distinguish that from a book that genuinely posted later.
Requires the stats entitlement (a paid plan). See Responses & Errors for the success envelope and availability rules.
curl --request GET \
--url https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening', 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://api.sportquanta.com/v1/{league}/games/{id}/odds/opening",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.sportquanta.com/v1/{league}/games/{id}/odds/opening"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/opening")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"data": {
"game_id": "<string>",
"league": "<string>",
"bookmakers": [
"<string>"
],
"markets": [
{
"market": "<string>",
"selection": "<string>",
"first_bookmaker": "<string>",
"first_observed_at": "2023-11-07T05:31:56Z",
"book_count": 123,
"books": [
{
"bookmaker": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"line": 123,
"price_decimal": 123,
"price_american": 123,
"source_id": "<string>",
"origin": "<string>",
"recorded_at": "2023-11-07T05:31:56Z"
}
],
"period": "<string>",
"first_tied_with": [
"<string>"
],
"lead_seconds": 123
}
]
}
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Authorizations
Send a workspace API token in the Authorization: Bearer <token> header.
Path Parameters
League for this reference section: kbo.
kbo Query Parameters
Comma-separated bookmaker ids to include.
Comma-separated market keys to include.
Price format for quoted odds.
decimal, american Response
Opening line per market: the earliest bookmaker (with any tied bookmakers and the lead time to the next distinct observation), plus the full per-book ladder of opening observations.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
live, cache Response cache TTL; independent of source freshness. Omitted when zero.
Endpoint-specific availability context, including soccer roster coverage.