WebSocket Subscriptions
Subscribe to account changes, transaction logs, and signature confirmation over Solana WebSocket JSON-RPC.
Recipe
Quick-reference recipe card - copy-paste ready.
import { createSolanaRpcSubscriptions, address } from "@solana/kit";
const rpcSubscriptions = createSolanaRpcSubscriptions(
"wss://api.devnet.solana.com"
);
const abort = new AbortController();
const accountNotifications = await rpcSubscriptions
.accountNotifications(address("YOUR_ACCOUNT"), { commitment: "confirmed" })
.subscribe({ abortSignal: abort.signal });
for await (const notification of accountNotifications) {
console.log(notification.value.lamports);
}When to reach for this:
- Live wallet balance updates without polling.
- Waiting for transaction confirmation in UI.
- Streaming program logs for a specific mention filter.
- Building reactive dashboards.
Working Example
import {
createSolanaRpcSubscriptions,
address,
} from "@solana/kit";
const rpcSubscriptions = createSolanaRpcSubscriptions(
"wss://api.devnet.solana.com"
);
async function watchSignature(signature: string) {
const abort = new AbortController();
const sigNotifications = await rpcSubscriptions
.signatureNotifications(signature, { commitment: "confirmed" })
.subscribe({ abortSignal: abort.signal });
for await (const n of sigNotifications) {
if (n.value.err) {
console.error("failed", n.value.err);
} else {
console.log("confirmed");
}
abort.abort();
break;
}
}
watchSignature("YOUR_TX_SIGNATURE");What this demonstrates:
signatureNotificationsresolves when transaction reaches commitment.accountNotificationspushes new account state on writes.AbortControllercleans up subscriptions on unmount.
Deep Dive
How It Works
- Client opens WebSocket, sends
*SubscribeJSON-RPC method, receives push*Notificationmessages. - Each subscription has an id for
*Unsubscribe. - Commitment on subscription controls notification timing.
- Provider WSS endpoints may require API key query params.
Subscription Types
| Method | Fires when |
|---|---|
accountSubscribe | Account lamports/data change |
logsSubscribe | Transaction mentions program/account |
signatureSubscribe | Transaction reaches commitment |
slotSubscribe | New slot processed |
TypeScript Notes
// Logs subscription with mentions filter (provider support varies)
// Use rpcSubscriptions.logsNotifications({ mentions: [programId] })Gotchas
- HTTP URL on WebSocket client - connection fails. Fix: use
wss://endpoint from provider docs. - Subscription leaks - open tabs accumulate server load. Fix: abort on component unmount and route change.
- processed notifications rollback - UI shows success then reverts. Fix: subscribe at
confirmedorfinalized. - Public WSS rate limits - connections dropped under load. Fix: provider tier with higher subscription caps.
- Assuming ordering across accounts - notifications are per subscription. Fix: design idempotent UI merges.
Alternatives
| Alternative | Use When | Don't Use When |
|---|---|---|
| HTTP polling | Rare updates, serverless | Sub-second UI reactivity |
| Yellowstone gRPC | Indexer throughput | Simple wallet app |
| Webhooks (Helius) | Server-side ingestion | Pure browser client |
solana logs CLI | Developer debugging | Production user features |
FAQs
What WSS URL for devnet?
Often wss://api.devnet.solana.com - confirm with your provider; may differ from HTTPS host.
How many subscriptions per connection?
Provider-specific - batch related accounts or use server-side indexer for hundreds.
Does kit 7.0.0 support log subscriptions?
Use createSolanaRpcSubscriptions log notification APIs - see kit docs for exact method names on your version pin.
Can I subscribe on localnet?
Yes - ws://127.0.0.1:8900 or provider-documented local WS port while test-validator runs.
How do I unsubscribe?
Abort the async iterator or call unsubscribe RPC with subscription id from kit internals.
Why duplicate notifications?
Account may change multiple times per slot - dedupe by slot or lamports equality in UI.
signatureSubscribe vs polling getSignatureStatuses?
Subscribe is lower latency and less RPC load than tight polling loops.
Do subscriptions work in serverless?
Poor fit - connections are long-lived; use webhooks or polling on serverless.
How do logsSubscribe mentions work?
Filter to transactions referencing a program or account pubkey - reduces noise.
What about slotSubscribe?
Useful for slot-driven UI clocks and coordinating reads at slot boundaries.
Related
- RPC Basics - HTTP vs WS
- Logs & Debugging - CLI log stream
- Webhooks - server-side events
- RPC Providers - WSS endpoints
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.