curl --request GET \
--url https://api.sportquanta.com/v1/{league}/games/{id}/odds/divergence \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/divergence"
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/divergence', 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/divergence",
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/divergence"
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/divergence")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/divergence")
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": {
"game_id": "<string>",
"league": "<string>",
"count": 123,
"markets": [
{
"market": "<string>",
"sharp_book_count": 123,
"mainstream_book_count": 123,
"sharp_fair_probabilities": {},
"mainstream_fair_probabilities": {},
"gap": {},
"max_gap": 123,
"period": "<string>",
"line": 123
}
]
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Sharp / mainstream divergence
How far the mainstream market sits from the sharp one, per market.
Compares DE-VIGGED probabilities, never prices. Books carry different margins, so a sharp book at 2% against a soft one at 8% shows a wide price gap on a market they agree about perfectly — comparing prices measures margin and calls it disagreement.
gap is mainstream minus sharp per selection. A positive gap means the
mainstream market rates that selection higher than the sharp market
does, which is the side to fade. Markets are ordered by max_gap, so a
truncated response keeps the useful half.
Read sharp_book_count and mainstream_book_count before acting: a
consensus of one book is a price, not a market.
Markets where either side has not priced every selection are omitted rather than reported. De-vigging a partial market normalizes over a subset, which inflates every probability in it and manufactures a gap out of a quote we simply did not collect.
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/divergence \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/games/{id}/odds/divergence"
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/divergence', 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/divergence",
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/divergence"
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/divergence")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/games/{id}/odds/divergence")
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": {
"game_id": "<string>",
"league": "<string>",
"count": 123,
"markets": [
{
"market": "<string>",
"sharp_book_count": 123,
"mainstream_book_count": 123,
"sharp_fair_probabilities": {},
"mainstream_fair_probabilities": {},
"gap": {},
"max_gap": 123,
"period": "<string>",
"line": 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 used to build sharp and mainstream consensus.
Response
Divergence per market.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Largest absolute selection probability gap; used to order markets.
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.