Why this matters
When you build code that interpolates user input into API paths, the smallest case mismatch returns a 404 with no helpful explanation. The fix is one line, but you have to know about it. This page documents which identifiers are case-sensitive, what the canonical form looks like, and what happens at the wire level if you get it wrong.Network IDs
Canonical form: lowercase, underscore-separated. Examples:ethereum, solana, base, arbitrum, bsc, polygon, optimism.
What the REST API does with non-canonical input:
ETH returns 404. Ethereum, eth, Solana all return 404. Network IDs are strict lowercase canonical at the REST layer.
What the MCP layer does with non-canonical input:
The DexPaprika MCP normalizes common synonyms (eth → ethereum, sol → solana, arb → arbitrum, etc.) before calling the REST API. If you are calling the API through the MCP, mixed case and common abbreviations work. If you are calling REST directly, you need to canonicalize yourself.
Recommended pattern: always call GET /networks once at startup and cache the id values. Treat any user-supplied network name as untrusted and map it through your cached list before constructing the URL.
Token and pool addresses
EVM chains (Ethereum, BSC, Base, Arbitrum, Polygon, Optimism, Avalanche, and similar): lowercase hex,0x prefix, 40 hex characters.
DEX identifiers
Canonical form: lowercase, underscore-separated.GET /networks/{network}/dexes and passed to the dex_name filter on GET /networks/{network}/pools/search. The old GET /networks/{network}/dexes/{dex}/pools path took the id as a path segment; it was removed and returns 410 Gone.
dex_name is the one identifier that is not case-strict. It resolves the id case-insensitively, so dex_name=curve, dex_name=Curve and dex_name=CURVE all return the same rows. It resolves only the id. The DEX list returns dex_id and dex_name on every row, and despite the matching parameter name it is dex_id you pass. Feeding it the dex_name field, a display name like Uniswap V3, returns HTTP 200 with an empty results array rather than an error. The dex_id form is also what the removed path segment held, so it is the value already sitting in most existing code.
One catch: some commit messages and changelog entries refer to DEXes by their on-chain name (e.g., “CronosV3”), but the public API slug is different (e.g., vvs_v3 on Cronos). Always use the slug returned by the API, never the marketing name.