Discover perpetual instruments
Returns strict canonical instrument metadata, optionally for one venue. Financial values are exact decimal strings or null; consumers must not invent a contract multiplier, tick, or leverage value when one is absent. Results are cached independently per venue for 60 seconds.
This endpoint owns discovery and instrument rules only. Fetch live market
state from the Market Data API’s REST snapshot endpoint and real-time transport from
websocket_cpp. This preview exists only in Kairos staging and returns
404 when disabled.
curl --request GET \
--url https://staging-data.kairos.trade/perpetuals/instrumentsimport requests
url = "https://staging-data.kairos.trade/perpetuals/instruments"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://staging-data.kairos.trade/perpetuals/instruments', 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://staging-data.kairos.trade/perpetuals/instruments",
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://staging-data.kairos.trade/perpetuals/instruments"
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://staging-data.kairos.trade/perpetuals/instruments")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging-data.kairos.trade/perpetuals/instruments")
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[
{
"instrument_id": "hl-mainnet-btc-usdt",
"venue": "hyperliquid",
"integration_id": "<string>",
"environment": "<string>",
"venue_instrument_id": "<string>",
"display_symbol": "BTC-USDT",
"base_asset_id": "<string>",
"quote_asset_id": "USDT",
"collateral_asset_id": "<string>",
"settlement_asset_id": "<string>",
"native_quantity_unit": "base_asset",
"contract_multiplier": "<string>",
"status": "active",
"isolated_only": true,
"max_leverage": "<string>",
"price_increment": "<string>",
"size_increment": "<string>",
"metadata": {
"kind": "hyperliquid",
"listing_namespace": "validator_main_dex",
"margin_table_id": 123,
"venue_margin_mode": "<string>"
}
}
]{
"detail": "Perpetual metadata is disabled"
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}{
"detail": "Perpetual venue metadata is unavailable or invalid"
}Query Parameters
Restrict discovery to one canonical venue. Canonical perpetual venue identifier.
hyperliquid, polymarket_perps, kalshi_margin Response
Canonical perpetual instrument records.
Stable Kairos instrument identity. Hyperliquid standard assets use
hl-mainnet-{base}-usdt; HYPE and PURR use the USDC exception.
"hl-mainnet-btc-usdt"
"hl-mainnet-hype-usdc"
"hl-mainnet-purr-usdc"
Canonical perpetual venue identifier.
hyperliquid, polymarket_perps, kalshi_margin Product-specific routing and credential boundary.
Exact identifier accepted by the venue and Market Data API snapshot endpoint.
"BTC-USDT"
"HYPE-USDC"
"PURR-USDC"
Hyperliquid uses USDT except for HYPE and PURR, which use USDC.
"USDT"
"USDC"
base_asset, contracts Exact decimal string, or null when no authoritative conversion exists.
active, inactive, closed, delisted, unknown Null when the venue does not publish an authoritative mode.
Exact decimal string when published by the venue.
Exact venue price increment; null when not established.
Exact venue quantity increment; null when not established.
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://staging-data.kairos.trade/perpetuals/instrumentsimport requests
url = "https://staging-data.kairos.trade/perpetuals/instruments"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://staging-data.kairos.trade/perpetuals/instruments', 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://staging-data.kairos.trade/perpetuals/instruments",
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://staging-data.kairos.trade/perpetuals/instruments"
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://staging-data.kairos.trade/perpetuals/instruments")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging-data.kairos.trade/perpetuals/instruments")
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[
{
"instrument_id": "hl-mainnet-btc-usdt",
"venue": "hyperliquid",
"integration_id": "<string>",
"environment": "<string>",
"venue_instrument_id": "<string>",
"display_symbol": "BTC-USDT",
"base_asset_id": "<string>",
"quote_asset_id": "USDT",
"collateral_asset_id": "<string>",
"settlement_asset_id": "<string>",
"native_quantity_unit": "base_asset",
"contract_multiplier": "<string>",
"status": "active",
"isolated_only": true,
"max_leverage": "<string>",
"price_increment": "<string>",
"size_increment": "<string>",
"metadata": {
"kind": "hyperliquid",
"listing_namespace": "validator_main_dex",
"margin_table_id": 123,
"venue_margin_mode": "<string>"
}
}
]{
"detail": "Perpetual metadata is disabled"
}{
"detail": [
{}
]
}{
"error": "Rate limit exceeded: 100 per 1 minute"
}{
"detail": "Perpetual venue metadata is unavailable or invalid"
}
