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 (
kindsnames 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;
walletnames 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.
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.