curl --request GET \
--url https://api.sportquanta.com/v1/{league}/matches/{id}/commentary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/matches/{id}/commentary"
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}/matches/{id}/commentary', 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}/matches/{id}/commentary",
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}/matches/{id}/commentary"
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}/matches/{id}/commentary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/matches/{id}/commentary")
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": {
"match_id": "<string>",
"entries": [
{
"text": "<string>",
"important": true,
"highlight": true,
"minute_label": "<string>",
"minute": 123,
"stoppage": 123,
"clock": "<string>",
"icon": "<string>",
"score_home": 123,
"score_away": 123,
"image_url": "<string>"
}
],
"fetched_at": "<string>",
"id": "<string>",
"canonical_id": "<string>",
"external_ids": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Commentary
Returns the minute-by-minute narrative for a soccer match, read from the per-league
match_commentary collection. Distinct from /events, which is the structured
goals/cards/subs timeline; this is the prose. Entries are served NEWEST FIRST, the
order the source renders them — sorting on the parsed minute would reorder a
stoppage-time sequence whenever the clock resets. Each entry carries the display
minute, precise clock, incident icon, the source’s own important/highlight flags,
the running score on goal lines, and a photo of the moment where one exists.
Commentary only exists once a match has kicked off, so an upcoming fixture returns
404. Soccer-only — other sports return 404 endpoint_not_for_sport.
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}/matches/{id}/commentary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/{league}/matches/{id}/commentary"
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}/matches/{id}/commentary', 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}/matches/{id}/commentary",
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}/matches/{id}/commentary"
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}/matches/{id}/commentary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/{league}/matches/{id}/commentary")
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": {
"match_id": "<string>",
"entries": [
{
"text": "<string>",
"important": true,
"highlight": true,
"minute_label": "<string>",
"minute": 123,
"stoppage": 123,
"clock": "<string>",
"icon": "<string>",
"score_home": 123,
"score_away": 123,
"image_url": "<string>"
}
],
"fetched_at": "<string>",
"id": "<string>",
"canonical_id": "<string>",
"external_ids": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"_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
Soccer league ID, such as epl, laliga, or worldcup. See Soccer coverage.
epl, laliga, bundesliga, seriea, ligue1, eredivisie, ligaportugal, championship, superettan, laliga2, bundesliga2, serieb, ligue2, eerstedivisie, ligaportugal2, ucl, uel, uecl, facup, copadelrey, dfbpokal, coppaitalia, coupedefrance, knvbbeker, tacaportugal, koreanfacup, usopencup, kleague1, kleague2, jleague1, jleague2, mls, uslchampionship, worldcup, euro, copaamerica, goldcup, asiancup, emperorscup Response
Per-match commentary response (entries, newest first).
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.