dexterm

docs › Data sources and rate limits

Data sources and rate limits

Every source the app reads, what it takes from each, the keyless limits, and what a free key adds.

dexterm must stay usable forever with no paid data and no shipped keys: Node, a terminal and your own Claude login are enough. Every data need has a keyless path on a public API and degrades honestly; a free key you make yourself only raises speed or limits or unlocks depth, it never gates a feature. Because every source meters by your IP or key, each user has their own quota and there is no shared server in the middle.

Sources#

data needkeyless sourcefree-key upgradewithout it
screener poolDexScreener + Jupiter Tokens v2Jupiter free key: 1 rps instead of 0.5fully keyless
token marketDexScreener + JupiterJupiter free key: higher ratefully keyless
candles and chartGeckoTerminalnonechart unavailable (rare)
trade tape and buy/sell flowGeckoTerminal tape; DexScreener rolling windows for 5m to 24hnonetape unavailable
mint and freeze authoritypublic Solana RPC getAccountInfo + Jupiter + GoPlusany free RPC: faster, fewer 429sJupiter and GoPlus still answer
top holdersJupiter aggregate: holder count + top-10 %any free RPC key (Helius, Alchemy, QuickNode, Ankr): the ranked top-20 list with ownerscount and concentration shown; the ranked list says "needs a free RPC key"
security checksRugCheck + GoPlusnoneone may be unavailable, the other covers
new pairsPumpPortal subscribeNewToken + subscribeMigration, Jupiter recent poll, RugCheck new_tokensHelius: per-curve bonding %rows from the poll; bonding is a create-time estimate
watchlist pricesDexScreener + Jupiter, persisted in SQLiteJupiter free key: higher ratefully keyless
fast-lane live pricepublic RPC WebSocket accountSubscribe on the pump.fun bonding curve, price computed on-chainfree Helius key: lower latency, higher limits (used first)the polled price (POLL badge)
paper quotesJupiter swap/v1/quote (quote only; no build, no execute)Jupiter free key: lower latencyfully keyless
product vettingthe token's own site, RDAP, the GitHub APInonea claim stays unverifiable
trending boardJupiter trending and organic-score lists, GeckoTerminal trending pools, DexScreener top boosts (counted against a coin), CoinGecko trending (macro)nonea failing venue degrades only itself
newspublishers' official RSS: CoinDesk, Cointelegraph, The Block, Decryptnonethe board works without it
social posts (X, Telegram)none keyless: dexterm has no X API client and does not scrapeLogin with X is on the roadmapthe live SOCIAL panel shows on-chain rows only
dev history, snipers, bundlesnone keyless (wallet history is not public without an indexer)Heliuscolumns dash + needs Helius

The ranked holder list is the one real keyless gap: getTokenLargestAccounts is throttled or blocked on every keyless endpoint we probed, and Birdeye and Solscan need keys.

Rate limits and pacing#

One token bucket per host with the documented limit as the ceiling and a safety factor of 0.7; over-budget requests queue and the column header shows ⌛ instead of blocking. Identical in-flight requests share one promise. The chart the user is waiting on takes a high-priority slot that background work (tape, prefetch, refresh) can never consume.

bucketceiling (req/min)burstreserved for the chartbasis
dexscreener300 (×0.7 = 210 used)1—docs.dexscreener.com/api/reference (OpenAPI), SPEC §3.1 S1
dexscreener-slow60 (×0.7 = 42 used)1—docs.dexscreener.com/api/reference, SPEC §3.1 S1
jupiter30 (×0.7 = 21 used)1—developers.jup.ag/docs/portal/rate-limits, SPEC §3.1 S2/S3; observed 5 per short window
geckoterminal10 (×0.7 = 7 used)21docs/geckoterminal-api/api-page.md, SPEC §3.1 S4
rugcheck10 (×0.7 = 7 used)1—undocumented; conservative guess
solana-rpc30 (×0.7 = 21 used)1—public RPC (docs: 100/10 s per IP, 40/10 s per method); conservative, no burst
pumpfun6 (×0.7 = 4 used)1—undocumented frontend API; conservative guess
helius600 (×0.7 = 420 used)5—Helius Free plan 10 rps RPC (docs/helius/pricing.md); credits metered separately
goplus30 (×0.7 = 21 used)2—undocumented keyless tier; inventory §5 starting point
coingecko10 (×0.7 = 7 used)1—CoinGecko public API keyless 10/min (INTEGRATIONS-DESIGN §4, measured 2026-10-09)
news-rss10 (×0.7 = 7 used)4—polite RSS polling (INTEGRATIONS-DESIGN §4: every 10 min, cached)

Refresh cadence, keyless: screener table 10 s (one DexScreener batch per 30 rows), token screen 10 s, watchlist 0 s, positions 10 s, new pairs push plus a 15 s Jupiter poll and a 30 s RugCheck poll, PAPER quote 5 s while editing. The fast lane adds zero HTTP requests: it is push, capped at 24 simultaneous subscriptions (the open token, your watchlist, a few fresh launches); tokens past the cap stay on the polling lane, never dropped.

Cache#

A persistent SQLite cache (node:sqlite, one table, namespaced) makes a restart or a reopen instant and cheap. The analyst's MCP server reads the same file, so a warm dossier needs no network.

entityttl
pairs (market rows)10 s
token enrichment1 min
SOL price30 s
the open candle30 s
closed candles1 h
holders1 min
audit / authorities10 min
RugCheck10 min
socials1 h
dev history24 h
feed lists15 s

The last rows shown per preset are also snapshotted so a launch paints instantly, marked cached Nm old · refreshing.

Health registry#

Every source goes through a health registry: three consecutive failures or two 429s in a minute mark it degraded for a backoff window (30 s, doubling to 10 min). A panel whose source is down shows unavailable: <reason> or needs key, the header turns ◐ degraded: <source>, and the analyst's tool list is built from the healthy sources each session. A screen with no data says why instead of hanging: connecting to the live feed…, offline — can't reach the data feed, rate-limited — backing off. Press r to retry. Nothing fabricates a number.

The Helius credit meter#

Helius Free is 1M credits a month, budgeted as 33,333 a day. Each request is charged (1 credit for standard RPC methods, 10 for DAS-class); the header shows ◐ helius credits N% from 50% of the day, and at 90%, or at the per-run cap (--max-credits, default 5000), Helius switches off for the run and the keyless sources take over. Day totals persist in the SQLite file, so a restart keeps counting.

Request budget meter#

Every request is counted per source for the session and for the day (persisted), so usage is visible with --verbose and in the header. Optional soft daily caps can bound a source.