Skip to main content
Keys granted account:read read their own user’s balances, positions, orders and fills. Both access levels, read_only and trading, include account:read for keys created while account reads are enabled (Authentication).

Venues served

yes: the route reads that venue. no: positions, orders and fills answer 422 venue_unsupported, and balances lists the venue as unsupported.

Codes

Polymarket balances are two tokens on Polygon, each listed on its own in amounts: pUSD (Polymarket USD, 6 decimals, the cash Polymarket’s exchanges trade in) and USDC.e (6 decimals; at the deposit wallet, money deposited but not yet converted to pUSD). Both are worth $1 each, so an address’s dollar amount is pUSD plus USDC.e. The website’s header shows that sum for your deposit wallet, so for most accounts the deposit_wallet entry here equals the header. They differ in four ways:
  • More addresses. This route reads every address that can fund your Polymarket orders: the deposit wallet, the Safe, your Polymarket proxy wallet if you have one, and the wallet itself (kinds names each; one address serving two roles is listed once). The header reads the deposit wallet only, so money at the other addresses shows here and not there.
  • Which wallet. Both start from one wallet and derive the deposit wallet from it. This route uses the wallet you chose for Polymarket on the website, if you chose one; otherwise your first linked wallet; otherwise your Trendline wallet. The header ignores that choice and always uses your first linked wallet, else your Trendline wallet. With a chosen Polymarket wallet that is not your first linked wallet, the two read different addresses; wallet names the one read here.
  • Failures. If any token at any address cannot be read, Polymarket reads unavailable here; it is never shown as 0. The header shows 0 for an empty answer.
  • Freshness. This route reads the chain on every request. The header keeps its figure for up to 30 s, and on a new page first shows the last figure saved in your browser, so it can briefly lag a deposit or a trade.
predict.fun balances are the USDT (18 decimals) on BNB Chain held by your Trendline wallet, the token and wallet the website’s header reads, with two differences: a user with no Trendline wallet reads not_connected here (the header falls back to a linked wallet), and the header can be set to show another address for display, which this route never reads. The venue reads unsupported with reason venue_disabled while predict.fun is switched off on our side. predict.fun positions are read for the same wallet: open positions, and positions in resolved markets not yet redeemed (those on a losing outcome are not listed); size reads the venue’s amount as 18-decimal shares and avg_price is its average buy price in USD. While predict.fun is switched off on our side, its positions answer 422 venue_unsupported. A venue that cannot be read is never an empty 200. On balances, a venue over its budget reads unavailable with reason venue_busy while the route answers 200. Each venue read has 5 s to answer; a slower venue answers 503 venue_unavailable (on balances, that venue reads unavailable with reason timeout). Polymarket positions are read at most 4 pages of 500 rows per wallet address; a wallet holding more answers 503 venue_unavailable. Polymarket holdings of 0.1 shares or less (the venue’s dust floor) are not listed, and neither are positions in markets Polymarket has archived. Venue calls also spend from per-venue call budgets; a spent budget answers 503 venue_busy.

Portfolio (not yet enabled)

GET /public/v1/account/portfolio answers 404 until it is switched on, separately from the other account routes. It needs account:read and takes no parameters. venues always holds kalshi, polymarket, limitless and predictfun, each with three components: Each component has a status (ok, not_connected, unavailable or unsupported). A component that is not ok carries a reason and no amount; an unreadable venue is never shown as 0. A venue over its budget reads unavailable with reason venue_busy while the route still answers 200. Components resolve on their own: when positions cannot be read, cash still reads ok.

Fields and units per venue

Amounts are exact decimal strings in USD (stablecoin) units, never floats. Polymarket cash is pUSD and USDC.e at every address read (see above). No realized P&L is served: Polymarket realizedPnl and Limitless realisedPnl are not read. Whether cashPnl equals currentValue − initialValue, and whether Limitless unrealizedPnl equals marketValue − cost, is not yet confirmed against a live account. There is no history. resolved_rows (on predict.fun and Limitless positions_value and pnl) counts the rows summed that sit in a resolved, paused or unpriced market, when there is at least one. predict.fun pages spend the same per-user call budget as GET /public/v1/account/positions?venue=predictfun, one call per page.

The total

total.amount adds every venue’s cash and positions_value, each stablecoin and USD at $1 (basis: stablecoins_at_par). It is null unless every component it needs is whole, and then incomplete_because lists each cause as {venue, component, status, reason}. excluded lists components left out by rule. The rules, top to bottom, first match wins: So any Kalshi user with a credential, and any account holding a resolved or unpriced predict.fun row or a not-open Limitless row, reads total.amount: null for now, with the cause named. A Limitless wallet with no sub-account reads not_connected no_profile here, and its USDC is not counted. The total covers only the wallets we read. Funds in a predict.fun smart account, and anything outside the addresses listed in held, are outside every component and the total. Compared with the website’s header and portfolio page: cash matches the header per venue as described above; the website adds Kalshi cash only, reads a failed venue as 0 and labels Kalshi realized P&L as unrealized, so its figures can differ from these.