Current valid tick grid for one market
Returns the grid of valid price increments the venue CURRENTLY enforces for a market — the same grid the order executor validates against. It describes the grid; it never snaps or rounds a price. Served from the market metadata cache, which the orderbook streamer keeps current with the venue’s live tick changes. Rate-limit bucket: LIGHT.
- polymarket — a single flat range over
[0, 1]; the venue flips 0.01↔0.001 at the price extremes. Passasset_id(the CLOB token id) to read the per-token tick, which is where a live change lands first. - kalshi — the market’s
price_ranges(a tapered grid).min_tickis the finest step. If only the deprecated flattick_sizeis present the response is a single flat range flaggedsynthetic: true. - predictfun —
supported: false; the venue exposes no per-market tick. No grid is fabricated.
Query parameters and the response body are wire-compatible with the Data API’s GET /markets/tick-size; as_of (when the grid was read from the metadata cache) is additive. start / end / step / min_tick are decimal strings so precision is never lost. Cached for 5 seconds (public, max-age=5 with a strong ETag).
curl --request GET \
--url https://md.kairos.trade/v1/markets/tick-size \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://md.kairos.trade/v1/markets/tick-size"
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://md.kairos.trade/v1/markets/tick-size', 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://md.kairos.trade/v1/markets/tick-size",
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://md.kairos.trade/v1/markets/tick-size"
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://md.kairos.trade/v1/markets/tick-size")
.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://md.kairos.trade/v1/markets/tick-size")
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{
"provider": "kalshi",
"contract_id": "KXBTC15M-26JUL221600-00",
"asset_id": null,
"ranges": [
{
"start": "0",
"end": "0.04",
"step": "0.001"
},
{
"start": "0.04",
"end": "0.96",
"step": "0.01"
},
{
"start": "0.96",
"end": "1",
"step": "0.001"
}
],
"min_tick": "0.001",
"source": "kalshi_price_ranges",
"synthetic": false,
"price_level_structure": "tapered",
"as_of": "2026-09-18T12:00:00Z"
}Authorizations
Credential client id (kairos_ck_...). Must be sent together with X-Api-Key and X-Api-Secret.
64-char hex API key. Must be sent together with X-Client-Id and X-Api-Secret.
64-char hex API secret. Must be sent together with X-Client-Id and X-Api-Key.
Query Parameters
kalshi, polymarket, predictfun Kalshi ticker, or Polymarket condition id / market id.
Polymarket CLOB token id. Enables the per-token read; ignored for other providers.
Response
The market's current tick grid, or the explicit unsupported payload for predictfun.
- Option 1
- Option 2
A market's current valid tick grid. Wire-compatible with the Data API GET /markets/tick-size response; as_of is additive.
kalshi, polymarket The Polymarket token id the grid was read for; null when the lookup was market-level.
Show child attributes
Show child attributes
The finest step across all bands — the smallest increment the market will ever accept.
"0.001"
Which upstream fact the grid was built from. streamer_projection is the orderbook streamer's projected finest venue step, used for a Kalshi market whose live band layout is not currently cached.
metadata_cache, kalshi_price_ranges, streamer_projection True when the grid is a single flat band standing in for a layout that is not currently known — the minimum tick is correct, the band boundaries are not described.
Kalshi's price_level_structure when present; null otherwise.
When this grid was read from the market metadata cache (UTC). The cache itself is kept current by the orderbook streamer's live tick-change ingestion.
Was this page helpful?
curl --request GET \
--url https://md.kairos.trade/v1/markets/tick-size \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://md.kairos.trade/v1/markets/tick-size"
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://md.kairos.trade/v1/markets/tick-size', 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://md.kairos.trade/v1/markets/tick-size",
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://md.kairos.trade/v1/markets/tick-size"
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://md.kairos.trade/v1/markets/tick-size")
.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://md.kairos.trade/v1/markets/tick-size")
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{
"provider": "kalshi",
"contract_id": "KXBTC15M-26JUL221600-00",
"asset_id": null,
"ranges": [
{
"start": "0",
"end": "0.04",
"step": "0.001"
},
{
"start": "0.04",
"end": "0.96",
"step": "0.01"
},
{
"start": "0.96",
"end": "1",
"step": "0.001"
}
],
"min_tick": "0.001",
"source": "kalshi_price_ranges",
"synthetic": false,
"price_level_structure": "tapered",
"as_of": "2026-09-18T12:00:00Z"
}
