Score, timeline, and possession metrics for one fixture
Full detail for a single fixture: scoreline, event timeline, and possession-derived metrics. Independent parts are read concurrently and degrade individually — a part that fails is returned in its empty shape rather than failing the response, and the degraded payload is cached for a shorter time than a clean one. Possession metrics are soccer-only; usfootball fixtures carry their situational state in football instead.
curl --request GET \
--url https://data.kairos.trade/txodds/fixtures/{fixture_id} \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://data.kairos.trade/txodds/fixtures/{fixture_id}"
headers = {
"X-Client-Id": "<api-key>",
"X-Api-Key": "<api-key>",
"X-Api-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-Id': '<api-key>',
'X-Api-Key': '<api-key>',
'X-Api-Secret': '<api-key>'
}
};
fetch('https://data.kairos.trade/txodds/fixtures/{fixture_id}', 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://data.kairos.trade/txodds/fixtures/{fixture_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <api-key>",
"X-Api-Secret: <api-key>",
"X-Client-Id: <api-key>"
],
]);
$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://data.kairos.trade/txodds/fixtures/{fixture_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-Id", "<api-key>")
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("X-Api-Secret", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.kairos.trade/txodds/fixtures/{fixture_id}")
.header("X-Client-Id", "<api-key>")
.header("X-Api-Key", "<api-key>")
.header("X-Api-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/txodds/fixtures/{fixture_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-Id"] = '<api-key>'
request["X-Api-Key"] = '<api-key>'
request["X-Api-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"fixtureId": 123,
"competitionId": 123,
"competition": "<string>",
"home": {
"code": "<string>",
"name": "<string>"
},
"away": {
"code": "<string>",
"name": "<string>"
},
"kickoff": 123,
"status": "<string>",
"score": {
"gameState": "<string>",
"homeGoals": 123,
"awayGoals": 123,
"homeYellow": 123,
"awayYellow": 123,
"homeRed": 123,
"awayRed": 123,
"homeCorners": 123,
"awayCorners": 123,
"possessionHome": 123,
"possessionAway": 123,
"shotsHome": 123,
"shotsAway": 123,
"shotsOnTargetHome": 123,
"shotsOnTargetAway": 123,
"updateCount": 123,
"currentHolder": "<string>",
"possessionThreat": "<string>"
},
"timeline": [
{
"ts": 123,
"seq": 123,
"minute": 123,
"action": "<string>",
"gameState": "<string>",
"homeGoals": 123,
"awayGoals": 123,
"side": "<string>",
"data": "<string>",
"detail": "<string>"
}
],
"metrics": {
"avgPossessionHome": 123,
"avgPossessionAway": 123,
"momentum": [
{
"minute": 123,
"home": 123,
"away": 123
}
],
"conversion": {
"homeShots": 123,
"awayShots": 123,
"homeConversion": 123,
"awayConversion": 123
},
"turnover": {
"switches": 123,
"perMinute": 123
}
},
"sport": "soccer",
"football": {
"homePoints": 123,
"awayPoints": 123,
"touchdowns": [
123
],
"fieldGoals": [
123
],
"periodScores": [
{
"period": "<string>",
"home": 123,
"away": 123
}
],
"onePointConversions": [
123
],
"twoPointConversions": [
123
],
"safeties": [
123
],
"down": {
"number": 123,
"yardsToGo": 123,
"possession": "<string>",
"yardsToEndzone": 123
},
"clockSeconds": 123,
"clockRunning": false,
"redZone": false,
"phase": ""
}
}{
"detail": "Not authenticated"
}{
"detail": "Invite required"
}{
"detail": "fixture 4821993 not found"
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Credential client id (kairos_ck_...). Must be sent together with X-Api-Key and X-Api-Secret.
64-char hex API key.
64-char hex API secret.
Path Parameters
x >= 1Response
Fixture detail, possibly degraded.
Everything the match detail view renders, from the score event store.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Latest score state. Soccer-shaped; gridiron fixtures carry their counters in football.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Possession-derived metrics. Empty shapes for gridiron fixtures, which emit no possession events, and for any part that failed while the rest of the detail loaded.
Show child attributes
Show child attributes
US-football situational state. Present only when sport is usfootball.
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://data.kairos.trade/txodds/fixtures/{fixture_id} \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://data.kairos.trade/txodds/fixtures/{fixture_id}"
headers = {
"X-Client-Id": "<api-key>",
"X-Api-Key": "<api-key>",
"X-Api-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-Id': '<api-key>',
'X-Api-Key': '<api-key>',
'X-Api-Secret': '<api-key>'
}
};
fetch('https://data.kairos.trade/txodds/fixtures/{fixture_id}', 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://data.kairos.trade/txodds/fixtures/{fixture_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <api-key>",
"X-Api-Secret: <api-key>",
"X-Client-Id: <api-key>"
],
]);
$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://data.kairos.trade/txodds/fixtures/{fixture_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-Id", "<api-key>")
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("X-Api-Secret", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.kairos.trade/txodds/fixtures/{fixture_id}")
.header("X-Client-Id", "<api-key>")
.header("X-Api-Key", "<api-key>")
.header("X-Api-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/txodds/fixtures/{fixture_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-Id"] = '<api-key>'
request["X-Api-Key"] = '<api-key>'
request["X-Api-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"fixtureId": 123,
"competitionId": 123,
"competition": "<string>",
"home": {
"code": "<string>",
"name": "<string>"
},
"away": {
"code": "<string>",
"name": "<string>"
},
"kickoff": 123,
"status": "<string>",
"score": {
"gameState": "<string>",
"homeGoals": 123,
"awayGoals": 123,
"homeYellow": 123,
"awayYellow": 123,
"homeRed": 123,
"awayRed": 123,
"homeCorners": 123,
"awayCorners": 123,
"possessionHome": 123,
"possessionAway": 123,
"shotsHome": 123,
"shotsAway": 123,
"shotsOnTargetHome": 123,
"shotsOnTargetAway": 123,
"updateCount": 123,
"currentHolder": "<string>",
"possessionThreat": "<string>"
},
"timeline": [
{
"ts": 123,
"seq": 123,
"minute": 123,
"action": "<string>",
"gameState": "<string>",
"homeGoals": 123,
"awayGoals": 123,
"side": "<string>",
"data": "<string>",
"detail": "<string>"
}
],
"metrics": {
"avgPossessionHome": 123,
"avgPossessionAway": 123,
"momentum": [
{
"minute": 123,
"home": 123,
"away": 123
}
],
"conversion": {
"homeShots": 123,
"awayShots": 123,
"homeConversion": 123,
"awayConversion": 123
},
"turnover": {
"switches": 123,
"perMinute": 123
}
},
"sport": "soccer",
"football": {
"homePoints": 123,
"awayPoints": 123,
"touchdowns": [
123
],
"fieldGoals": [
123
],
"periodScores": [
{
"period": "<string>",
"home": 123,
"away": 123
}
],
"onePointConversions": [
123
],
"twoPointConversions": [
123
],
"safeties": [
123
],
"down": {
"number": 123,
"yardsToGo": 123,
"possession": "<string>",
"yardsToEndzone": 123
},
"clockSeconds": 123,
"clockRunning": false,
"redZone": false,
"phase": ""
}
}{
"detail": "Not authenticated"
}{
"detail": "Invite required"
}{
"detail": "fixture 4821993 not found"
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}
