---
title: "Get portfolio"
method: GET
path: "/evm/rh/portfolio"
tags: ["Robinhood Chain"]
---

# Get portfolio

`GET /evm/rh/portfolio`

Get an owner's Bags V2 portfolio on Robinhood Chain.

- `holdings`: tokens the owner has traded and still holds, with live list enrichment and balance.
- `earnings`: every token the owner created, is partner on, or has claimed from — including launches with no earnings yet (`lifetimeWei` `"0"`). Each row carries the `feeShare` contract to claim against, `claimableWei`, and `lifetimeWei` (the owner's claimed + currently-claimable total, so claimed-out launches still list).

`truncated` is `true` only when created/partner-token discovery hit the ~10k-token safety bound before exhausting the owner's tokens, in which case `earnings` is a subset — surface "some earnings may be missing" rather than treating the list as complete.

## Query parameters

- `owner` string, required

## Response `200`

Successfully retrieved portfolio

- object
  - `success` boolean, required
  - `response` object
    - `holdings` RhPortfolioHolding[], required — Tokens the owner has traded and still holds, with live enrichment and balance.
      - `token` RhTokenListItem, required
        - `address` string, required — EIP-55 checksummed token address.
        - `name` string, required — Token name.
        - `symbol` string, required — Token symbol.
        - `metadataURI` string, required — Token metadata URI as stored on-chain (typically IPFS).
        - `metadata` RhTokenMetadata, required
          - `image` string, nullable, required — Resolved token image URL. Null when the metadata URI could not be resolved.
          - `description` string, nullable, required — Resolved token description. Null when the metadata URI could not be resolved.
        - `curve` string, required — Address of the token's bonding curve contract.
        - `feeShare` string, required — Address of the token's fee-share contract.
        - `poolId` string, required — Uniswap V4 pool ID (bytes32 hex string) assigned at launch.
        - `creator` string, required — EIP-55 checksummed address of the token creator.
        - `partner` string, nullable, required — EIP-55 checksummed partner address. Null when the token was launched without a partner.
        - `partnerFeeBps` number, required — Partner's share of the creator-side fee half in basis points, snapshotted at launch.
        - `createdAtBlock` number, required — Block number of the launch transaction.
        - `createdAtTimestamp` number, required — Launch time as unix seconds.
        - `txHash` string, required — Transaction hash of the launch.
        - `migrated` boolean, required — Whether the token has graduated from the bonding curve to its Uniswap V4 pool.
        - `migratedAtBlock` number, nullable, required — Block number of the migration. Null while the token is still bonding.
        - `migratedAtTimestamp` number, nullable, required — Migration time as unix seconds. Null while the token is still bonding.
        - `priceEthPerToken` string, nullable, required — Live spot price as an 1e18 fixed-point decimal string (ETH per whole token). For migrated tokens this comes from the pool (slot0) only — null when the pool read is unavailable. Render null as "unavailable", never 0.
        - `bondingProgressPct` number, required — Bonding-curve graduation progress, 0-99 while bonding and 100 once migrated.
      - `balanceWei` string, required — The owner's token balance in token base units, as string to support bigint.
    - `earnings` RhPortfolioEarnings[], required — Every token the owner created, is partner on, or has claimed from — including launches with no earnings yet (`lifetimeWei` "0").
      - `token` RhToken, required
        - `address` string, required — EIP-55 checksummed token address.
        - `name` string, required — Token name.
        - `symbol` string, required — Token symbol.
        - `metadataURI` string, required — Token metadata URI as stored on-chain (typically IPFS).
        - `metadata` RhTokenMetadata, required
          - `image` string, nullable, required — Resolved token image URL. Null when the metadata URI could not be resolved.
          - `description` string, nullable, required — Resolved token description. Null when the metadata URI could not be resolved.
        - `curve` string, required — Address of the token's bonding curve contract.
        - `feeShare` string, required — Address of the token's fee-share contract.
        - `poolId` string, required — Uniswap V4 pool ID (bytes32 hex string) assigned at launch.
        - `creator` string, required — EIP-55 checksummed address of the token creator.
        - `partner` string, nullable, required — EIP-55 checksummed partner address. Null when the token was launched without a partner.
        - `partnerFeeBps` number, required — Partner's share of the creator-side fee half in basis points, snapshotted at launch.
        - `createdAtBlock` number, required — Block number of the launch transaction.
        - `createdAtTimestamp` number, required — Launch time as unix seconds.
        - `txHash` string, required — Transaction hash of the launch.
        - `migrated` boolean, required — Whether the token has graduated from the bonding curve to its Uniswap V4 pool.
        - `migratedAtBlock` number, nullable, required — Block number of the migration. Null while the token is still bonding.
        - `migratedAtTimestamp` number, nullable, required — Migration time as unix seconds. Null while the token is still bonding.
      - `feeShare` string, required — Address of the fee-share contract to claim against for this row.
      - `claimableWei` string, required — The owner's currently claimable amount on this token (wei), as string to support bigint.
      - `lifetimeWei` string, required — The owner's lifetime earnings on this token (wei) = already claimed + currently claimable, as string to support bigint. "0" for launches with no earnings yet (still listed).
    - `truncated` boolean, required — True only when created/partner-token discovery hit the ~10k-token safety bound before exhausting the owner's tokens; `earnings` is then a subset, so surface "some earnings may be missing" rather than treating the list as complete. False on the normal path.

## Other responses

- `400` — Bad request - Invalid owner address
- `401` — Unauthorized - Invalid or missing API key
- `500` — Internal server error

---

[API](https://skmtc.net/bags/apis/bags-public-api-v2.md) · [All operations](https://skmtc.net/bags/apis/bags-public-api-v2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/bags/bags-public-api-v2/revisions/4a14b82cd39d/schema)
