---
title: "GET /v1/portfolios/{portfolioSlug}/assets"
method: GET
path: "/v1/portfolios/{portfolioSlug}/assets"
tags: ["Portfolios"]
---

# GET /v1/portfolios/{portfolioSlug}/assets

`GET /v1/portfolios/{portfolioSlug}/assets`

## Request

- Base URL: `https://api.tokenbooks.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tokenbooks.io/v1/portfolios/{portfolioSlug}/assets`
- Auth: API key in header `x-api-key`

## Path parameters

- `portfolioSlug` string, required

## Query parameters

- `pageSize` integer: Requested number of resources to return. Oversized values are clamped to the route limit.
- `pageToken` string: Opaque token returned by the previous list response.
- `asOfDate` string, date-time: Optional snapshot timestamp for historical balance reads
- `showSpam` boolean: Whether spam tokens should be included
- `assetIds` string[]: Asset IDs as CSV or repeated query values
- `hasDefiExposure` boolean: Whether only assets with DeFi exposure should be included

## Response `200`

- PortfolioAssetBalancesListResponseDto
  - `data` object[], required
    - `assetId` string, required: Asset ID
    - `symbol` string, required: Asset symbol
    - `name` string, required: Asset display name
    - `quantity` string, required: Asset quantity
    - `computedQuantity` string, required: Human-readable quantity computed from transaction history
    - `snapshotQuantity` string, required: Human-readable latest snapshot quantity
    - `isBalanceMatch` boolean, required: Whether computed and snapshot quantities match
    - `tokenType` 'ERC20' | 'FIAT' | 'NATIVE' | 'REBASE_LST' | 'INTEREST_BEARING' | 'VALUE_ACCRUING' | 'LP_SHARE' | 'DEBT' | 'REFLECT' | 'VOTE_ESCROWED' | 'NFT', required: Representative token type
    - `unitPrice` string, nullable, required: The one unit price in base currency for this asset. As of a date it is the latest stored close on that date or within the 7 days before it. Under a cost-basis fallback it is cost basis per unit, not a market price, and null when part of the cost basis is withheld
    - `pricedAt` string, date-time, nullable, required: Timestamp when the value was priced (ISO 8601)
    - `lastChange` string, date-time, required: Last balance change timestamp
    - `value` string, nullable, required: Value in base currency; null when the asset has no market price and either no known total cost basis or a quantity that nets to zero
    - `valuation` union, required: How the market value was obtained
      - object
        - `status` 'PRICED', required
        - `source` 'PORTFOLIO_CURRENCY' | 'STABLECOIN_PEG' | 'LIVE' | 'LAST_CLOSE' | 'HISTORICAL_CLOSE', required: LIVE: fresh quote; LAST_CLOSE: newest daily close; HISTORICAL_CLOSE: as-of close; others: worth 1
      - object
        - `status` 'UNAVAILABLE', required
        - `fallback` 'COST_BASIS' | 'NONE', required: COST_BASIS: valued at cost basis; NONE: no value
        - `reason` string, required: Why no market price is shown
    - `costBasis` string, nullable, required: Asset cost basis
    - `heldQuantity` string, nullable, required: Quantity of open lots behind costBasis; cost per unit = costBasis ÷ heldQuantity. Null exactly when costBasis is null
    - `unrealizedGainLoss` string, nullable, required: Asset unrealized gain/loss
    - `roi` string, nullable, required: Asset return on investment
    - `isSpam` boolean, required: Whether every token backing this asset row is spam
    - `transferCount` integer, required: Asset operation count
    - `tokens` object[], required: Concrete token metadata backing this asset row
      - `assetId` string, required: Asset ID
      - `chainId` string, required: Chain ID
      - `address` string, required: Token contract address
      - `type` 'ERC20' | 'FIAT' | 'NATIVE' | 'REBASE_LST' | 'INTEREST_BEARING' | 'VALUE_ACCRUING' | 'LP_SHARE' | 'DEBT' | 'REFLECT' | 'VOTE_ESCROWED' | 'NFT', required: Token type
      - `name` string, required: Token display name
      - `symbol` string, required: Token symbol
      - `isSpam` boolean, required: Whether this concrete token is spam
      - `stablecoinPeggedFiatCurrency` string, nullable, required: Stablecoin peg currency override, when configured
      - `chain` object, required: Chain display metadata
        - `id` string, required: Chain ID
        - `name` string, required: Chain display name
    - `wallets` object[], required: Wallet-level asset breakdown rows
      - `walletName` string, required: Wallet display name
      - `chainId` string, required: Chain ID
      - `address` string, required: Wallet address
      - `quantity` string, required: Asset quantity in this wallet
      - `computedQuantity` string, required: Human-readable quantity computed from transaction history
      - `snapshotQuantity` string, required: Human-readable latest snapshot quantity
      - `isBalanceMatch` boolean, required: Whether computed and snapshot quantities match
      - `tokenType` 'ERC20' | 'FIAT' | 'NATIVE' | 'REBASE_LST' | 'INTEREST_BEARING' | 'VALUE_ACCRUING' | 'LP_SHARE' | 'DEBT' | 'REFLECT' | 'VOTE_ESCROWED' | 'NFT', required: Representative token type
      - `lastChange` string, date-time, required: Last balance change timestamp
      - `value` string, nullable, required: Quantity times the asset's one unit price. Without a price it is the wallet's share of the asset's cost basis, or under wallet-scoped basis the wallet's own cost basis even when the asset's unit price and total are null; null when neither applies
      - `costBasis` string, nullable, required: Wallet asset cost basis when the portfolio tracks wallet-scoped basis; null for universal pooled basis
      - `heldQuantity` string, nullable, required: Quantity of open lots behind costBasis; cost per unit = costBasis ÷ heldQuantity. Null exactly when costBasis is null
      - `unrealizedGainLoss` string, nullable, required: Wallet asset unrealized gain/loss
      - `roi` string, nullable, required: Wallet asset return on investment
      - `isPooledAllocation` boolean, required: Whether this row is under universal pooled basis, where wallet accounting fields are not exact attribution
      - `isSpam` boolean, required: Whether every token backing this wallet asset row is spam
      - `transferCount` integer, required: Wallet asset operation count
      - `tokens` object[], required: Concrete token metadata backing this wallet asset row
        - `assetId` string, required: Asset ID
        - `chainId` string, required: Chain ID
        - `address` string, required: Token contract address
        - `type` 'ERC20' | 'FIAT' | 'NATIVE' | 'REBASE_LST' | 'INTEREST_BEARING' | 'VALUE_ACCRUING' | 'LP_SHARE' | 'DEBT' | 'REFLECT' | 'VOTE_ESCROWED' | 'NFT', required: Token type
        - `name` string, required: Token display name
        - `symbol` string, required: Token symbol
        - `isSpam` boolean, required: Whether this concrete token is spam
        - `stablecoinPeggedFiatCurrency` string, nullable, required: Stablecoin peg currency override, when configured
        - `chain` object, required: Chain display metadata
          - `id` string, required: Chain ID
          - `name` string, required: Chain display name
    - `defiExposure` object[]: Optional DeFi exposure rows for this asset
      - `positionId` string, required: DeFi position ID
      - `positionRef` string: Stable DeFi position reference
      - `positionSelector` object: Explicit selector for opening the DeFi position detail
        - `walletChainId` string, required: Owning wallet chain ID
        - `walletAddress` string, required: Owning wallet address
        - `positionKey` string, required: Protocol-defined stable logical position key
      - `protocol` string, required: Protocol display name
      - `contract` string, required: Protocol contract or custody identifier
      - `status` string, required: DeFi position status
      - `quantity` string, required: Token quantity exposed to DeFi
      - `value` string, nullable, required: Exposure value in base currency, as its wallet row values it. Without a market price it is the exposure's share of the asset's cost basis, or under wallet-scoped basis of its own wallet's cost basis; null when neither applies
  - `pagination` object, required
    - `pageSize` integer, required: Items returned per page.
    - `nextPageToken` string: Opaque token for retrieving the next page.

---

[API](https://skmtc.dev/tokenbooks/apis/tokenbooks-public-api.md) · [All operations](https://skmtc.dev/tokenbooks/apis/tokenbooks-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tokenbooks/apis/tokenbooks-public-api/revisions/634c5114c75f?raw)
