Get the authenticated user's current live position exposure
Returns the caller’s current positions from the lowest-latency source available, which is always at least as fresh as the synchronous fill path. This is the RECOMMENDED source of truth for “what do I currently hold” while actively trading — prefer it over any aggregate that may lag behind live fills. Three buckets, each token appears in at most one:
positions— open positions (net_size != 0), withavailable_to_sell(net size minus outstanding sell reservations) andreserved.closed_token_ids— tokens the store just folded flat (within a 10-minute window); callers may use presence here to zero any stale cached position for that token.resolved— held tokens whose MARKET HAS RESOLVED, split out so a resolved loser is never confused with an open position;redeemableistruefor a won (claimable) outcome,falsefor a loss.
Absence from every bucket means the store has no current opinion on that token (neither “open” nor “just closed”) — leave any previously-cached value as-is.
Central fallback. On a deployment without a cell-local position store the response is built from central Postgres instead. In that mode available_to_sell always equals net_size, reserved is always 0, and closed_token_ids is always empty — the reservation view is a regional-node feature.
Auth & scope. Requires position:read. Takes no query, path or body parameters.
curl --request GET \
--url https://execution.kairos.trade/positions/exposure \
--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/positions/exposure"
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/positions/exposure', 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/positions/exposure",
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/positions/exposure"
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/positions/exposure")
.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/positions/exposure")
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{
"positions": [
{
"token_id": "<string>",
"market_id": "<string>",
"holding_wallet": "<string>",
"net_size": "100",
"available_to_sell": "<string>",
"reserved": "<string>",
"avg_entry_price_bps": 5200,
"realized_pnl": "<string>",
"last_trade_at": "2023-11-07T05:31:56Z",
"outcome": "<string>"
}
],
"closed_token_ids": [
"<string>"
],
"closed": [
{
"exchange_id": "hyperliquid",
"token_id": "<string>"
}
],
"resolved": [
{
"token_id": "<string>",
"market_id": "<string>",
"holding_wallet": "<string>",
"net_size": "<string>",
"redeemable": true,
"outcome": "<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.
Response
Current position exposure.
Response for GET /positions/exposure.
Show child attributes
Show child attributes
Token ids the store positively holds at net_size == 0 (folded flat, e.g. a just-settled sell). Absence from both this list and positions/resolved means "no current opinion." Carries no venue, so on a cell serving several it cannot say which venue's position to retire — read closed instead.
The same retirements as closed_token_ids, each scoped to the venue that owns it.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://execution.kairos.trade/positions/exposure \
--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/positions/exposure"
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/positions/exposure', 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/positions/exposure",
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/positions/exposure"
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/positions/exposure")
.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/positions/exposure")
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{
"positions": [
{
"token_id": "<string>",
"market_id": "<string>",
"holding_wallet": "<string>",
"net_size": "100",
"available_to_sell": "<string>",
"reserved": "<string>",
"avg_entry_price_bps": 5200,
"realized_pnl": "<string>",
"last_trade_at": "2023-11-07T05:31:56Z",
"outcome": "<string>"
}
],
"closed_token_ids": [
"<string>"
],
"closed": [
{
"exchange_id": "hyperliquid",
"token_id": "<string>"
}
],
"resolved": [
{
"token_id": "<string>",
"market_id": "<string>",
"holding_wallet": "<string>",
"net_size": "<string>",
"redeemable": true,
"outcome": "<string>"
}
]
}{
"error": "Unauthorized"
}
