Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.solanatracker.io/llms.txt

Use this file to discover all available pages before exploring further.

The Datastream WebSocket provides real-time safety signals. Use it to watch sniper activity, bundled transactions, insider movements, developer sell-offs, and holder concentration changes as they happen.
URL: wss://datastream.solanatracker.io/{apiKey}
Available on Premium, Business, and Enterprise plans.

Sniper Tracking

Subscribe to sniper:{tokenAddress} to get notified when a sniper wallet’s balance changes — buys, sells, or partial exits.
const token = "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

ws.onopen = () => {
  ws.send(JSON.stringify({ type: "join", room: `sniper:${token}` }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const d = msg.data;
  const direction = d.percentage > d.previousPercentage ? "INCREASED" : "DECREASED";
  console.log(`Sniper ${d.wallet} ${direction}`);
  console.log(`  Balance: ${d.tokenAmount} (${d.percentage}%)`);
  console.log(`  Previous: ${d.previousAmount} (${d.previousPercentage}%)`);
  console.log(`  Total sniper hold: ${d.totalSniperPercentage}%`);
  console.log(`  Total insider hold: ${d.totalInsiderPercentage}%`);
};
Payload:
{
  "wallet": "WalletAddress",
  "amount": "1000000000",
  "tokenAmount": 1000000,
  "percentage": 0.15,
  "previousAmount": 500000,
  "previousPercentage": 0.075,
  "totalSniperPercentage": 5.25,
  "totalInsiderPercentage": 12.5
}

Bundler Tracking

Subscribe to bundlers:{tokenAddress} to track wallets involved in bundled transactions. This often means wallets moved together on purpose.
ws.send(JSON.stringify({ type: "join", room: `bundlers:${token}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const d = msg.data;
  const action = d.tokenAmount > d.previousAmount ? "BOUGHT" : "SOLD";
  console.log(`Bundler ${d.wallet} ${action}`);
  console.log(`  Holdings: ${d.tokenAmount} (${d.percentage}%)`);
  console.log(`  Total bundler hold: ${d.totalBundlerPercentage}%`);
};
Payload:
{
  "wallet": "4ZwYf8okEL7vgyBDZEcas2mcpDAVujsgtthxRHCMDqyP",
  "amount": "7965607901843",
  "tokenAmount": 7965607.901843,
  "percentage": 0.79656,
  "previousAmount": 8997866.309773,
  "previousPercentage": 0.89979,
  "boughtAmount": 0,
  "boughtPercentage": 0,
  "totalBundlerPercentage": 22.83809
}
A totalBundlerPercentage above 20% is a strong red flag — it means a large portion of the supply is held by bundled wallets.

Insider Tracking

Subscribe to insider:{tokenAddress} to watch insider wallet movements. Insiders are wallets identified as having privileged access to the token, such as deployer-connected wallets or early coordinated buyers.
ws.send(JSON.stringify({ type: "join", room: `insider:${token}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const d = msg.data;
  console.log(`Insider ${d.wallet}: ${d.percentage}% (was ${d.previousPercentage}%)`);
  console.log(`  Total insider hold: ${d.totalInsiderPercentage}%`);
};

Developer Holdings

Subscribe to dev_holding:{tokenAddress} to track the token creator’s holdings in real time. A creator selling a large share can be one of the strongest risk signals.
ws.send(JSON.stringify({ type: "join", room: `dev_holding:${token}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const d = msg.data;
  const change = d.percentage - d.previousPercentage;
  const emoji = change < 0 ? "SOLD" : "ADDED";
  console.log(`Dev ${d.creator} ${emoji}: ${d.percentage}% (was ${d.previousPercentage}%)`);
};
Payload:
{
  "token": "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
  "creator": "4Rz5xqikxtZ2s7wE9uQ6n2oLXQi6K65XGoYpKxf24Hqo",
  "amount": "150000000000",
  "percentage": 15.0,
  "previousPercentage": 20.0,
  "timestamp": 1739318753652
}

Holder Changes

Holder Count

Subscribe to holders:{tokenAddress} for real-time holder count updates:
ws.send(JSON.stringify({ type: "join", room: `holders:${token}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "message") {
    console.log(`Holders: ${msg.data.total}`);
  }
};

Top 10 Holders

Subscribe to top10:{tokenAddress} to track concentration among the top 10 wallets:
ws.send(JSON.stringify({ type: "join", room: `top10:${token}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const totalPct = msg.data.holders.reduce((sum, h) => sum + h.percentage, 0);
  console.log(`Top 10 hold ${totalPct.toFixed(1)}% of supply`);
  msg.data.holders.forEach((h, i) => {
    console.log(`  #${i + 1} ${h.address}: ${h.percentage}%`);
  });
};

Wallet Monitoring

Wallet Transactions

Subscribe to wallet:{walletAddress} to see every swap a wallet makes in real time:
const wallet = "FV1r15rbNKkJanXLheoJA7fXEq6NDuMJ3bukXuhJWyV1";

ws.send(JSON.stringify({ type: "join", room: `wallet:${wallet}` }));

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const t = msg.data;
  const fromToken = t.from?.token?.symbol;
  const toToken = t.to?.token?.symbol;
  console.log(`${fromToken}${toToken}: $${t.volume?.usd?.toFixed(2)}`);
};

Wallet Balance Changes

Subscribe to wallet:{walletAddress}:balance for overall balance changes:
ws.send(JSON.stringify({ type: "join", room: `wallet:${wallet}:balance` }));

Specific Token Balance

Subscribe to wallet:{walletAddress}:{tokenAddress}:balance to watch a single token balance:
ws.send(JSON.stringify({
  type: "join",
  room: `wallet:${wallet}:${token}:balance`
}));

Fee Tracking

Subscribe to fees:{tokenAddress} to track platform and network fees on a token:
ws.send(JSON.stringify({ type: "join", room: `fees:${token}` }));

Example: Token Safety Monitor

Combine multiple safety streams to build a real-time risk dashboard:
const token = "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

const alerts = [];

ws.onopen = () => {
  // Subscribe to all safety signals
  ws.send(JSON.stringify({ type: "join", room: `sniper:${token}` }));
  ws.send(JSON.stringify({ type: "join", room: `bundlers:${token}` }));
  ws.send(JSON.stringify({ type: "join", room: `insider:${token}` }));
  ws.send(JSON.stringify({ type: "join", room: `dev_holding:${token}` }));
  ws.send(JSON.stringify({ type: "join", room: `top10:${token}` }));
  ws.send(JSON.stringify({ type: "join", room: `holders:${token}` }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type !== "message") return;

  const room = msg.room;
  const d = msg.data;

  if (room.startsWith("sniper:") && d.percentage < d.previousPercentage) {
    alerts.push(`Sniper selling: ${d.wallet} (${d.previousPercentage}% → ${d.percentage}%)`);
  }

  if (room.startsWith("bundlers:") && d.totalBundlerPercentage > 20) {
    alerts.push(`High bundler concentration: ${d.totalBundlerPercentage}%`);
  }

  if (room.startsWith("dev_holding:") && d.percentage < d.previousPercentage) {
    alerts.push(`Dev selling: ${d.percentage}% (was ${d.previousPercentage}%)`);
  }

  if (room.startsWith("top10:")) {
    const totalPct = d.holders.reduce((sum, h) => sum + h.percentage, 0);
    if (totalPct > 50) {
      alerts.push(`Top 10 hold ${totalPct.toFixed(1)}% — high concentration`);
    }
  }

  if (alerts.length > 0) {
    console.log(`[ALERT] ${alerts[alerts.length - 1]}`);
  }
};

Room Reference

RoomWhat you get
sniper:{token}Sniper wallet balance changes
bundlers:{token}Bundler wallet activity
insider:{token}Insider wallet movements
dev_holding:{token}Developer/creator holdings
holders:{token}Total holder count
top10:{token}Top 10 holder percentages
wallet:{wallet}All swaps for a wallet
wallet:{wallet}:balanceWallet balance changes
wallet:{wallet}:{token}:balanceSpecific token balance
fees:{token}Fee tracking

Sniper Detection (REST)

REST endpoints for first buyers, bundlers, and chart-based detection.

Live Prices & Charts

Stream real-time prices and build live charts.