RPC Providers
Choose between managed RPC providers (Helius, Triton, QuickNode) and self-hosted Agave validators based on traffic, features, and operational cost.
Recipe
Quick-reference recipe card - copy-paste ready.
import { createSolanaRpc } from "@solana/kit";
// Provider (API key in URL or header per vendor)
const rpc = createSolanaRpc(
"https://mainnet.helius-rpc.com/?api-key=YOUR_KEY"
);
await rpc.getSlot().send();# Self-hosted (operator)
agave-validator --ledger /data/ledger --rpc-port 8899When to reach for this:
- Mainnet or devnet apps exceeding public RPC rate limits.
- Needing DAS, webhooks, or priority fee estimate APIs.
- Running indexers requiring dedicated stake and bandwidth.
- Compliance requirements for private RPC ingress.
Working Example
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const HTTP = process.env.RPC_HTTP_URL!;
const WSS = process.env.RPC_WSS_URL!;
const rpc = createSolanaRpc(HTTP);
const rpcSubscriptions = createSolanaRpcSubscriptions(WSS);
const slot = await rpc.getSlot().send();
console.log("slot:", slot);
// Health check script for CI
if (slot < 1) throw new Error("RPC unhealthy");What this demonstrates:
- Separate HTTP and WSS URLs from provider dashboard.
- Environment variables keep API keys out of source control.
- Simple
getSlotprobe validates endpoint health.
Deep Dive
How It Works
- Managed providers run Agave validators plus load balancers, caching, and indexer sidecars.
- API keys authenticate and meter requests per plan tier.
- Self-hosting runs
agave-validatorwith your own stake, ops, and failover. - Feature matrix (DAS, gRPC, webhooks) varies by vendor - not commodity RPC.
Provider Comparison (high level)
| Option | Strengths | Trade-offs |
|---|---|---|
| Helius | DAS, webhooks, dev tooling | Vendor coupling for advanced APIs |
| Triton | Yellowstone gRPC, performance | Ops integration complexity |
| QuickNode | Multi-chain familiarity | Solana-specific feature depth varies |
| Public RPC | Free, zero setup | Rate limits, no SLA |
| Self-host | Control, privacy | Staffing, stake, reliability burden |
TypeScript Notes
// Failover: try secondary URL on 429/503
async function rpcWithFallback<T>(fn: (rpc: ReturnType<typeof createSolanaRpc>) => Promise<T>) {
const primary = createSolanaRpc(process.env.RPC_PRIMARY!);
try {
return await fn(primary);
} catch (e) {
const secondary = createSolanaRpc(process.env.RPC_SECONDARY!);
return await fn(secondary);
}
}Gotchas
- Embedding API keys in frontend - keys get scraped from browsers. Fix: proxy reads through your backend for sensitive keys.
- Single provider dependency - outage stops your app. Fix: secondary URL failover and cached critical reads.
- Using free tier for production mint - 429 during spike. Fix: paid plan sized to peak RPS.
- Mismatched HTTP/WSS hosts - subscriptions fail silently. Fix: copy paired endpoints from dashboard.
- Self-host without monitoring - disk full on ledger stops RPC. Fix: ledger alerts and redundant nodes.
Alternatives
| Alternative | Use When | Don't Use When |
|---|---|---|
| Public devnet RPC | Prototypes | Production mainnet |
| Colocated validator + provider hybrid | Trading firms | Simple NFT mint site |
| IPFS-only metadata | Static assets | RPC needs |
| Light client (future/experimental) | Extreme decentralization | Current production default |
FAQs
Do I need a provider for devnet?
Public devnet works early; provider improves reliability for team CI and demos.
How do I pick plan size?
Estimate peak RPS from MAU, GPA weight, and websocket connections - load test before launch.
Can one key serve HTTP and WSS?
Usually same API key on paired URLs - verify vendor docs.
Is self-host cheaper at scale?
Sometimes at very high sustained RPS if you already operate staking ops - include engineer and hardware cost.
What is Yellowstone?
gRPC Geyser interface - Triton and others expose for indexers (Yellowstone gRPC).
Should CI use production RPC key?
Use restricted devnet key with low rate cap - never commit mainnet keys to public repos.
How do providers relate to Agave 4.1.1?
Providers run validator versions on their rollout schedule - occasional method/version skew - monitor status pages.
Can I use multiple providers?
Yes - primary/secondary failover or split reads vs writes if vendor supports.
Do providers cache getAccountInfo?
Some do briefly - do not rely on cache for post-transaction reads without refresh.
What about geographic latency?
Choose region closest to users and servers; test getSlot RTT from deployment region.
Related
- RPC Basics - JSON-RPC fundamentals
- WebSocket Subscriptions - WSS endpoints
- The DAS API - provider DAS features
- RPC Best Practices - resilient client patterns
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.