Documentation Index
Fetch the complete documentation index at: https://docs.dexpaprika.com/llms.txt
Use this file to discover all available pages before exploring further.
The silent-merge problem
If you query DexPaprika for “USDC” across several chains and aggregate by symbol, you will silently merge bridge variants into native USDC. The numbers you compute will be wrong. The API will not warn you. Your dashboard will say “USDC volume: $X billion” and that number will be a quiet lie. This page explains why, and what to do instead.Why symbol is not a safe key
A token’ssymbol is metadata. There is no global registry that prevents two different smart contracts from claiming the same symbol. In practice this happens constantly with stablecoins and major tokens, because every cross-chain bridge issues its own representation under the same human-readable name.
Concrete example. Search for “USDC”:
id (address) values. One shared symbol.
If you sum volume_usd across these by symbol, you produce a number that includes Avalanche-bridged USDC on Avalanche DEXes, Solana-native USDC on Solana DEXes, and Ethereum-native USDC on Ethereum DEXes — treated as if they were one token. They are not. They are six tokens that happen to share branding.
The same trap exists for WETH, WBTC, USDT, DAI, and most other tokens that have been bridged to multiple chains.
The safe pattern: (chain, address) tuple
The only stable global identifier for a token is the combination of the chain it lives on and the contract address on that chain. Every DexPaprika response gives you both fields. Use both.
Pseudocode:
(chain, address) tuple is unique per token contract globally. There is no overlap. Lowercasing the address (for EVM chains) protects against checksum-vs-lowercase comparison bugs. See Identifiers for the case rules per chain.
When you really do want a cross-chain aggregate
Sometimes the bridge-merged number is the one you want. “How much USDC trading happens globally” is a reasonable question. Just make the merge explicit and intentional, not accidental. Pattern: maintain your own mapping of “this address on this chain is part of the same logical token as that address on the other chain.” Bridge tokens are a graph, not a set. The graph changes whenever a new chain integration ships. Sources for that mapping:- The bridge’s own canonical token list (Wormhole, Stargate, LayerZero, Across, Hop, etc.)
- A symbology service that does this work for you (CoinGecko, CoinMarketCap, our sister product CoinPaprika)
- Manual curation for the handful of tokens you actually care about
Searching across chains
When you start from a token name and don’t know the chains it lives on, useGET /search:
(chain, address) pair for any follow-up calls.
For details on what fields the search endpoint returns, see Common patterns -> Pattern 1.
Checklist
Before you ship code that aggregates token data across chains:- Confirm your join key is
(chain, address), notsymbol. - Lowercase the address for EVM chains before comparing or hashing.
- If you intentionally collapse bridge variants, document the mapping somewhere a teammate will find.
- Write a unit test with at least two USDC addresses on different chains, asserting they do not collapse unless you explicitly want them to.