> ## 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.

# Recibir cambios de holders y concentración en Solana

> Suscríbete al recuento de holders y la concentración de los diez principales, con snapshots iniciales de la Data API.

Usa `holders:{token}` para el recuento y `top10:{token}` para la concentración. Carga el estado inicial con REST y actualízalo con los eventos.

<Info>
  **URL:** `wss://datastream.solanatracker.io/{apiKey}`\
  Disponible en los planes Premium, Business y Enterprise.
</Info>

## Conteo de holders en vivo

Suscríbete a `holders:{tokenAddress}` para recibir un mensaje cada vez que cambie el número total de holders únicos.

**Casos de uso:** seguir el momentum de holders, alertar cuando los holders caigan bruscamente y mostrar un badge en vivo del conteo de holders.

```javascript theme={null}
const token = "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

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

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

  console.log(`Holders: ${msg.data.total}`);
};
```

**Payload:**

```json theme={null}
{
  "type": "message",
  "room": "holders:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
  "data": {
    "total": 14823
  }
}
```

## Concentración del top 10 de holders

Suscríbete a `top10:{tokenAddress}` para recibir actualizaciones cuando cualquiera de las 10 mayores wallets cambie su posición. Esto puede avisarte sobre salidas de ballenas o ventas de wallets del creador.

**Casos de uso:** alertar cuando la concentración del top 10 supere un umbral, seguir movimientos de wallets de ballenas individuales y monitorizar ventas de wallets del creador en tiempo real.

```javascript theme={null}
const token = "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

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

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

  const { holders } = msg.data;
  const totalConcentration = holders.reduce((sum, h) => sum + h.percentage, 0);

  console.log(`Top 10 hold ${totalConcentration.toFixed(1)}% of supply`);
  holders.forEach((h, i) => {
    console.log(`  #${i + 1} ${h.address}: ${h.percentage.toFixed(2)}%`);
  });

  // Risk warning: top 10 suddenly hold a much larger share
  if (totalConcentration > 50) {
    console.log("🚨 Top 10 concentration above 50% — high risk");
  }
};
```

**Payload:**

```json theme={null}
{
  "type": "message",
  "room": "top10:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
  "data": {
    "holders": [
      { "address": "4Rz5xqikxtZ2s7wE9uQ6n2oLXQi6K65XGoYpKxf24Hqo", "percentage": 12.5 },
      { "address": "FV1r15rbNKkJanXLheoJA7fXEq6NDuMJ3bukXuhJWyV1", "percentage": 8.3 }
    ]
  }
}
```

## Observa ambas señales juntas

Suscríbete a las dos salas en una sola conexión para obtener la foto completa — momentum del conteo de holders más riesgo de concentración:

```javascript theme={null}
const token = "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

let holderCount = 0;
let top10Pct = 0;

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

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

  const room = msg.room ?? "";

  if (room.startsWith("holders:")) {
    holderCount = msg.data.total;
    console.log(`[HOLDERS] Total: ${holderCount}`);
  }

  if (room.startsWith("top10:")) {
    top10Pct = msg.data.holders.reduce((sum, h) => sum + h.percentage, 0);
    console.log(`[TOP10] Concentration: ${top10Pct.toFixed(1)}%`);
  }
};
```

## Patrón de auto-reconexión

Las conexiones WebSocket se caen. Implementa siempre lógica de reconexión para producción:

```javascript theme={null}
function connectHolderStream(token, onHolderUpdate, onTop10Update) {
  let ws;
  let reconnectTimeout;

  function connect() {
    ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

    ws.onopen = () => {
      console.log("Connected — subscribing to holder streams");
      ws.send(JSON.stringify({ type: "join", room: `holders:${token}` }));
      ws.send(JSON.stringify({ type: "join", room: `top10:${token}` }));
    };

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

      if (msg.room?.startsWith("holders:")) onHolderUpdate(msg.data);
      if (msg.room?.startsWith("top10:"))   onTop10Update(msg.data);
    };

    ws.onclose = () => {
      console.log("Disconnected — reconnecting in 3s");
      reconnectTimeout = setTimeout(connect, 3000);
    };

    ws.onerror = (err) => {
      console.error("WebSocket error:", err);
      ws.close();
    };
  }

  connect();

  return () => {
    clearTimeout(reconnectTimeout);
    ws?.close();
  };
}

// Usage
const stopWatching = connectHolderStream(
  "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
  (data) => console.log("Holders:", data.total),
  (data) => {
    const pct = data.holders.reduce((s, h) => s + h.percentage, 0);
    if (pct > 50) console.log("🚨 Risk warning: top 10 hold", pct.toFixed(1) + "%");
  }
);
```

## Referencia de salas

| Sala | Cuándo se actualiza |
| - | - |
| `holders:{token}` | Cuando cambia el número total de holders |
| `top10:{token}` | Cuando cualquiera de las 10 wallets compra, vende o sale |

## Guías relacionadas

* [Obtén todos los holders (REST)](/es/guides/token-holders) — obtén un snapshot completo de la lista de holders
* [Streams de seguridad](/es/guides/datastream-safety) — también cubre cambios de snipers, bundlers, insiders y holdings del dev
* [Seguridad de tokens y Rugcheck](/es/guides/token-safety) — usa la API de puntuación de riesgo para una comprobación de seguridad puntual


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.