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

# Suscripciones WebSocket de Solana RPC

> Recibe cambios de cuentas de Solana, gestiona los ID de suscripción, cancela suscripciones y recupera el estado tras una desconexión.

Las suscripciones WebSocket entregan cambios posteriores a la conexión. Consulta una instantánea por HTTP si también necesitas el estado actual: una suscripción no es una consulta del historial.

## Conecta y suscríbete

Usa Node.js 20 o posterior. Instala `ws`, configura una clave RPC y elige una cuenta con actividad frecuente:

```bash theme={null}
npm install ws
export SOLANA_RPC_API_KEY="YOUR_API_KEY"
export ACCOUNT_ADDRESS="ACCOUNT_PUBLIC_KEY"
```

Guarda el ejemplo como `accounts.mjs`, ejecuta `node accounts.mjs` y pulsa Ctrl+C para detenerlo. Si ya existe un ID de suscripción, el ejemplo cancela la suscripción antes de cerrar.

```javascript accounts.mjs theme={null}
import WebSocket from "ws";

const apiKey = process.env.SOLANA_RPC_API_KEY;
const account = process.env.ACCOUNT_ADDRESS;
if (!apiKey || !account) {
  throw new Error("Set SOLANA_RPC_API_KEY and ACCOUNT_ADDRESS");
}
const endpoint = new URL("wss://rpc-mainnet.solanatracker.io/");
endpoint.searchParams.set("api_key", apiKey);
const socket = new WebSocket(endpoint);
let subscriptionId;
let stopping = false;
let closeTimer;

function unsubscribe() {
  socket.send(JSON.stringify({
    jsonrpc: "2.0", id: 2,
    method: "accountUnsubscribe", params: [subscriptionId],
  }));
}

socket.on("open", () => {
  socket.send(JSON.stringify({
    jsonrpc: "2.0", id: 1, method: "accountSubscribe",
    params: [account, { encoding: "base64", commitment: "confirmed" }],
  }));
});

socket.on("message", raw => {
  let message;
  try { message = JSON.parse(raw.toString()); }
  catch { console.error("Invalid JSON received"); return; }
  if (message.error) {
    console.error("RPC error", message.error);
    socket.close();
    return;
  }
  if (message.id === 1) {
    subscriptionId = message.result;
    console.log("Subscribed", subscriptionId);
    if (stopping) unsubscribe();
  } else if (message.id === 2) {
    console.log("Unsubscribed", message.result);
    socket.close();
  } else if (message.method === "accountNotification" &&
             message.params.subscription === subscriptionId) {
    const { context, value } = message.params.result;
    console.log({ slot: context.slot, lamports: value.lamports });
  }
});

socket.on("error", error => console.error("WebSocket error", error.message));
socket.on("close", () => {
  clearTimeout(closeTimer);
  console.log("Connection closed");
});
process.once("SIGINT", () => {
  stopping = true;
  closeTimer = setTimeout(() => socket.terminate(), 3_000);
  if (socket.readyState === WebSocket.OPEN && subscriptionId !== undefined) {
    unsubscribe();
  } else if (socket.readyState !== WebSocket.OPEN) {
    socket.terminate();
  }
});
```

La respuesta de suscripción confirma que se ha creado, no que la cuenta haya cambiado. Las notificaciones llegan cuando la cuenta cambia en el nivel de confirmación solicitado.

## ID de petición e ID de suscripción

El `id` que envías identifica la petición y su respuesta. El servidor devuelve otro ID, el de suscripción, en `result`. Las notificaciones lo incluyen en `params.subscription`. Pásalo al método de cancelación correspondiente en la misma conexión.

## Elige una suscripción

* [accountSubscribe](/es/solana-rpc/websockets/accountsubscribe): cambios en los lamports o datos de una cuenta.
* [programSubscribe](/es/solana-rpc/websockets/programsubscribe): escrituras en cuentas de un programa.
* [logsSubscribe](/es/solana-rpc/websockets/logssubscribe): logs de transacciones que cumplen el filtro.
* [signatureSubscribe](/es/solana-rpc/websockets/signaturesubscribe): una firma alcanza el nivel solicitado; la suscripción termina después de la notificación final.
* [slotSubscribe](/es/solana-rpc/websockets/slotsubscribe): actualizaciones de slots procesados.

Consulta la [referencia WebSocket de Solana](https://solana.com/docs/rpc/websocket) para la semántica estándar. Shredstream entrega transacciones antes de que estén disponibles los metadatos de ejecución. Trátalas como provisionales y confirma el resultado mediante RPC.

## Recupera el estado tras una desconexión

Reconecta con espera incremental, variación aleatoria y un límite de intentos. Después, vuelve a enviar las peticiones de suscripción. Los ID de la conexión anterior no se pueden reutilizar. Consulta el estado actual por HTTP y concílialo con las notificaciones almacenadas usando los slots de contexto. Si necesitas todos los eventos, recupera el historial de transacciones por separado; reconectar no reproduce las actualizaciones perdidas.

Limita la cola de procesamiento y vigila su tamaño. Si el consumidor se retrasa, reduce el alcance de la suscripción o mueve la decodificación costosa fuera del callback. Comprueba los [límites de conexiones](/es/solana-rpc/credits-and-rate-limits) de tu plan.


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