> ## Documentation Index
> Fetch the complete documentation index at: https://docs.codex.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Discover Tokens

> Learn how to build token dashboards with trending data, advanced filters, and token search

In this recipe, we'll show you how to use the best endpoint in the industry, [`filterTokens`](/api-reference/queries/filtertokens), to populate "Discovery" pages where you can showcase tokens that fit specific criteria. From simple search queries to complex filtering and trending data, Codex has you covered across [80+ networks](https://docs.codex.io/networks) with data on over 70M+ tokens.

<Tip>
  Remember: You can always inspect queries on [Defined.fi](https://www.defined.fi?utm_source=codex\&utm_medium=docs\&utm_campaign=recipes-discover-tokens) for inspiration or to see how we use Codex to present data on our frontend. We recommend using the [Chrome GraphQL Network Inspector](https://chromewebstore.google.com/detail/graphql-network-inspector/ndlbedplllcgconngcnfmkadhokfaaln).
</Tip>

## Search by Name or Symbol

Start with basic token discovery using phrase search to find tokens by name, symbol, or contract address. The [`filterTokens`](/api-reference/queries/filtertokens) endpoint supports improved symbol matching when using the phrase parameter with \$ prefix (eg: \$PEPE). Use the \$ prefix for results with improved token symbol matches, or without the \$ prefix to return partial token symbol matches. You can also use the token contract address to ensure an exact match.

We also recommend utilizing ranking attributes such as `volume24` or `trendingScore24`, and filters such as `liquidity` to help ensure search results are relevant.

<AccordionGroup>
  <Accordion title="Example query with $ prefix and trendingScore24 results">
    [Test this query in the Explorer →](/explore)

    ```graphql theme={null} theme={null}
    query filterTokens {
      filterTokens(
        phrase: "$PEPE"
        rankings: { attribute: trendingScore24, direction: DESC }
      ) {
        results {
          token {
            name
            symbol
            decimals
            createdAt
            address
            totalSupply
            socialLinks {
              twitter
            }
          }
          marketCap
          liquidity
          holders
        }
      }
    }
    ```
  </Accordion>

  <Accordion title="Example query with partial symbol match and volume24 results">
    [Test this query in the Explorer →](/explore)

    ```graphql theme={null} theme={null}
    query filterTokens {
      filterTokens(
        phrase: "PEPE"
        rankings: { attribute: volume24, direction: DESC }
        filters: { liquidity: { gt: 10000 } }
      ) {
        results {
          token {
            name
            symbol
            decimals
            createdAt
            address
            totalSupply
            socialLinks {
              twitter
            }
          }
          marketCap
          liquidity
          holders
          volume24
        }
      }
    }
    ```
  </Accordion>
</AccordionGroup>

<Warning>
  If your search function is set to return results after each keystroke by a user, remember that this can cause a lot of usage against your plan, as each keystroke is a call to `filterTokens`. If this is a concern, ensure search results are only returned on-demand when the search phrase is fully entered by the user.
</Warning>

## Discover Trending Tokens

Use ranking attributes and other token metrics to filter for tokens that could be showcased on a trending dashboard or alpha discovery page due to their trading activity over a specific timeframe.

<Accordion title="Example query with trendingScore24, avg wallet age >1 week, and other filters">
  [Test this query in the Explorer →](/explore)

  ```graphql theme={null} theme={null}
  query filterTokens {
    filterTokens(
      rankings: { attribute: trendingScore24, direction: DESC }
      filters: {
        liquidity: { gt: 100000 }
        walletAgeAvg: { gt: 604800 }
        marketCap: { gt: 500000, lte: 5000000 }
        network: 1399811149
        volume24: { gt: 500000 }
        launchpadCompleted: true
      }
      statsType: FILTERED
      limit: 10
    ) {
      results {
        token {
          name
          symbol
          decimals
          createdAt
          address
          totalSupply
          socialLinks {
            twitter
          }
        }
        marketCap
        liquidity
        holders
        volume24
        walletAgeAvg
        buyCount24
        pair {
          address
          createdAt
        }
      }
    }
  }
  ```
</Accordion>

<Note>
  While there may be many hundreds of tokens that fit your specific query criteria, keep in mind that [`filterTokens`](/api-reference/queries/filtertokens) is limited to a maximum of 200 results per API call. This is why ranking attributes and specific filters are important to ensure you receive the token results that are most relevant for your query.
</Note>

For real-time trending updates, use the [`onFilterTokensUpdated`](/api-reference/subscriptions/onfiltertokensupdated) subscription. It accepts the same filter inputs as `filterTokens` and streams matching tokens as their metrics change, so you can keep a live trending list without polling.

### Verified Metadata

Token and organization metadata on the `filterTokens`, `token`, and `tokens` endpoints is enriched by [The Grid](https://thegrid.id/), an ecosystem intelligence platform that collects and human-verifies off-chain data for established Web3 projects.

When Grid data is available, queries return three additional fields: `asset` (verified token metadata including description, icon, and cross-chain deployments), `assetDeployments` (a list of every network and address the token is deployed on), and `organization` (metadata about the issuing organization, including URLs and socials).

This data is not available for every token. The Grid covers established, verified projects and not unverified or newly launched tokens.

For display fields like name, symbol, and description, and any metadata contributions made by Codex will override and take priority over Grid data.

### Rank by Community Engagement

Coin Communities are Pump.fun's native discussion spaces where a token's holders talk about the coin. Codex surfaces their engagement metrics so you can rank and discover tokens by how active their community is, not just by trading activity.

`filterTokens` exposes four ranking attributes for this:

* `coinCommunityPostCount` — total posts in the community
* `coinCommunityMemberCount` — total members
* `coinCommunityLikeCount` — total likes
* `coinCommunityLastPostAt` — timestamp of the most recent post, useful for surfacing communities that are currently active

The same metrics are available as response fields on the token's `coinCommunity` object.

<Accordion title="Example query ranking by community post count">
  [Test this query in the Explorer →](/explore)

  ```graphql theme={null} theme={null}
  query filterTokens {
    filterTokens(
      rankings: { attribute: coinCommunityPostCount, direction: DESC }
      filters: { network: 1399811149, launchpadName: "Pump.fun" }
      limit: 10
    ) {
      results {
        token {
          name
          symbol
          address
        }
        coinCommunity {
          postCount
          memberCount
          likeCount
          lastPostAt
        }
      }
    }
  }
  ```
</Accordion>

## Advanced Filtering

Analyze tokens based on a robust set of trading metrics such as price, volume, mcap, buy/sell count, launchpad protocols, networks, exchanges, wallet age, and more.

<Accordion title="Example query to find trending launchpad (Bonk) tokens that have migrated">
  [Test this query in the Explorer →](/explore)

  ```graphql theme={null} theme={null}
  query filterTokens {
    filterTokens(
      rankings: { attribute: trendingScore5m, direction: DESC }
      filters: {
        liquidity: { gt: 10000 }
        marketCap: { gt: 100000, lte: 5000000 }
        network: 1399811149
        volume24: { gt: 10000 }
        launchpadName: "Bonk"
        launchpadCompleted: true
        buyCount1: { gt: 50 }
        sellCount1: { lt: 100 }
      }
      statsType: FILTERED
      limit: 20
    ) {
      results {
        token {
          name
          symbol
          decimals
          createdAt
          totalSupply
          socialLinks {
            twitter
          }
          address
          launchpad {
            graduationPercent
            launchpadName
            launchpadProtocol
            migrated
            migratedAt
            migratedPoolAddress
            poolAddress
          }
        }
        liquidity
        marketCap
      }
    }
  }
  ```
</Accordion>

### Boolean logic with `boolFilter`

For most filters, the flat input object is the right tool: every field you set is implicitly ANDed together. Reach for `boolFilter` when you need different filter conditions for a subsets of tokens. The most common case is per-network thresholds: a token doing 500 transactions a day on a high-activity chain is noise, but on a quieter chain it's a strong signal. Flat filters force a single threshold across all chains, while `boolFilter` lets you tune criteria per network in a single query.

`boolFilter` accepts `and`, `or`, and `not` operators, each containing another `filters` object. Operators can be nested up to 4 levels deep.

<Accordion title="Example: per-network trending screener">
  ```graphql theme={null} theme={null}
  {
    "filters": {
      "boolFilter": {
        "or": [
          {
            "boolFilter": {
              "and": {
                "network": 8453,
                "uniqueTransactions24": { "gt": 1000 },
                "boolFilter": {
                  "not": {
                    "volume1": { "gt": 100000 }
                  }
                }
              }
            }
          },
          {
            "boolFilter": {
              "and": {
                "network": 1,
                "uniqueTransactions24": { "gt": 100 },
                "boolFilter": {
                  "not": {
                    "volume1": { "gt": 1000000 }
                  }
                }
              }
            }
          }
        ]
      }
    }
  }
  ```

  This returns tokens on Base with more than 1,000 24h transactions and under $100k 1h volume, OR tokens on Ethereum with more than 100 24h transactions and under $1M 1h volume.
</Accordion>

These example queries are just a small sample of what's possible with `filterTokens`. Check out [Defined.fi](https://www.defined.fi), or [explorer.codex.io](https://explorer.codex.io), to see more filtering options:

<Frame>
  <img width="75%" style={{ margin:"0 auto",display:"block" }} src="https://mintcdn.com/codex-dfdf2708/sIg_rUgIrhUCd0wd/images/discover-filters.png?fit=max&auto=format&n=sIg_rUgIrhUCd0wd&q=85&s=16a3a85fef4deca8af1c1291d42cf3a9" alt="Discover-Filters" title="DefinedFilters" data-path="images/discover-filters.png" />
</Frame>

<Info>
  `trendingIgnored` is adjusted regularly to ensure the best results are shown for trending tokens. Set to `true` if you want results to include stablecoins, wrapped base tokens, rugs/scams/low quality tokens etc.\
  \
  `statsType` filters MEV-related events from data to ensure you receive real user activity.

  * FILTERED: Removes MEV events. Shows "organic" volume.
  * UNFILTERED: Includes everything, even MEV events

  Most consumer-facing apps want `trendingIgnored: false` and `statsType: FILTERED` for the cleanest data.
</Info>

## Global Fees Paid

Codex exposes detailed fee breakdowns and MEV analytics across token data, so you can filter and rank tokens by the cost activity they generate rather than just price or volume. Fee fields cover pool fees, base fees, priority fees, builder tips, and L1 data fees, along with derived metrics like fee-to-volume ratio that surface tokens with genuine economic activity versus wash-traded volume.

For the full breakdown of components, derived metrics, classifications, and which endpoints expose what, see the [Global Fees Paid](/concepts/global-fees-paid) concepts page. The example below ranks tokens by 1-hour total fees paid, filtered to tokens with meaningful fee activity and a minimum fee-to-volume ratio.

```graphql theme={null} theme={null}
{
  filterTokens(
    filters: {
      totalFees24: { gt: 500, lt: 1000000 }
      feeToVolumeRatio24: { gt: 0.005 }
      volume24: { gt: 50000 }
      network: [1, 1399811149, 8453, 137, 42161, 10, 56, 146]
    }
    limit: 20
    rankings: [{ attribute: totalFees1, direction: DESC }]
  ) {
    count
    results {
      token {
        symbol
        name
        networkId
        address
      }
      volume1
      totalFees1
      poolFees1
      baseFees1
      priorityFees1
      builderTips1
      l1DataFees1
      feeToVolumeRatio1
    }
  }
}
```

## Bundlers/Snipers/Insiders Data

New to filterTokens! You can now query for information on snipers, bundlers, and insiders on all newly launched tokens (since Nov 2025). This information is also included in our [launchpad subscriptions](/recipes/launchpads).

* **Bundlers:** Identified as 4 or more buys of the same token/pair in the same block. Additionally, each swap must be more than \$5 with the total bundle being greater than 0.05% of the total supply. This data helps to detect coordinated buying activity from multiple wallets.
* **Snipers:** Wallets that buy a token within 4 seconds of the first swap. Token creators are excluded. This helps identify bots and fast traders attempting to buy immediately at launch.
* **Insiders:** Definitions and methodologies for insiders for EVM and SVM networks are outlined as follows:
  * **EVM Insider Definition**

    * Recipient funded by creator — wallet's firstFundedByAddress matches token creator
    * Direct transfer from creator — transfer.from is the creator address
    * Transfer from existing insider — transfer.from is already in the insider set

    Excluded: Zero address transfers, the token creation tx itself, and any DEX transactions.
  * **SVM (Solana) Insider Definition**

    * Recipient funded by creator — same as EVM
    * Creator is tx signer or sender — if creator is in txMakers or is the from address (when NOT a DEX event)
    * Any non-swap launchpad token transfer — if it's a launchpad token and the recipient doesn't send tokens back in the same tx, assumed insider

    Excluded: Transfers flagged with involvesDexProgram, and token swap patterns.

**Label Persistence:** Wallets identified as any of the above will be labelled indefinitely once applied. For example: A wallet labeled as a "bundler" from one token keeps that label even for other tokens.\
\
**Suspicious:** A single roll-up of every wallet flagged as one or more of the above — `suspiciousCount` and `suspiciousHeldPercentage`. Because a wallet can be flagged as a sniper, bundler, and/or insider at once, these are the deduplicated union of those cohorts rather than a simple sum of the three counts. Use them when you want one overall risk number for a token instead of checking each cohort separately.\
\
**Data Fields:** ` sniperCount`, `bundlerCount`, `insiderCount`, `suspiciousCount`, `devHeldPercentage`, `sniperHeldPercentage`, `bundlerHeldPercentage`, `insiderHeldPercentage`, `suspiciousHeldPercentage`.\
\
You can also filter by these data types with `gt` `lt` `gte` `lte`.

<AccordionGroup>
  <Accordion title="Example query for this data using filterTokens">
    [Test this query in the Explorer →](/explore)

    ```graphql theme={null} theme={null}
    query {
      filterTokens(
        filters: { launchpadName: "Pump.fun" }
        rankings: { direction: DESC, attribute: createdAt }
      ) {
        results {
          token {
            name
            address
            symbol
          }
          sniperCount
          bundlerCount
          insiderCount
          suspiciousCount
          devHeldPercentage
          sniperHeldPercentage
          bundlerHeldPercentage
          insiderHeldPercentage
          suspiciousHeldPercentage
        }
      }
    }
    ```
  </Accordion>
</AccordionGroup>

<Note>
  Different platforms use varying definitions and methodologies for identifying this type of data, with some assigning labels that persist too broadly. For this reason, you can expect that there will be data discrepancies between our data and other platforms. Codex's approach focuses on accuracy over catching every single edge case. We will continue to adjust our labelling thresholds as necessary to ensure the most accurate and reliable identification of this data.
</Note>

**With our robust set of filtering options**, you can design queries for almost any use-case, or combine them as needed:

* **Multi-Network discovery:** Search across multiple networks simultaneously
* **Time-based analysis:** Filter by creation date, recent activity, or specific timestamps
* **Exchange-Specific:** Focus on tokens from specific exchanges or launchpad protocols
* **Behavioral Filtering:** Use wallet age and trading pattern metrics to assess token quality
* **Risk Management:** Combine scam detection with low liquidity, volume, and our new bundlers/snipers/insiders data filters

Check out related endpoints in their respective API reference pages:

* [filterTokens](/api-reference/queries/filtertokens)
* [filterPairs](/api-reference/queries/filterpairs)
* [getTokenPrices](/api-reference/queries/gettokenprices)
* [getDetailedPairStats](/api-reference/queries/getdetailedpairstats)
* [holders](/api-reference/queries/holders)
