Upcoming (not-yet-live) sports events within a time window
Returns fixtures in the requested league set whose scheduled start falls within windowHours, together with primary markets, combo eligibility where available, and cross-venue matches for Polymarket, Kalshi, Predict.fun, and Hyperliquid. Provider-only fixtures may be returned as standalone events. Served from a shared server cache rebuilt about every minute; a copy is never more than two hours old for the default 720h/200 and 168h/12 windows, which are kept warm, or ten minutes old for any other window; the Age header gives the seconds since the body was built. startFrom/startTo return one slice of the window by start time, for loading a schedule a few days at a time. Returns 502 when no provider can supply data and 504 when a cold build runs out of time.
curl --request GET \
--url https://data.kairos.trade/sports/upcoming-eventsimport requests
url = "https://data.kairos.trade/sports/upcoming-events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.kairos.trade/sports/upcoming-events', 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/sports/upcoming-events",
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://data.kairos.trade/sports/upcoming-events"
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://data.kairos.trade/sports/upcoming-events")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/sports/upcoming-events")
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{
"events": [
{
"eventId": "10078222",
"title": "Lakers at Celtics",
"startTime": "2023-11-07T05:31:56Z",
"sport": "soccer",
"sportFamily": "soccer",
"league": "uel",
"teamA": "Los Angeles Lakers",
"teamB": "Boston Celtics",
"image": "<string>",
"primaryMarket": {
"id": "<string>",
"provider": "polymarket",
"question": "<string>",
"slug": "<string>",
"conditionId": "<string>",
"tokenId": "<string>",
"outcomePrices": [
123
],
"outcomes": [
"<string>"
],
"volumeNum": 123,
"liquidityNum": 123,
"acceptingOrders": true,
"sportsMarketType": "<string>",
"gameId": "<unknown>",
"outcomeMarketIds": [
"<string>"
],
"outcomeTokenIds": [
"<string>"
],
"outcomeConditionIds": [
"<string>"
]
},
"marketsCount": 4,
"eventSlug": "nba-lal-bos-2026-01-15",
"drawPrice": 123,
"teamBPrice": 123,
"matchingSlug": "<string>",
"startingEligible": true,
"awaitingLive": true
}
],
"startingEvents": [
{
"eventId": "10078222",
"title": "Lakers at Celtics",
"startTime": "2023-11-07T05:31:56Z",
"sport": "soccer",
"sportFamily": "soccer",
"league": "uel",
"teamA": "Los Angeles Lakers",
"teamB": "Boston Celtics",
"image": "<string>",
"primaryMarket": {
"id": "<string>",
"provider": "polymarket",
"question": "<string>",
"slug": "<string>",
"conditionId": "<string>",
"tokenId": "<string>",
"outcomePrices": [
123
],
"outcomes": [
"<string>"
],
"volumeNum": 123,
"liquidityNum": 123,
"acceptingOrders": true,
"sportsMarketType": "<string>",
"gameId": "<unknown>",
"outcomeMarketIds": [
"<string>"
],
"outcomeTokenIds": [
"<string>"
],
"outcomeConditionIds": [
"<string>"
]
},
"marketsCount": 4,
"eventSlug": "nba-lal-bos-2026-01-15",
"drawPrice": 123,
"teamBPrice": 123,
"matchingSlug": "<string>",
"startingEligible": true,
"awaitingLive": true
}
],
"matchingMarkets": {}
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}{
"detail": "All upstream fetches failed"
}Query Parameters
Look-ahead window, in hours, for upcoming game start times.
1 <= x <= 720Sports-catalog category id (e.g. "basketball"). Expands to every league slug in that category and takes priority over league/series.
Single league slug filter (e.g. "nba"). Used only if category is not supplied or does not resolve.
Comma-separated league slugs. Used only if neither category nor league resolves.
Maximum number of events fetched per resolved series.
1 <= x <= 200Only events starting at or after this instant (ISO 8601 with a UTC offset). startingEvents are included only in the slice that covers the current time, and matchingMarkets only holds entries for the events returned.
Only events starting before this instant (ISO 8601 with a UTC offset). Must be after startFrom.
Response
Upcoming events within the window, plus matched cross-provider markets. Returns {"events": [], "startingEvents": [], "matchingMarkets": {}} on a genuine no-data result.
Show child attributes
Show child attributes
Fixtures whose scheduled start was within the last ten minutes but which have not yet appeared in the live feed. These are schedule-derived, not confirmed live.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://data.kairos.trade/sports/upcoming-eventsimport requests
url = "https://data.kairos.trade/sports/upcoming-events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.kairos.trade/sports/upcoming-events', 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/sports/upcoming-events",
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://data.kairos.trade/sports/upcoming-events"
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://data.kairos.trade/sports/upcoming-events")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/sports/upcoming-events")
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{
"events": [
{
"eventId": "10078222",
"title": "Lakers at Celtics",
"startTime": "2023-11-07T05:31:56Z",
"sport": "soccer",
"sportFamily": "soccer",
"league": "uel",
"teamA": "Los Angeles Lakers",
"teamB": "Boston Celtics",
"image": "<string>",
"primaryMarket": {
"id": "<string>",
"provider": "polymarket",
"question": "<string>",
"slug": "<string>",
"conditionId": "<string>",
"tokenId": "<string>",
"outcomePrices": [
123
],
"outcomes": [
"<string>"
],
"volumeNum": 123,
"liquidityNum": 123,
"acceptingOrders": true,
"sportsMarketType": "<string>",
"gameId": "<unknown>",
"outcomeMarketIds": [
"<string>"
],
"outcomeTokenIds": [
"<string>"
],
"outcomeConditionIds": [
"<string>"
]
},
"marketsCount": 4,
"eventSlug": "nba-lal-bos-2026-01-15",
"drawPrice": 123,
"teamBPrice": 123,
"matchingSlug": "<string>",
"startingEligible": true,
"awaitingLive": true
}
],
"startingEvents": [
{
"eventId": "10078222",
"title": "Lakers at Celtics",
"startTime": "2023-11-07T05:31:56Z",
"sport": "soccer",
"sportFamily": "soccer",
"league": "uel",
"teamA": "Los Angeles Lakers",
"teamB": "Boston Celtics",
"image": "<string>",
"primaryMarket": {
"id": "<string>",
"provider": "polymarket",
"question": "<string>",
"slug": "<string>",
"conditionId": "<string>",
"tokenId": "<string>",
"outcomePrices": [
123
],
"outcomes": [
"<string>"
],
"volumeNum": 123,
"liquidityNum": 123,
"acceptingOrders": true,
"sportsMarketType": "<string>",
"gameId": "<unknown>",
"outcomeMarketIds": [
"<string>"
],
"outcomeTokenIds": [
"<string>"
],
"outcomeConditionIds": [
"<string>"
]
},
"marketsCount": 4,
"eventSlug": "nba-lal-bos-2026-01-15",
"drawPrice": 123,
"teamBPrice": 123,
"matchingSlug": "<string>",
"startingEligible": true,
"awaitingLive": true
}
],
"matchingMarkets": {}
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}{
"detail": "All upstream fetches failed"
}
