# Tokens

Source: https://www.solscanner.app/docs/indexer/reference/tokens

> Token identity, supply, holders, transfers, swaps, statistics, candles and launch lifecycle.

Everything keyed by a token address. Price, market cap, liquidity and candle routes resolve against a *venue*, one pool chosen by the default-venue rule, and never blend quote currencies. A token trading against wrapped native and against a stablecoin has two separate series.

31 routes. Every path below is served under `/index/v1/{chain}`, and every request carries an `x-api-key` header, so those two are not repeated per route. The shared contract for pagination, snapshots, precision and absence is in [Read API](/docs/indexer/api).

Creator Tokens [#creator-tokens]

```http
GET /creators/{address}/tokens
```

Every token one deployer created, newest first.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Launchpads [#launchpads]

```http
GET /launchpads
```

The registered launchpad table this build decodes (29 pads, including the Robinhood tokenized-equities issuer `RobinhoodEquities`).

Launchpad Launches [#launchpad-launches]

```http
GET /launchpads/{pad}/launches
```

Launches from one launchpad across every one of its factory deployments (canonical factory plus aliases), oldest first by default (`order=desc` for newest first); ordered by chain coordinate (`order: ascending_by_block_then_index`) once the store's coordinate index is built, by launch sequence before that. Rows carry the same normalised `metadataUri` and `imageUri`/`imageProvenance` as `/tokens/{token}/launch`.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `pad`     | path  | yes      | Registered launchpad name.                                                                                                                                                                                                      |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

All Tokens [#all-tokens]

```http
GET /tokens
```

Paged catalogue of every token the store has observed, including creation-only candidates that were never confirmed as ERC-20.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Token [#token]

```http
GET /tokens/{address}
```

Token detail: name, symbol, decimals, exact supply, creation provenance, and an embedded stats block resolved against a default venue. Carries `launch { launchpad, state, metadataUri, imageUri, launchSequence }` from the launch-by-token join under the same snapshot, `null` when no launch resolved the token. Carries `holderCount { value, status, asOfBlock, burnSinkHolders }`: see "Holder count" below.

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token ATH [#token-ath]

```http
GET /tokens/{address}/ath
```

All-time high price, resolved across the token's pools within a bounded fanout. A quote asset (WETH) with no pool priced in the quote is answered from the counter's pools, inverted (`provenance` says so).

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token ATL [#token-atl]

```http
GET /tokens/{address}/atl
```

All-time low, same shape as `/ath`.

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token Authority Events [#token-authority-events]

```http
GET /tokens/{address}/authority-events
```

Coordinate-ordered feed of privileged-action log shapes observed on the contract: ownership transfers, post-creation mints. Evidence only, no verdict.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Token Balance [#token-balance]

```http
GET /tokens/{address}/balance/{wallet}
```

One wallet's current balance of one token, derived from observed transfers.

| Parameter | In   | Required | Notes                            |
| --------- | ---- | -------- | -------------------------------- |
| `address` | path | yes      | 0x-prefixed 20-byte hex address. |
| `wallet`  | path | yes      | 0x-prefixed 20-byte hex address. |

Token Creator [#token-creator]

```http
GET /tokens/{address}/creator
```

The deployer address and the creation coordinate.

| Parameter | In   | Required | Notes                            |
| --------- | ---- | -------- | -------------------------------- |
| `address` | path | yes      | 0x-prefixed 20-byte hex address. |

Token First Seen [#token-first-seen]

```http
GET /tokens/{address}/first-seen
```

The coordinate at which this token was first observed, and the evidence class that observed it.

| Parameter | In   | Required | Notes                            |
| --------- | ---- | -------- | -------------------------------- |
| `address` | path | yes      | 0x-prefixed 20-byte hex address. |

Token Holders [#token-holders]

```http
GET /tokens/{address}/holders
```

A token's holders, **ranked by balance by default**. `sort=balance` (default) pages the same exact balance-descending holder index as `/top-holders` (same `(balance, wallet)` cursor: the two routes' cursors are interchangeable), descending only, burn sinks excluded, in this route's lighter row shape (no supply share or audit annotations). `sort=wallet_id` is the old walk: the complete non-zero balance set in interned wallet-id order (`asc` default, `desc` allowed), the only view that includes negative balances and burn sinks, NOT a ranking. Every page states `sort`, `order`, `orderedBy` and `orderingNote`. Carries `holderCount`. Before 2026-09-19 the route had no `sort` and always walked wallet-id order.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Token Liquidity [#token-liquidity]

```http
GET /tokens/{address}/liquidity
```

Protocol-native liquidity for one pair aggregated over a bounded set of contributing pools. V2 and concentrated liquidity remain separate. Same default quote and `409 quote_not_admitted` rule as `/ticks`.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                              |
| `quote`   | query | no       | The quote every reserve/liquidity figure below is denominated in: named explicitly, auto-resolved when the token trades against exactly one resolved quote, or refused with a `400` on ambiguity: same resolution rule as `/ticks`/`/ohlcv`,. |

Token Market Cap [#token-market-cap]

```http
GET /tokens/{address}/mcap
```

Market capitalisation at the anchored block, from exact supply and a resolved price.

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token Market Cap Series [#token-market-cap-series]

```http
GET /tokens/{address}/mcap/series
```

Market-cap series over time.

| Parameter | In    | Required | Notes                                                                                                                                                                               |
| --------- | ----- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                    |
| `frame`   | query | yes      | `1s`, `30s`, `1m`, `1h`, or `1d` candle width. `1s`/`30s` rows exist only for a pool with durable fine-candle retention; see the response's own `fineSeriesAvailable`.              |
| `from`    | query | yes      | Inclusive start of the unix-second range the candle series covers, aligned down to its `frame`'s own bucket width. Must be `<= to`.                                                 |
| `to`      | query | yes      | Inclusive end of the unix-second range the candle series covers, aligned down to its `frame`'s own bucket width. The requested span is capped at a fixed number of candle buckets.  |
| `quote`   | query | no       | The market-cap series is a time series, so `frame`/`from`/`to` are required exactly like `/pools/{address}/ohlcv`; `quote`, `cursor`, `limit`, and `order` behave the same way too. |
| `cursor`  | query | no       | The market-cap series is a time series, so `frame`/`from`/`to` are required exactly like `/pools/{address}/ohlcv`; `quote`, `cursor`, `limit`, and `order` behave the same way too. |
| `limit`   | query | no       | The market-cap series is a time series, so `frame`/`from`/`to` are required exactly like `/pools/{address}/ohlcv`; `quote`, `cursor`, `limit`, and `order` behave the same way too. |
| `order`   | query | no       | The market-cap series is a time series, so `frame`/`from`/`to` are required exactly like `/pools/{address}/ohlcv`; `quote`, `cursor`, `limit`, and `order` behave the same way too. |

Token OHLCV [#token-ohlcv]

```http
GET /tokens/{address}/ohlcv
```

Token-grain candles for one pair, aggregated over the same bounded set of contributing pools. Empty buckets are absent. Same default quote and `409 quote_not_admitted` rule as `/ticks`. Sub-minute frames are gated PER POOL: cold pools are skipped (`fineSeriesColdPools`, `finePoolsSkipped`) and the hot subset is served (`fineSeriesAvailable: true`). Candle rows carry `volumeBase`/`volumeQuote` and `priceNumerator`/`priceDenominator` aliases shared with the pool grain.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                                                                                                                     |
| --------- | ----- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                                                                                                                          |
| `frame`   | query | yes      | `1s`, `30s`, `1m`, `1h`, or `1d` candle width. `1s`/`30s` rows exist only for a pool with durable fine-candle retention; see the response's own `fineSeriesAvailable`.                                                                                                                                                                    |
| `from`    | query | yes      | Inclusive start of the unix-second range the candle series covers, aligned down to its `frame`'s own bucket width. Must be `<= to`.                                                                                                                                                                                                       |
| `to`      | query | yes      | Inclusive end of the unix-second range the candle series covers, aligned down to its `frame`'s own bucket width. The requested span is capped at a fixed number of candle buckets.                                                                                                                                                        |
| `quote`   | query | no       | The token-grain OHLCV page. `frame`/`from`/`to` are required exactly like `/pools/{address}/ohlcv`'s. `quote` is the parameter that makes this route honest: a token trading against WETH and against a stablecoin has TWO candle series, and naming neither is refused with a `400` listing the candidates rather than blended into one. |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                                                                                                                                  |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                                                                                                                                |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract.                                                                                                           |

Token Overview [#token-overview]

```http
GET /tokens/{address}/overview
```

First-paint composite: identity, price, market cap and window stats in one response. `poolsTruncated` is set for EITHER cut (the 2,048 mark bound or the 32-row listing, `poolsListedBound`); `poolFanoutExceeded` aliases `poolsFanoutExceeded`. When the 32-row listing cut applied under a resolved `price.quote`, `poolsNextCursor` + `poolsNextRoute` continue the list on `/tokens/{address}/pools/ranked?quote=` (same membership, same volume key, so the next page is exactly the pools after these 32); both are `null` otherwise. Top-level `holderCount { status: exact|exact_retained_list|backfilling|unknown_retained_list_saturated|token_not_indexed, count, retainedListSize, retainedListCap, asOfBlock, burnSinkHolders }` keeps its richer WS-B shape; the embedded `token.holderCount` is the uniform `{ value, status, asOfBlock, burnSinkHolders }` shape every other holder-bearing route publishes.

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token Pools Aggregate [#token-pools-aggregate]

```http
GET /tokens/{address}/pools/aggregate
```

Exact registered pools trading the token, grouped by counter-currency; V4 rows preserve manager plus `poolId`. Past 200 pools the busiest 200 by each pool's own trailing volume are grouped with `poolsTruncated: true` and the full `poolsConsidered`: no longer empty `groups`; `/tokens/{currency}/pools` paginates the complete set.

| Parameter | In    | Required | Notes                                                                                                                                                                                         |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                              |
| `quote`   | query | no       | `/mcap`, `/ath`, and `/atl` are bounded, unpaginated, quote-native snapshots: no cursor, no limit, no order: only an optional `quote` to resolve which quote-denominated aggregate to answer. |

Token Pools Ranked [#token-pools-ranked]

```http
GET /tokens/{address}/pools/ranked
```

The token's markets: the same bounded membership `/overview`, `/mcap` and `/ohlcv` count (≤2,048, `membershipSource`), ranked by each pool's rolling-stats trailing-24h volume (`sort=volume_24h`, default) or by USD liquidity (`sort=liquidity`: each pool's `liquidityUsd`, unpriced pools last grouped by quote then quote-side amount), cursor-paged, descending only, `limit` 1..=100 (default 32). With `?quote=` it ranks that quote group by quote-native volume (the `/overview` listing order, so `/overview`'s `poolsNextCursor` resumes here); without it every quote group is ranked together by USD volume, pools whose quote has no USD mark last (grouped by quote, then quote volume). Each row is the `/overview` pool row plus `rank`, `quoteAsset`, `rankedVolume24hQuote` and `rankedVolume24hUsd`. Only the served page is hydrated.

| Parameter | In    | Required | Notes                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed token address.                                                                                                      |
| `sort`    | query | no       | `volume_24h` (default) or `liquidity` (`liquidityUsd`, unpriced pools last). A liquidity cursor never resumes a volume ranking. |
| `quote`   | query | no       | Rank one quote group by quote-native volume instead of ranking every group together by USD volume.                              |
| `cursor`  | query | no       | Opaque page cursor. `/overview`'s `poolsNextCursor` resumes here when `quote` matches.                                          |
| `limit`   | query | no       | Rows per page, 1 to 100. Defaults to 32.                                                                                        |
| `order`   | query | no       | Only `desc` is accepted; any other value is a `400`.                                                                            |

Token Stats [#token-stats]

```http
GET /tokens/{address}/stats
```

Rolling 5m/1h/4h/24h statistics: volume both sides, buy and sell counts, bounded distinct traders, exact price change. Same server-side default quote as `/traders` (`quoteSelection`); `quote_ambiguous` remains only when no quote has USD-markable volume.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                 |
| --------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                      |
| `quote`   | query | no       | `quote` names the asset the windows are denominated in. Optional: a token whose pools all share one quote resolves it, and one that trades against several publishes the candidates rather than blending their units. |

Token Swaps [#token-swaps]

```http
GET /tokens/{address}/swaps
```

Compact quote-policy trades for this token, denormalised with side, amounts, pool and executor. This is not the complete exact pool universe. `quote.decimalsProvenance` says whether `quote.decimals` came from the pool-quote row or the strict token-metadata fallback.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Token Ticks [#token-ticks]

```http
GET /tokens/{address}/ticks
```

Per-trade ticks for one pair. Ticks are merged across a bounded set of contributing pools. Same server-side default quote (`quoteSelection`); a `?quote=` the pair-index fallback cannot admit is `409 quote_not_admitted` with `admissibleQuotes`, never an empty page. `poolsFanoutExceeded` aliases `poolFanoutExceeded`; prices carry `priceNumerator`/`priceDenominator` aliases. `ticksSource: token_index` (every pool of the quote group, `poolsSkipped: 0`) inside the index coverage floor `ticksIndexedFrom`, else `pool_merge`.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                                                    |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                                                         |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                                                                 |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                                                               |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract.                                          |
| `quote`   | query | no       | `quote` behaves like every other quote-native token route: named explicitly, auto-resolved when the token trades against exactly one resolved quote, or refused with a `400` naming the candidates when several exist and the caller named none: never a blended series. |

Token Top Holders [#token-top-holders]

```http
GET /tokens/{address}/top-holders
```

The COMPLETE balance-descending holder index, cursor-paged, no cap (supersedes the old capped/approximate ranking, which now backs only `/traders`' internal candidate set). `orderedBy: balance_desc`; `nextCursor`/`truncatedBy` when a page ends. Burn sinks (`0x…dEaD`, `address(0)`) never get a row at all (excluded at write time) and are published as `burnedBalance`/`burnedPct`; each row adds `supplySharePct` against `circulatingSupplyExcludingDead` (`null` when that supply is not `valid`) and the balance-drift audit flags. Carries `holderCount`. Use this for a "top holders" table that needs supply share; `/holders` (default `sort=balance`) is the same order in a lighter row.

| Parameter | In    | Required | Notes                                                                                                                                      |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                           |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema. |

Token Traders [#token-traders]

```http
GET /tokens/{address}/traders
```

Trader rows for the token over a window, with per-trader activity. A multi-quote token without `?quote=` now resolves the server-side default (`quoteSelection: auto_highest_24h_usd_volume`); `tokenIdentity`, `cohortsComplete`/`cohortsIncompleteReason` and `fundingGeneration` ride on the page.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| --------- | ----- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                                                                                                                                                                                                                                                                         |
| `sort`    | query | no       | `sort` picks the ranked dimension (`remaining`, `bought`, or `pnl`: `last_active` is a recognized name that is always refused); `order` is that dimension's direction, exactly like every other paginated route. `quote` is REQUIRED whenever `sort` needs one, and otherwise resolves like `/overview`'s does: named explicitly, auto-resolved when exactly one quote exists, or left unresolved (with `availableQuotes` published) when several exist and the caller named none. |
| `order`   | query | no       | `sort` picks the ranked dimension (`remaining`, `bought`, or `pnl`: `last_active` is a recognized name that is always refused); `order` is that dimension's direction, exactly like every other paginated route. `quote` is REQUIRED whenever `sort` needs one, and otherwise resolves like `/overview`'s does: named explicitly, auto-resolved when exactly one quote exists, or left unresolved (with `availableQuotes` published) when several exist and the caller named none. |
| `quote`   | query | no       | `sort` picks the ranked dimension (`remaining`, `bought`, or `pnl`: `last_active` is a recognized name that is always refused); `order` is that dimension's direction, exactly like every other paginated route. `quote` is REQUIRED whenever `sort` needs one, and otherwise resolves like `/overview`'s does: named explicitly, auto-resolved when exactly one quote exists, or left unresolved (with `availableQuotes` published) when several exist and the caller named none. |

Token Trades Aggregate [#token-trades-aggregate]

```http
GET /tokens/{address}/trades/aggregate
```

Trade aggregate filterable by cohort tag, for splitting flow by wallet cluster. Same server-side default quote as `/traders` (`quoteSelection`).

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                                                                                             |
| --------- | ----- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                                                                                                  |
| `period`  | query | yes      | `period` is required (`5m`, `1h`, `4h`, `24h`, anchored to canonical block coordinates). `tag` is optional: `creator`, `fresh_wallet`, `sniper`, `cohort:{decimal id}`, or `funded_by:0x..`; omitted, the aggregate covers every trade in the window. `quote` resolves like every other quote-native token route. |
| `tag`     | query | no       | `period` is required (`5m`, `1h`, `4h`, `24h`, anchored to canonical block coordinates). `tag` is optional: `creator`, `fresh_wallet`, `sniper`, `cohort:{decimal id}`, or `funded_by:0x..`; omitted, the aggregate covers every trade in the window. `quote` resolves like every other quote-native token route. |
| `quote`   | query | no       | `period` is required (`5m`, `1h`, `4h`, `24h`, anchored to canonical block coordinates). `tag` is optional: `creator`, `fresh_wallet`, `sniper`, `cohort:{decimal id}`, or `funded_by:0x..`; omitted, the aggregate covers every trade in the window. `quote` resolves like every other quote-native token route. |

Token Transfer Fee Observations [#token-transfer-fee-observations]

```http
GET /tokens/{address}/transfer-fee-observations
```

Per swap for one pair, the venue-stated token amount against the amount actually credited, over the same bounded set of contributing pools.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                                                                    |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                                                         |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                                                                 |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                                                               |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract.                                          |
| `quote`   | query | no       | `quote` behaves like every other quote-native token route: named explicitly, auto-resolved when the token trades against exactly one resolved quote, or refused with a `400` naming the candidates when several exist and the caller named none: never a blended series. |

Token Transfers [#token-transfers]

```http
GET /tokens/{address}/transfers
```

Exact ERC-20 transfer history with mint, burn and dead-sink flags.

| Parameter | In    | Required | Notes                                                                                                                                                                                                                           |
| --------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `address` | path  | yes      | 0x-prefixed 20-byte hex address.                                                                                                                                                                                                |
| `cursor`  | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`   | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`   | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |

Token Default Venue [#token-default-venue]

```http
GET /tokens/{address}/venue
```

Which pool the default-venue rule picks, and the values that decided it.

| Parameter | In   | Required | Notes                            |
| --------- | ---- | -------- | -------------------------------- |
| `address` | path | yes      | 0x-prefixed 20-byte hex address. |

Token Launch [#token-launch]

```http
GET /tokens/{token}/launch
```

Launch lifecycle state for a launchpad token: curve, graduation status, venue, `metadataUri` (normalised on read: bare IPFS CIDs and `/ipfs/` paths as `ipfs://…`, inline JSON collapsed to its image or `""`), plus `imageUri`/`imageProvenance` (`launch_calldata`, `curated`, `none`). Every registered pad links its token as of 2026-09-18; historical rows relink through `rh-store-doctor backfill-launch-tokens`.

| Parameter | In   | Required | Notes                            |
| --------- | ---- | -------- | -------------------------------- |
| `token`   | path | yes      | 0x-prefixed 20-byte hex address. |

New Tokens [#new-tokens]

```http
GET /tokens/new
```

Newest-first discovery feed of tokens, ordered by the block/tx/log coordinate they were first observed at. Each row carries `symbol`/`name`/`decimals` from the strict metadata observation and `holderCount` (one memoised point read per distinct token per page).

| Parameter            | In    | Required | Notes                                                                                                                                                                                                                           |
| -------------------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cursor`             | query | no       | Opaque page cursor. See [Pagination](/docs/indexer/api).                                                                                                                                                                        |
| `limit`              | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                      |
| `order`              | query | no       | Sort direction: this route's accepted values and default are on the schema (`enum`/`default`); a route whose backing index has no reverse walk accepts only `asc`. See [Pagination](/docs/indexer/api) for the shared contract. |
| `launchpads`         | query | no       | Comma-separated canonical launchpad names: watch only these. `GET /launchpads` lists the accepted names.                                                                                                                        |
| `exclude_launchpads` | query | no       | Comma-separated canonical launchpad names: exclude these. Naming the same launchpad in both is not an error; exclusion always wins.                                                                                             |

Token Search [#token-search]

```http
GET /tokens/search
```

Token search over symbol, name and address, composable with market and date filters and a caller-chosen sort.

| Parameter                          | In    | Required | Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ---------------------------------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `mode`                             | query | no       | Optional `index_page` selects bounded text order, not a global ranking.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `allowScan`                        | query | no       | Required for symbol/name searches, which rank every bounded text-index match. `address=` remains an indexed point lookup and needs no opt-in.                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `address`                          | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `symbol`                           | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `symbol_prefix`                    | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `name`                             | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `name_prefix`                      | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `quote`                            | query | no       | Denominates every quote-dependent filter/sort AND selects which pair each row's live statistics display. Required whenever a market filter or sort key is used.                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `window`                           | query | no       | `5m`, `1h`, `4h`, or `24h`. Defaults to `24h` (`/screener` defaults to `5m`).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `sort`                             | query | no       | The ordering key. Defaults to `first_seen_block`. Every other value is `/screener`'s own market vocabulary, reused verbatim.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `order`                            | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `cursor`                           | query | no       | Exactly one selector is accepted per request: `address` short-circuits to the exact answer; `symbol`/`name` are exact (already-normalized) matches; `symbol_prefix`/`name_prefix` are bounded prefix seeks. Combining selectors, or pairing `address` with `cursor`/`sort`/`order`, is refused rather than silently picking one. The market and date filter/sort fields below are exactly `/screener`'s own vocabulary (`min_total_volume_quote` through `require_distinct_exact`), reused verbatim, plus `min_first_seen_block`/ `max_first_seen_block` for the one axis this route adds. |
| `limit`                            | query | no       | Page row cap. See [Pagination](/docs/indexer/api) for the shared contract; the exact default and maximum for this route are on the schema.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `min_total_volume_quote`           | query | no       | Inclusive lower bound on the row's `totalVolumeQuote`, exact quote-native base units as a decimal string.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `min_buy_volume_quote`             | query | no       | Inclusive lower bound on the row's `buyVolumeQuote`, exact quote-native base units as a decimal string.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `min_sell_volume_quote`            | query | no       | Inclusive lower bound on the row's `sellVolumeQuote`, exact quote-native base units as a decimal string.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `min_trades`                       | query | no       | Inclusive lower bound on the row's `trades` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `min_buys`                         | query | no       | Inclusive lower bound on the row's `buys` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `min_sells`                        | query | no       | Inclusive lower bound on the row's `sells` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `min_distinct_traders_lower_bound` | query | no       | Inclusive lower bound on the row's `distinctTraders.lowerBound`: the proven floor, not the (possibly higher) estimate.                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `max_total_volume_quote`           | query | no       | Inclusive upper bound on the row's `totalVolumeQuote`, exact quote-native base units as a decimal string.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `max_trades`                       | query | no       | Inclusive upper bound on the row's `trades` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `max_buys`                         | query | no       | Inclusive upper bound on the row's `buys` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `max_sells`                        | query | no       | Inclusive upper bound on the row's `sells` count.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `min_covered_blocks`               | query | no       | Inclusive lower bound on the row's `window.coveredBlocks`: excludes a subject whose ranked span was clipped short (a young chain, a thin history) below this many blocks.                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `require_window_fully_covered`     | query | no       | When `true`, excludes any row where `window.windowFullyCovered` is `false`: the exact-only counterpart to `minCoveredBlocks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `require_distinct_exact`           | query | no       | When `true`, excludes any row whose distinct-trader counts are not proven exact (`distinctBuyers`/`distinctSellers`/`distinctTraders`' own `exact` field), rather than accepting a sketch estimate.                                                                                                                                                                                                                                                                                                                                                                                        |
| `min_first_seen_block`             | query | no       | Date filter: the token's first-seen block is at or above this.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `max_first_seen_block`             | query | no       | Date filter: the token's first-seen block is at or below this.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
