Get a combined platform + exchange fee quote for a prospective trade
Prices a trade you are considering WITHOUT submitting it: for a market order (order_type=market, price omitted) the live orderbook is walked for quantity to compute a size-weighted executable price; for a limit order (order_type=limit) price is required and used as the resting quote. Shares the exact computation used by the WebSocket RFQ stream (subscribe_fee_quote), so the two surfaces can never price a trade differently.
Quotes are display-only, degrade-open estimates (is_estimate: true) — the authoritative fee is computed at fill time. If no fresh orderbook is available, every numeric field is a "0" placeholder and pricing_unavailable: true; callers MUST check that flag rather than rendering the zeros as a real quote.
Supported exchange_id values: polymarket, kalshi, predictfun.
Auth & scope. Requires trade:read.
curl --request GET \
--url https://execution.kairos.trade/orders/fee-quote \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://execution.kairos.trade/orders/fee-quote"
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://execution.kairos.trade/orders/fee-quote', 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://execution.kairos.trade/orders/fee-quote",
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://execution.kairos.trade/orders/fee-quote"
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://execution.kairos.trade/orders/fee-quote")
.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://execution.kairos.trade/orders/fee-quote")
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{
"avg_price_usdc": "0.52",
"filled_size": "100",
"requested_size": "100",
"sufficient_liquidity": true,
"notional_usdc": "<string>",
"platform_fee_usdc": "<string>",
"exchange_fee_usdc": "<string>",
"venue_reserve_fee_usdc": "<string>",
"total_fee_usdc": "<string>",
"total_cost_usdc": "<string>",
"pricing_unavailable": true,
"is_estimate": true,
"funding_tier": "t0_local",
"bridge_fee_usdc": "<string>",
"bridge_eta_p50_ms": 123,
"bridge_eta_p95_ms": 123,
"bridge_route_label": "<string>",
"bridge_min_txs": 123,
"bridge_eta_state": "measured",
"bridge_quote_unavailable": true,
"bridge_beta": true,
"exchange_fee_note": "<string>"
}{
"error": "Unauthorized"
}Authorizations
Credential client id (kairos_ck_...). Must be sent together with X-Api-Key and X-Api-Secret.
64-char hex API key.
64-char hex API secret.
Query Parameters
One of polymarket, kalshi, predictfun.
polymarket, kalshi, predictfun "polymarket"
Condition id (Polymarket). Required for Polymarket if token_id is omitted.
CLOB token id (Polymarket) — preferred over market_id for book/fee lookup.
"71360012345678901234567890123456789012345678901234567890123456"
Decimal string. Number of shares/contracts to quote. Must be > 0.
"100"
The quote is side-aware (walks the ask side for buy, the bid side for sell).
buy, sell "buy"
Decimal string in (0, 1]. Required when order_type=limit (the resting price). Omit for order_type=market to have the server price off the live book.
"0.52"
market (taker, priced from the book) or limit (maker, priced at price).
market, limit "market"
Response
Combined platform + exchange fee quote.
Response for GET /orders/fee-quote. All numeric fields are decimal strings in USDC. The WebSocket subscribe_fee_quote stream emits a near-identical frame, but it omits venue_reserve_fee_usdc — do not treat the two as interchangeable. See execution-ws.asyncapi.yaml.
Size-weighted executable price (VWAP for a market order), or the limit price for a limit order.
"0.52"
Size the book can actually fill; equals requested_size when liquidity suffices.
"100"
The size the caller asked to quote (echoes quantity).
"100"
False when the book cannot fill the full requested_size.
filled_size × avg_price_usdc.
Kairos platform fee, based on the caller's fee tier. "0" if the tier lookup failed (fails open, never a phantom rate).
Venue-specific fee the caller is expected to pay. "0" on venues that only charge takers when this quote is a resting maker order.
Fee the VENUE actually reserves to accept the order — distinct from exchange_fee_usdc. Some venues (Polymarket CLOB) can't know a resting limit will stay maker, so they reserve the taker estimate at placement regardless; buy-affordability checks must size off this field, not exchange_fee_usdc.
platform_fee_usdc + exchange_fee_usdc.
All-in cost — for a buy, notional + fees; for a sell, proceeds = notional − fees.
true when no executable price was available (no client price and no fresh orderbook) — every other numeric field is a placeholder "0" and MUST NOT be rendered as a real quote.
Always true — this is a display estimate; the authoritative fee is computed at fill time.
Which rails run to fund this order. t0_local means no collateral moves; only t2_bridge carries a bridge fee. It names the movement, not whether the balance suffices.
t0_local, t1_prepositioned, t2_bridge, reject Bridge fee in USDC. "0" below t2_bridge, and null exactly when bridge_quote_unavailable is true — an unknown fee is never rendered as $0.00. This fee is already included in total_cost_usdc, and buy-affordability checks must include it too.
Median bridge fill time from Kairos's own completed intents, never a provider estimate. Present only once the route has ≥1,000 samples and its p90 ETA error is within ±10s.
95th-percentile bridge fill time from Kairos's own completed intents. Present under the same gate as bridge_eta_p50_ms.
The route in the user's words, naming the token the rail DELIVERS, e.g. "BNB USDT → Polymarket pUSD via Relay". Absent when nothing bridges.
On-chain transactions the bridge route needs, so a client can price the signing path. Absent when nothing bridges.
Whether the ETA above is a measurement or an admission that the route has not earned one. Absent when nothing bridges.
measured, not_yet_measured true when a bridge is needed and no quote landed. Consumers MUST render a "routing…" state and disable submit rather than showing any fee; bridge_fee_usdc is null in this state.
true while tier-2 bridge funding is behind a flag, so the bridge row can be labelled beta.
Human-readable note on the exchange fee, e.g. "1.8% taker fee".
Was this page helpful?
curl --request GET \
--url https://execution.kairos.trade/orders/fee-quote \
--header 'X-Api-Key: <api-key>' \
--header 'X-Api-Secret: <api-key>' \
--header 'X-Client-Id: <api-key>'import requests
url = "https://execution.kairos.trade/orders/fee-quote"
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://execution.kairos.trade/orders/fee-quote', 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://execution.kairos.trade/orders/fee-quote",
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://execution.kairos.trade/orders/fee-quote"
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://execution.kairos.trade/orders/fee-quote")
.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://execution.kairos.trade/orders/fee-quote")
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{
"avg_price_usdc": "0.52",
"filled_size": "100",
"requested_size": "100",
"sufficient_liquidity": true,
"notional_usdc": "<string>",
"platform_fee_usdc": "<string>",
"exchange_fee_usdc": "<string>",
"venue_reserve_fee_usdc": "<string>",
"total_fee_usdc": "<string>",
"total_cost_usdc": "<string>",
"pricing_unavailable": true,
"is_estimate": true,
"funding_tier": "t0_local",
"bridge_fee_usdc": "<string>",
"bridge_eta_p50_ms": 123,
"bridge_eta_p95_ms": 123,
"bridge_route_label": "<string>",
"bridge_min_txs": 123,
"bridge_eta_state": "measured",
"bridge_quote_unavailable": true,
"bridge_beta": true,
"exchange_fee_note": "<string>"
}{
"error": "Unauthorized"
}
