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

# Get token list

`GET /evm/rh/tokens`

Get a paged list of Bags V2 tokens on Robinhood Chain with live enrichment (spot price and bonding progress). Each item carries `priceEthPerToken` (nullable) and `bondingProgressPct`, plus resolved `metadata` (image, description).

`total` is bounded by an internal count-scan cap (10k): when `totalTruncated` is `true` the real total is higher, so treat `total` as a lower bound and keep paging until `items` comes back short instead of using it to conclude pagination is exhausted.

## Query parameters

- `limit` number
- `offset` number
- `migrated` boolean
- `creator` string
- `orderBy` 'createdAtTimestamp' | 'migratedAtTimestamp'
- `orderDirection` 'asc' | 'desc'

## Response `200`

Successfully retrieved token list

- object
  - `success` boolean, required
  - `response` object
    - `items` RhTokenListItem[], required — Page of tokens with live price and bonding-progress enrichment.
      - `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.
    - `total` number, required — Total tokens matching the filter. Bounded by an internal count-scan cap (10k): when `totalTruncated` is true this is a lower bound, not the exact total.
    - `totalTruncated` boolean, required — True when the count scan hit its safety bound before exhausting the matching set. Treat `total` as a lower bound and keep paging until `items` comes back short instead of using `total` to conclude pagination is exhausted.

## Other responses

- `400` — Bad request - Invalid query parameters
- `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)
