curl --request GET \
--url https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing"
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/closing', 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/closing",
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/closing"
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/closing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing")
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>",
"last_bookmaker": "<string>",
"last_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>",
"last_tied_with": [
"<string>"
],
"consensus_line": 123,
"consensus_price_decimal": 123
}
]
}
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Closing lines
Each bookmaker’s last price before the fixture started, and the consensus across them.
Distinct from the close side of /odds/clv, which derives its anchor
from the tick history in ClickHouse: that answer drifts as history ages
past the 13-month retention and eventually stops existing. This is a
stored fact that does not move.
consensus_line and consensus_price_decimal are medians, not means:
one book sitting on a stale number drags a mean and leaves a median
alone.
Coverage caveat: “closed at” means the last price we OBSERVED before the start. A book we stopped polling an hour before kickoff contributes its hour-old price, and nothing in the data distinguishes that from a book that genuinely never moved.
Requires the signals entitlement (Max plan). See Responses & Errors for the success envelope and availability rules.
curl --request GET \
--url https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing"
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/closing', 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/closing",
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/closing"
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/closing")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/closing")
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>",
"last_bookmaker": "<string>",
"last_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>",
"last_tied_with": [
"<string>"
],
"consensus_line": 123,
"consensus_price_decimal": 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: npb.
npb Query Parameters
CSV of bookmaker IDs.
CSV of market keys.
Quoted price format; American by default.
american, decimal Response
Closing prices per market and selection.
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.