Skip to main content
GET
Get User Balance

Authorizations

SF-API-KEY
string
header
required

API key required for authentication. Use the value {{v2_api_key}} in Postman.

Path Parameters

address
string
required

User wallet address

Query Parameters

force
boolean
use_rpc
boolean
balances_provider
string

Optional balances provider override (one of: zerion, dune, debank, zapper, octav)

Response

A successful response.

balances
Balance represents a user's token balance · object[]
total_portfolio_value_usd
number<double>
total_vault_share_value_usd
number<double>
avg_vault_share_apy
number<double>
portfolio_performance
object
hypercore
object

HyperCoreBalance carries a user's Hyperliquid HyperCore holdings, which are off-EVM and therefore invisible to every balance provider and RPC read. Without it a funded perps user's portfolio total is short by the amount they deposited, which reads to them as lost money rather than moved money.

Scope note. total_value_usd is folded into total_portfolio_value_usd and portfolio_performance.portfolio_value_usd, and HyperCore PnL is folded into total_pnl_usd and into the unrealized and realized totals: there is ONE set of portfolio figures covering vaults and HyperCore together, not a separate perps set to add on.

total_pnl_usd is therefore unrealized plus realized, for a perps user exactly as for a vault one. Unrealized comes from open positions' unrealizedPnl in clearinghouseState; realized is the remainder, which is also where funding payments land - the cost-basis feed excludes them, so they reach PnL through accountValue, and funding is realized.

What stays vault-only: growth, which means yield plus rewards and is neither of those for a perp; and the per-source breakdowns (underlying, yield, rewards), because perp PnL decomposes into none of them.

/v1/user/pnl/historical carries HyperCore in its aggregates too, with the per-snapshot hypercore_* fields exposed so a client can render a vault-only series. There is no history to backfill - Hyperliquid publishes none and cost basis accumulates forward from the first read - so a series steps when HyperCore first appears rather than being reconstructed backwards.

Do not add hypercore.total_value_usd to either portfolio total; it is already in both.