Source-observed soccer and NFL fixture timing
Fresh source clock evidence for one TxODDS fixture. No response caching or client countdown extrapolation. Missing, legacy, stale, interrupted, unsupported, or malformed evidence returns usableForLateGame=false with an explicit reason. Requires a verified fixture-to-market mapping before use by a trading strategy.
curl --request GET \
--url https://data.kairos.trade/txodds/fixtures/{fixture_id}/timing \
--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}/timing"
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}/timing', 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}/timing",
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}/timing"
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}/timing")
.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}/timing")
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,
"sport": "<string>",
"evaluatedAt": "<string>",
"source": "txodds",
"phase": "<string>",
"status": "unknown",
"observedAt": "<string>",
"stateAgeSeconds": 123,
"staleAfterSeconds": 15,
"stale": true,
"clockSeconds": 123,
"clockRunning": true,
"clockDirection": "unknown",
"periodRemainingSeconds": 123,
"regulationRemainingSeconds": 123,
"gameRemainingSeconds": 123,
"elapsedMatchSeconds": 123,
"lateGameBasis": "<string>",
"usableForLateGame": false,
"unavailableReason": "missing_score_observation"
}{
"detail": "Not authenticated"
}{
"detail": "Invite required"
}{
"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
Timing evidence, including explicit unavailability.
Source-observed fixture timing. Eligibility describes supported clock evidence, not whether a game is late or a market is safe to trade. Soccer exposes the nominal second-half clock, excluding any unknown added time; NFL exposes regulation clock time. No field predicts the final whistle or extrapolates between observations.
Was this page helpful?
curl --request GET \
--url https://data.kairos.trade/txodds/fixtures/{fixture_id}/timing \
--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}/timing"
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}/timing', 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}/timing",
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}/timing"
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}/timing")
.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}/timing")
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,
"sport": "<string>",
"evaluatedAt": "<string>",
"source": "txodds",
"phase": "<string>",
"status": "unknown",
"observedAt": "<string>",
"stateAgeSeconds": 123,
"staleAfterSeconds": 15,
"stale": true,
"clockSeconds": 123,
"clockRunning": true,
"clockDirection": "unknown",
"periodRemainingSeconds": 123,
"regulationRemainingSeconds": 123,
"gameRemainingSeconds": 123,
"elapsedMatchSeconds": 123,
"lateGameBasis": "<string>",
"usableForLateGame": false,
"unavailableReason": "missing_score_observation"
}{
"detail": "Not authenticated"
}{
"detail": "Invite required"
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}
