curl --request GET \
--url https://api.sportquanta.com/v1/coverage/bookmakersimport requests
url = "https://api.sportquanta.com/v1/coverage/bookmakers"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sportquanta.com/v1/coverage/bookmakers', 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/coverage/bookmakers",
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://api.sportquanta.com/v1/coverage/bookmakers"
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://api.sportquanta.com/v1/coverage/bookmakers")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/coverage/bookmakers")
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{
"data": {
"generated_at": "2026-08-29T12:00:00Z",
"leagues": [
{
"league_id": "nba",
"sport_id": "basketball",
"active": true
},
{
"league_id": "kbo",
"sport_id": "baseball",
"active": false
}
],
"bookmakers": [
"bet365",
"pinnacle",
"sbobet"
],
"cells": [
{
"league_id": "nba",
"bookmaker_id": "pinnacle",
"class": "sharp",
"status": "ok",
"reason_code": "recent_snapshots",
"route_count": 3,
"enabled_route_count": 3
},
{
"league_id": "nba",
"bookmaker_id": "sbobet",
"class": "sharp",
"status": "degraded",
"reason_code": "stale_snapshots",
"route_count": 1,
"enabled_route_count": 1
},
{
"league_id": "kbo",
"bookmaker_id": "bet365",
"class": "mainstream",
"status": "offseason",
"reason_code": "no_fixtures_scheduled",
"route_count": 2,
"enabled_route_count": 2
}
]
}
}{
"error": {
"code": "coverage_unavailable",
"message": "coverage data is temporarily unavailable"
}
}Coverage matrix
Which bookmakers SportQuanta collects prices from, for which leagues.
This is the only endpoint that takes no API token. It exists so you can confirm we cover the leagues and books you need before you subscribe.
Each cell answers one question: have we been receiving prices for this (league, bookmaker) pair recently?
ok— prices landed in the last few hours.degraded— prices landed, but not recently enough to promise the pair is live right now.offline— the pair is configured, but nothing has landed in 48 hours.offseason— the league has no fixtures scheduled, so there is nothing to collect. Not a fault.not_covered— we do not collect this pair.
The window is deliberately generous. Pre-match prices for a league playing tonight can legitimately go hours without moving, and a quiet afternoon is not an outage.
Responses are cached for 60 seconds at the edge. Poll it no more often than that; the underlying state changes on the order of minutes.
curl --request GET \
--url https://api.sportquanta.com/v1/coverage/bookmakersimport requests
url = "https://api.sportquanta.com/v1/coverage/bookmakers"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sportquanta.com/v1/coverage/bookmakers', 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/coverage/bookmakers",
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://api.sportquanta.com/v1/coverage/bookmakers"
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://api.sportquanta.com/v1/coverage/bookmakers")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/coverage/bookmakers")
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{
"data": {
"generated_at": "2026-08-29T12:00:00Z",
"leagues": [
{
"league_id": "nba",
"sport_id": "basketball",
"active": true
},
{
"league_id": "kbo",
"sport_id": "baseball",
"active": false
}
],
"bookmakers": [
"bet365",
"pinnacle",
"sbobet"
],
"cells": [
{
"league_id": "nba",
"bookmaker_id": "pinnacle",
"class": "sharp",
"status": "ok",
"reason_code": "recent_snapshots",
"route_count": 3,
"enabled_route_count": 3
},
{
"league_id": "nba",
"bookmaker_id": "sbobet",
"class": "sharp",
"status": "degraded",
"reason_code": "stale_snapshots",
"route_count": 1,
"enabled_route_count": 1
},
{
"league_id": "kbo",
"bookmaker_id": "bet365",
"class": "mainstream",
"status": "offseason",
"reason_code": "no_fixtures_scheduled",
"route_count": 2,
"enabled_route_count": 2
}
]
}
}{
"error": {
"code": "coverage_unavailable",
"message": "coverage data is temporarily unavailable"
}
}Response
Coverage matrix.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
ok, degraded, offline, offseason, not_covered 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.