Portfolio
curl --request GET \
--url https://www.aionmarket.com/bvapi/markets/portfolio \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.aionmarket.com/bvapi/markets/portfolio"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.aionmarket.com/bvapi/markets/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://www.aionmarket.com/bvapi/markets/portfolio",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://www.aionmarket.com/bvapi/markets/portfolio"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.aionmarket.com/bvapi/markets/portfolio")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.aionmarket.com/bvapi/markets/portfolio")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"balance_usdc": 523.5,
"total_exposure": 350,
"positions_count": 5,
"redeemable_count": 2,
"pnl_24h": 123,
"pnl_total": 100.5,
"concentration": {
"top_market_pct": 25.3,
"top_3_markets_pct": 60.1
},
"warnings": [
"<string>"
],
"polymarket": {
"balance": 123,
"pnl": 15.5,
"positions_count": 5,
"total_exposure": 200
},
"kalshi": {
"balance": 123,
"pnl": 15.5,
"positions_count": 5,
"total_exposure": 200
},
"total": {
"positions_count": 10,
"total_exposure": 350
}
}Positions & Portfolio
Portfolio
Get portfolio summary with exposure and concentration metrics. Returns per-venue buckets (polymarket, kalshi), totals, concentration metrics, and warnings.
GET
/
markets
/
portfolio
Portfolio
curl --request GET \
--url https://www.aionmarket.com/bvapi/markets/portfolio \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.aionmarket.com/bvapi/markets/portfolio"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.aionmarket.com/bvapi/markets/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://www.aionmarket.com/bvapi/markets/portfolio",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://www.aionmarket.com/bvapi/markets/portfolio"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.aionmarket.com/bvapi/markets/portfolio")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.aionmarket.com/bvapi/markets/portfolio")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"balance_usdc": 523.5,
"total_exposure": 350,
"positions_count": 5,
"redeemable_count": 2,
"pnl_24h": 123,
"pnl_total": 100.5,
"concentration": {
"top_market_pct": 25.3,
"top_3_markets_pct": 60.1
},
"warnings": [
"<string>"
],
"polymarket": {
"balance": 123,
"pnl": 15.5,
"positions_count": 5,
"total_exposure": 200
},
"kalshi": {
"balance": 123,
"pnl": 15.5,
"positions_count": 5,
"total_exposure": 200
},
"total": {
"positions_count": 10,
"total_exposure": 350
}
}Get portfolio summary with exposure and concentration metrics.
Overview
Returns aggregated portfolio data including:- Per-venue buckets:
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,positions_count, etc.) kept populated for backwards compatibility - Concentration metrics: top market and top 3 markets as percentage of portfolio
- Warnings: automatic risk alerts (e.g. high concentration)
Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
venue | string | all | all, polymarket, or kalshi. Filters which venue buckets are computed. |
Venue-aware response. The
polymarket, kalshi, and total buckets are the preferred shape. Use ?venue=polymarket or ?venue=kalshi to filter. The legacy flat fields (balance_usdc, positions_count, total_exposure) remain populated for backwards compatibility, but positions_count only counts Polymarket positions — use the per-venue buckets for accurate counts.Example
- curl
- Python SDK
curl -X GET "https://www.aionmarket.com/bvapi/markets/portfolio?venue=all" \
-H "Authorization: Bearer YOUR_API_KEY"
from aion_sdk import AionMarketClient
client = AionMarketClient(api_key="YOUR_API_KEY")
# Full portfolio across all venues
portfolio = client.get_portfolio()
# Kalshi-only
kalshi_portfolio = client.get_portfolio(venue="kalshi")
Response Example
{
"code": 200,
"message": "success",
"data": {
"balance_usdc": 523.50,
"total_exposure": 350.00,
"positions_count": 5,
"redeemable_count": 1,
"pnl_total": 45.20,
"concentration": {
"top_market_pct": 32.5,
"top_3_markets_pct": 78.1
},
"warnings": [],
"polymarket": {
"balance": 400.00,
"pnl": 35.50,
"positions_count": 5,
"total_exposure": 250.00
},
"kalshi": {
"balance": 123.50,
"pnl": 9.70,
"positions_count": 3,
"total_exposure": 100.00
},
"total": {
"positions_count": 8,
"total_exposure": 350.00
}
}
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Venue filter: all, polymarket, or kalshi. Per-venue buckets reflect this filter.
Available options:
all, polymarket, kalshi Response
200 - application/json
Successful Response
Total USDC balance (legacy)
Example:
523.5
Total exposure (legacy)
Example:
350
Open positions count (legacy – Polymarket only)
Example:
5
Redeemable positions count
Example:
2
PnL in the last 24h
Total all-time PnL
Example:
100.5
Show child attributes
Show child attributes
Risk warnings
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes