curl --request GET \
--url https://api.simmer.markets/api/sdk/portfolioimport requests
url = "https://api.simmer.markets/api/sdk/portfolio"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.simmer.markets/api/sdk/portfolio', 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.simmer.markets/api/sdk/portfolio",
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://api.simmer.markets/api/sdk/portfolio"
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://api.simmer.markets/api/sdk/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simmer.markets/api/sdk/portfolio")
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{
"balance_usdc": 123,
"sim_balance": 123,
"sim_pnl": 123,
"total_exposure": 123,
"positions_count": 123,
"redeemable_count": 123,
"pnl_24h": 123,
"pnl_total": 123,
"concentration": {
"top_market_pct": 123,
"top_3_markets_pct": 123
},
"by_source": {},
"warnings": [
"<string>"
],
"combos": [
{
"combo_id": "<string>",
"status": "<string>",
"legs": [
{
"market_title": "<string>",
"side": "<string>"
}
],
"created_at": "<string>",
"filled_at": "<string>",
"size": 123,
"potential_payout": 123,
"actual_payout": 123,
"holderAddress": "<string>"
}
],
"sim": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"polymarket": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"kalshi": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"total": {
"positions_count": 0,
"total_exposure": 0
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Portfolio
Get portfolio summary with exposure and concentration metrics.
Returns aggregated portfolio data including:
- Per-venue buckets:
sim,polymarket,kalshi— each with balance, pnl, positions_count, total_exposure total: summed counts and exposure across venues (units are mixed — use per-venue buckets for financially accurate aggregation)- Flat legacy fields (
balance_usdc,sim_balance,positions_count, etc.) kept populated for backwards compatibility
Query params:
- venue: Filter which venues to compute. Default ‘all’. The
totaland per-venue buckets reflect this filter.
Requires API key in Authorization header.
curl --request GET \
--url https://api.simmer.markets/api/sdk/portfolioimport requests
url = "https://api.simmer.markets/api/sdk/portfolio"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.simmer.markets/api/sdk/portfolio', 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.simmer.markets/api/sdk/portfolio",
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://api.simmer.markets/api/sdk/portfolio"
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://api.simmer.markets/api/sdk/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simmer.markets/api/sdk/portfolio")
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{
"balance_usdc": 123,
"sim_balance": 123,
"sim_pnl": 123,
"total_exposure": 123,
"positions_count": 123,
"redeemable_count": 123,
"pnl_24h": 123,
"pnl_total": 123,
"concentration": {
"top_market_pct": 123,
"top_3_markets_pct": 123
},
"by_source": {},
"warnings": [
"<string>"
],
"combos": [
{
"combo_id": "<string>",
"status": "<string>",
"legs": [
{
"market_title": "<string>",
"side": "<string>"
}
],
"created_at": "<string>",
"filled_at": "<string>",
"size": 123,
"potential_payout": 123,
"actual_payout": 123,
"holderAddress": "<string>"
}
],
"sim": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"polymarket": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"kalshi": {
"balance": 123,
"pnl": 123,
"positions_count": 0,
"total_exposure": 0
},
"total": {
"positions_count": 0,
"total_exposure": 0
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}sim, polymarket, kalshi, and total buckets are the preferred shape. Use ?venue=sim|polymarket|kalshi|all to filter (default all).The legacy flat fields (balance_usdc, sim_balance, positions_count, total_exposure) remain populated for backwards compatibility, but positions_count only counts Polymarket positions — use portfolio.sim.positions_count, portfolio.total.positions_count, or the per-venue buckets for accurate counts.Query Parameters
Venue filter: 'all' (default), 'sim', 'polymarket', or 'kalshi'. Per-venue buckets are always populated when applicable; this filters which are computed.
Response
Successful Response
Portfolio summary with aggregated metrics.
Venue-bucketed fields (sim, polymarket, kalshi, total) are the
preferred shape for multi-venue agents. The flat fields (balance_usdc,
sim_balance, positions_count, etc.) remain populated for backwards
compatibility with older SDK/skill versions.
Portfolio concentration metrics.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Per-venue portfolio rollup.
balance is in the venue's native currency:
- sim: $SIM
- polymarket: USDC (Polygon)
- kalshi: USDC (Solana)
Show child attributes
Show child attributes
Per-venue portfolio rollup.
balance is in the venue's native currency:
- sim: $SIM
- polymarket: USDC (Polygon)
- kalshi: USDC (Solana)
Show child attributes
Show child attributes
Per-venue portfolio rollup.
balance is in the venue's native currency:
- sim: $SIM
- polymarket: USDC (Polygon)
- kalshi: USDC (Solana)
Show child attributes
Show child attributes
Total across all venues.
Counts are summed directly; exposure is summed in venue-native units and is not currency-normalized (since $SIM ≠ USDC). Use the per-venue buckets for accurate financial aggregation.
Show child attributes
Show child attributes
