Run a token search with advanced, pulse-v2-style filtering. The POST body mirrors a single pulse view — top-level chainId/poolTypes/sortBy/limit, with filters reserved for a Prisma-like AND/OR/NOT tree.
POST /api/2/fast-search accepts the same payload shape as a single pulse v2 view, plus one extra field — input — that carries the search term. Any filters block you can send to POST /api/2/pulse is a valid filters block here.
Use POST when you need:
gte, lte, in, notIn, contains, startsWith, endsWith, mode: "insensitive").inputtokenName / tokenSymbol / asset_name / asset_symbol, or exact address match if the value is a valid address > 26 chars. Wrap in double quotes for Google-style exact-symbol match (e.g. "W" matches only tokens with symbol “W”).
chainId (optional)view.chainId. Translated to chainId: { in: [...] } and ANDed with filters. When you need per-chain conditional logic (e.g. different constraints per chain), skip this field and express the chain constraint inside filters using OR.
poolTypes (optional)view.poolTypes. Translated to source: { in: [...] }.
sortBy / sortOrdervolume24h, feesPaid24h, …) and snake_case (volume_24h, fees_paid_24h, …) — same list as the GET variant. Default volume_24h desc.
sortBy: "searchScore" is GET-only (derived ranking that isn’t part of the Prisma model). On POST it falls back to volume_24h. Use GET when you need searchScore ranking.filterswhere tree — identical syntax to pulse view.filters. Supported operators:
AND, OR, NOTequals, not, gte, gt, lte, lt, in, notIncontains, startsWith, endsWith, with mode: "insensitive"TokensStatsRealTime, same as pulse — chainId, tokenName, tokenSymbol, volume_24h, volume_1h, fees_paid_24h, fees_to_volume_ratio_24h, totalFeesPaidUSD, holders_count, bonded, bonded_at, shadow_ban, bundlers_holdings_percentage, dev_holdings_percentage, source, factory, deployer, market_cap, created_at, trending_score_24h, etc.
chainId is the simplest way to restrict to a few chains — same shorthand as pulse view.chainId.
chainId is expressed inside the tree, the constraint applies per OR branch — exactly what the top-level chainId shorthand cannot do.
filters block pasted under a pulse view’s filters field works identically — fast-search POST and pulse POST share the same filter surface.
AND/OR/NOT logic.searchScore-independent Prisma orderBy (all other sort fields work).searchScore ranking (the composite fees_paid_24h × largest_pool_reserve_usd rank).filters query string.Search query string
Chain ID(s) to filter — same shorthand as pulse view.chainId
Pool type(s) to filter — same shorthand as pulse view.poolTypes
Prisma-like where tree (AND/OR/NOT + leaf operators equals, not, gte, gt, lte, lt, in, notIn, contains, startsWith, endsWith). Same surface as view.filters on POST /2/pulse.
Sort field for search results (default: volume24h; searchScore falls back to volume_24h on POST)
volume24h, marketCap, createdAt, volume1h, feesPaid5min, feesPaid1h, feesPaid24h, volume5min, holdersCount, organicVolume1h, totalFeesPaidUsd, searchScore, trendingScore24h Sort order (default: desc)
asc, desc Maximum number of results (1-20, default: 5)
Offset for pagination (default: 0)
Universal Search response