Lighthouse returns market-wide activity across rolling windows, letting a dashboard answer where activity is concentrated before drilling into individual tokens. Use it for venue and launchpad comparisons, not as a token price or trade execution feed.
Run the Node.js example
Use Node.js 24 LTS and keep the API credentials on your server. Create an empty directory, then install:
npm init -y
npm install @solana-tracker/[email protected]
npm install --save-dev tsx typescript @types/node
Save the TypeScript block as index.mts. Put ST_API_KEY in an uncommitted .env file. Streaming examples also need ST_DATASTREAM_URL, the full private WebSocket URL from your Data API dashboard. REST and streaming access depend on your plan.
node --env-file=.env --import tsx index.mts
import { Client } from '@solana-tracker/data-api';
const apiKey = process.env.ST_API_KEY;
if (!apiKey) throw new Error('Set ST_API_KEY');
const client = new Client({ apiKey });
const mint = process.env.TOKEN_MINT ?? 'So11111111111111111111111111111111111111112';
const markets = await client.getLighthouse();
const overall = markets.find((market) => market.market === 'all');
console.log('Overall 1h:', overall?.stats['1h']);
const ranked = markets.filter((market) => market.market !== 'all')
.sort((a, b) => b.stats['1h'].volume.total - a.stats['1h'].volume.total);
for (const market of ranked.slice(0, 10)) {
const stats = market.stats['1h'];
console.log(market.market, market.label, stats.volume.total, stats.volume.changePct);
}
The output is a comparison list. It is deliberately not summed into a grand total because rows can overlap through market-family rollups.
Compare equal windows
Each market contains 5m, 1h, 6h, and 24h statistics. changePct compares a window with the immediately preceding window of the same duration. A one-hour change is not a change since midnight or a price return.
Display window labels beside metrics. Switching the view from 5m to 24h must switch both the value and its comparison; keeping the old percentage produces a misleading card.
Use the all row for the overall summary
Market IDs can represent an individual venue, a family such as raydium-all, or a child launchpad. Use market as the stable key and label for display. Keep parent relationships so the UI can distinguish a family rollup from a member.
Do not add every returned row to derive total volume or total wallets. Parent/child coverage can overlap, and a wallet can be active on several markets. Use the provided all row for the indexed overall view.
Read transactions, wallets, and launches separately
More transactions can come from more wallets, more activity per wallet, or automated behavior. Compare absolute volume, active-wallet count, and transaction count before interpreting a percentage change.
Tokens created and migrations measure different lifecycle activity. Dividing migrations in a window by tokens created in that same window does not produce a cohort graduation rate: the migrated tokens may have launched earlier.
Handle quiet periods and refreshes
A zero-activity window has zero-valued metrics. When there is no previous activity, the documented change value is zero; it does not necessarily mean a meaningful flat comparison. Show absolute values and avoid dramatic growth labels from tiny baselines.
Cache the shared overview on your backend. Retain the previous successful response during refresh and show its observation time. Treat empty icons and URLs as missing presentation data, not a reason to discard the market.
From a selected market, link to a token screener. That preserves the distinction between market-level discovery and token-level research.
FAQ
Can I sum every market row?
No. Family and child rows can overlap. Use the all row for an overall summary.
Is volume change the same as price change?
No. It compares traded volume in adjacent windows.
Can I calculate graduation success from one window?
Not directly. A cohort metric must follow the same launched tokens over time.