Cross-platform matching-market records for a set of market slugs
Returns the cross-venue match record for each requested market slug, keyed by slug. Provider entries can include Polymarket, Kalshi, Predict.fun, and Hyperliquid. Slugs with no cross-venue match are silently omitted from the response object (not returned as null). When live=true, the Kalshi side of every matched entry is refreshed in-place with a live price (in cents / 100, 4 decimal places); a correction is applied when a stale price appears to be on the wrong side of a binary flip. Responses are cacheable, briefly when live=true, longer otherwise.
curl --request GET \
--url https://data.kairos.trade/sports/matching-marketsimport requests
url = "https://data.kairos.trade/sports/matching-markets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.kairos.trade/sports/matching-markets', 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/matching-markets",
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/matching-markets"
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/matching-markets")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/sports/matching-markets")
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{
"nba-lal-bos-2026-01-15": {
"title": "Lakers vs Celtics",
"tokenId": "10897234...",
"providers": [
{
"provider": "polymarket",
"marketId": "nba-lal-bos-2026-01-15",
"price": 0.62
},
{
"provider": "kalshi",
"marketId": "KXNBAGAME-26JAN15LALBOS-LAL",
"price": 0.6,
"eventTicker": "KXNBAGAME-26JAN15LALBOS"
},
{
"provider": "predictfun",
"marketId": "39142",
"price": 0.61
}
]
}
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}Query Parameters
Comma-separated list of market or matching slugs to look up. Include every slug carried by the discovery card because event slugs and per-outcome market slugs are distinct. Empty/blank entries are dropped.
1Pass the literal string "true" to refresh Kalshi prices before returning. Any other value, including omission, is treated as false.
true, false Response
Map of slug to matching-market record. Returns {} if slugs parses to no non-empty entries.
Map keyed by requested game slug. Slugs with no cache entry, or an unparseable cache value, are omitted from this object entirely.
Raw contents of a cached cross-venue sports market match entry.
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://data.kairos.trade/sports/matching-marketsimport requests
url = "https://data.kairos.trade/sports/matching-markets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.kairos.trade/sports/matching-markets', 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/matching-markets",
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/matching-markets"
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/matching-markets")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.kairos.trade/sports/matching-markets")
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{
"nba-lal-bos-2026-01-15": {
"title": "Lakers vs Celtics",
"tokenId": "10897234...",
"providers": [
{
"provider": "polymarket",
"marketId": "nba-lal-bos-2026-01-15",
"price": 0.62
},
{
"provider": "kalshi",
"marketId": "KXNBAGAME-26JAN15LALBOS-LAL",
"price": 0.6,
"eventTicker": "KXNBAGAME-26JAN15LALBOS"
},
{
"provider": "predictfun",
"marketId": "39142",
"price": 0.61
}
]
}
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}
