Skip to main content
GET
/
markets
/
portfolio
Portfolio
curl --request GET \
  --url https://pm-t1.bxingupdate.com/bvapi/markets/portfolio \
  --header 'Authorization: Bearer <token>'
{
  "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

ParamTypeDefaultDescription
venuestringallall, 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 -X GET "https://pm-t1.bxingupdate.com/bvapi/markets/portfolio?venue=all" \
  -H "Authorization: Bearer YOUR_API_KEY"

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

Authorization
string
header
default:YOUR_API_KEY
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Query Parameters

venue
enum<string>
default:all

Venue filter: all, polymarket, or kalshi. Per-venue buckets reflect this filter.

Available options:
all,
polymarket,
kalshi

Response

200 - application/json

Successful Response

balance_usdc
number | null

Total USDC balance (legacy)

Example:

523.5

total_exposure
number | null

Total exposure (legacy)

Example:

350

positions_count
integer | null

Open positions count (legacy – Polymarket only)

Example:

5

redeemable_count
integer | null

Redeemable positions count

Example:

2

pnl_24h
number | null

PnL in the last 24h

pnl_total
number | null

Total all-time PnL

Example:

100.5

concentration
object
warnings
string[]

Risk warnings

polymarket
object
kalshi
object
total
object