Skip to main content
GET
Get Wallet Holdings
Returns the current token holdings for one wallet or a comma-separated list of wallets.
This endpoint is still in alpha and may experience issues. If you run into unexpected behavior, use /wallet/portfolio as a fallback.
Use GET for standard wallet queries. Use POST on the same path when you need to filter returned tokens with Prisma-like filters on enriched token fields.

Endpoints

Query Parameters

Example

POST Body

The POST body accepts the same wallet parameters as GET, plus filters.

POST Filters

The syntax mirrors the Prisma-like filter shape used by token/filters: direct scalar values mean equals, operator objects can be nested, and logical branches use AND, OR, and NOT.
Filters run on holding.token, not on wallet-specific fields such as amount, amountUSD, or allocation. The response is recalculated after filtering, so totalWalletBalanceUSD, holdingsCount, balancesLength, and each remaining holding’s allocation match the filtered result.

Supported Operators

Nested Fields

Both dot-path and nested-object syntax are valid.

Filterable Fields

Every field in holding.token is filterable. holding.token uses the same enriched token details object returned by TokenService; the full token interface is documented in Token Object. Common filter examples:

POST Example: Safe Liquid Holdings

POST Example: OR Logic

Response Model

The response is camelCase, and USD stays uppercase. The portfolio service returns holdings in this shape directly; legacy portfolio endpoints map this shape back to their old response models.
allocation is the holding share of totalWalletBalanceUSD, expressed as a percentage. For example, 23.88 means the token represents 23.88% of the returned wallet holdings value.

Token Object

holding.token is the enriched token details object returned by TokenService. POST filters operate on this same object.

Native vs Wrapped Balances

Native gas balances are returned as their own holding with the canonical address 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee. This applies to EVM chains and to Solana. Wrapped tokens use their real contract or mint address when they are returned as wallet holdings. Do not infer wrapped balances from a native holding, even when both rows share the same asset, symbol, or price. Clients that need to distinguish native gas from wrapped ERC-20/SPL balances should key by holding.token.chainId + holding.token.address or by each chainBalances[*].address, not by symbol or asset ID alone. chainBalances stays multi-chain inside each holding. For example, native ETH on Ethereum and Base is one native ETH holding with two chain balances. WETH is a separate holding only when the wallet has a distinct WETH balance row, and it keeps the wrapped contract address, such as 0x4200000000000000000000000000000000000006 on Base. Native SOL on Solana uses 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; WSOL uses the WSOL mint.

Example Response

Query Parameters

wallet

Wallet address

wallets

Comma-separated wallet addresses

portfolio

Portfolio ID

blockchains

Comma-separated blockchain IDs

asset

Filter by specific asset

from

Start date

to

End date

portfolio_settings

Portfolio display settings

unlistedAssets

Include unlisted assets

period

Time period

accuracy

Data accuracy level

testnet

Include testnet data

minLiquidity

Minimum liquidity threshold in USD

filterSpam

Filter spam tokens

pnl

Include PnL data

rpc

Response

200 - application/json

Wallet holdings response

data
object
required
backfillStatus
enum<string>
Available options:
processed,
processing,
pending