[Product]
Data Sources
Knovo doesn't maintain its own market or chain data. Every scan reads live from a small set of third-party APIs. This page covers what each one is used for, and what happens when a provider is unreachable or unconfigured.
Live in the current API response
Dexscreener
The primary market-data source. No API key required. lib/dexscreener.ts fetches every pair for the submitted address, falling back to a text search when no direct pair match exists, then sorts by liquidity (tiebreak: 24h volume) to pick the pair used for the rest of the scan.
- Feeds: price, liquidity, market cap/FDV, volume, price change, and buy/sell counts across the 5m/1h/6h/24h windows.
- Responses are cached for 30 seconds (Next.js fetch revalidation).
- If Dexscreener is unreachable, the scan fails with a 404 (no pair found), since market data is required for scoring.
Moralis
Holder-distribution data. Requires MORALIS_API_KEY. lib/moralis.ts calls the Solana holder endpoints for Solana tokens, or the matching EVM endpoints otherwise; results are normalized by lib/holderAnalysis.ts into a top-holder % and top-10 %.
| Chain | Dexscreener chain id | Moralis chain param |
|---|---|---|
| Ethereum | ethereum | eth |
| Base | base | base |
| BNB Chain | bsc | bsc |
| Polygon | polygon | polygon |
| Arbitrum | arbitrum | arbitrum |
| Avalanche | avax / avalanche | avalanche |
| Solana | solana | dedicated Solana endpoints |
- Responses are cached for 60 seconds.
- Any other chain, a missing API key, or a failed request results in
holderDistribution: null. The rest of the scan still completes normally, anddataAvailabilitynotes the gap.
OpenAI
Generates the plain-English risk summary. Requires OPENAI_API_KEY; model is OPENAI_MODEL or defaults to gpt-5.4-mini. lib/openai.ts sends the already-computed score, breakdown, and penalties, and instructs the model to explain the number in two short sentences without inventing or changing it.
- Missing key or a failed/empty response → Knovo falls back to a deterministic sentence:
"Knovo Score is X/100. <top risk reason>." - The model never sees or influences the score calculation itself; it only explains a result it's handed.
In the codebase, not yet wired into scoring
A few modules exist for upcoming launch-forensics and contract-safety features. They are not currently called from /api/analyze, so they don't affect today's response or score.
GeckoTerminal
lib/geckoterminal.ts can search pools by query and sort by reserve. Present as an alternate/supplementary pool-search utility, not currently invoked by the live scan pipeline.
Block explorer analysis (Etherscan v2 API)
lib/explorer.ts can pull contract creation info, deployer address, source verification status, total supply, top holders, and LP burn/lock/deployer percentages via the Etherscan v2 multichain API (ETHERSCAN_API_KEY, covering Ethereum, BNB Chain, Polygon, Arbitrum, Base, and Avalanche). This is the intended data source for the security score component described in Risk Score Methodology once it's connected.
Launch detection
lib/launchDetection.ts combines Dexscreener pair metadata with explorer contract data to classify how a token likely launched: a manual DEX launch, a bonding-curve launch, a curve-to-LP migration, a fair launch, or unknown. This is what the reserved launchIntelligence response field is intended to carry once connected.
[ Note ]
app/api/analyze/route.ts is the natural next step for launch-forensics and contract-safety scoring.