Coverage matrix (no authentication required)
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
}
]
}
}Sportquanta
Coverage matrix (no authentication required)
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.
GET
/
v1
/
coverage
/
bookmakers
Coverage matrix (no authentication required)
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
}
]
}
}Response
Coverage matrix.