curl --request GET \
--url https://api.totalis.trade/markets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.totalis.trade/markets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.totalis.trade/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://api.totalis.trade/markets",
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.totalis.trade/markets"
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.totalis.trade/markets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.totalis.trade/markets")
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": {
"events": [
{
"event_ticker": "<string>",
"series_ticker": "<string>",
"category": "<string>",
"total_markets": 123,
"markets": [
{
"ticker": "<string>",
"event_ticker": "<string>",
"series_ticker": "<string>",
"title": "<string>",
"subtitle": "<string>",
"yes_sub_title": "<string>",
"no_sub_title": "<string>",
"bet_group": "<string>",
"category": "<string>",
"subcategory": "<string>",
"frequency": "<string>",
"venue": "kalshi",
"status": "<string>",
"yes_bid": 123,
"yes_ask": 123,
"no_bid": 123,
"no_ask": 123,
"last_price": 123,
"price_to_beat": 123,
"volume": 123,
"volume_24h": 123,
"open_interest": 123,
"venue_url": "<string>",
"open_time": "2023-11-07T05:31:56Z",
"close_time": "2023-11-07T05:31:56Z",
"expiration_time": "2023-11-07T05:31:56Z",
"exclusion_keys": [
"<string>"
]
}
],
"series_title": "<string>",
"event_title": "<string>",
"event_sub_title": "<string>",
"image_url": "<string>"
}
]
},
"meta": {
"cursor": "<string>",
"has_more": true,
"limit": 123,
"offset": 123,
"total": 123,
"total_events": 123,
"available_subcategories": [
"nba"
],
"available_frequencies": [
"daily"
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {},
"retry_after": 123
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {},
"retry_after": 123
}
}List markets
List active Kalshi and Polymarket markets, grouped by event, with filters for category, subcategory, frequency, date window, and full-text search.
curl --request GET \
--url https://api.totalis.trade/markets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.totalis.trade/markets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.totalis.trade/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://api.totalis.trade/markets",
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.totalis.trade/markets"
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.totalis.trade/markets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.totalis.trade/markets")
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": {
"events": [
{
"event_ticker": "<string>",
"series_ticker": "<string>",
"category": "<string>",
"total_markets": 123,
"markets": [
{
"ticker": "<string>",
"event_ticker": "<string>",
"series_ticker": "<string>",
"title": "<string>",
"subtitle": "<string>",
"yes_sub_title": "<string>",
"no_sub_title": "<string>",
"bet_group": "<string>",
"category": "<string>",
"subcategory": "<string>",
"frequency": "<string>",
"venue": "kalshi",
"status": "<string>",
"yes_bid": 123,
"yes_ask": 123,
"no_bid": 123,
"no_ask": 123,
"last_price": 123,
"price_to_beat": 123,
"volume": 123,
"volume_24h": 123,
"open_interest": 123,
"venue_url": "<string>",
"open_time": "2023-11-07T05:31:56Z",
"close_time": "2023-11-07T05:31:56Z",
"expiration_time": "2023-11-07T05:31:56Z",
"exclusion_keys": [
"<string>"
]
}
],
"series_title": "<string>",
"event_title": "<string>",
"event_sub_title": "<string>",
"image_url": "<string>"
}
]
},
"meta": {
"cursor": "<string>",
"has_more": true,
"limit": 123,
"offset": 123,
"total": 123,
"total_events": 123,
"available_subcategories": [
"nba"
],
"available_frequencies": [
"daily"
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {},
"retry_after": 123
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {},
"retry_after": 123
}
}exclusion_keys array. Two
markets cannot share a parlay if and only if their exclusion_keys
intersect. A plain set-intersection check is all you need, with no
correlation rule tables to maintain client-side. The keys encode every rule:
cross-series groups, threshold ladders, same-game sports correlation, and
Polymarket sub-events.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Filter by category. Pass all to disable the default category filter.
politics, sports, crypto, finance, economics, entertainment, weather, tech, all Filter by venue. Omit to include all venues. Source venue for a market.
kalshi, polymarket Filter events by subcategory. Valid values depend on the selected category (requires category to also be set).
Subcategory wire format (lowercase snake_case). Valid values depend on the selected category and are enforced server-side.
nba, ncaa, nfl, nhl, mlb, ufc, lol, epl, efl, la_liga, world_cup, bundesliga, liga_portugal, ligue_1, f1, ipl, btc, eth, sol, stocks, indices, etfs, earnings, rates, inflation, commodities, fx, jobs, ai, companies, other Filter events by the cadence of the underlying series. other is intentionally rejected. It is a residual response bucket, not a filter target.
daily, weekly, monthly, hourly Time bucket filter. If omitted, no date filter applies, the same as passing all.
1h, 1h-1d, 1d-7d, today, this_week, this_month, all Full-text search across event/market titles.
Opaque pagination cursor from a previous response's meta.cursor. Do not construct manually.
Events per page. Default 21, max 100. The product limit * markets_per_event must not exceed 2000.
1 <= x <= 100Max markets returned per event group. Default 10, max 50.
1 <= x <= 50Was this page helpful?

