Rate Limits
Limits apply per user, per second, and depend on your plan.
Plan rate
Every request counts against your plan's global rate, the total number of requests per second across all methods. Your plan's global rate is shown on the plan card at checkout and in your dashboard. Going over it returns HTTP 429.
Some methods are also capped on their own. Every call is checked against both its own cap and your plan's global cap, and the lower one applies.
Per-method limits
Plans on the standard 200 requests/sec and 500 requests/sec tiers carry the per-method caps below. A plan with a rate of its own is limited by its global rate only. Enterprise-class plans have no per-method counters.
All other methods run at your full plan rate:
confirmTransaction, getTransactionCount, getConfirmedSignaturesForAddress2, getSignatureStatuses, getSignatureStatus, getSignatureConfirmation, getAccountInfo, getMultipleAccounts, getBalance, getMinimumBalanceForRentExemption, getStakeActivation, getStakeMinimumDelegation, getTokenAccountBalance, getTokenAccountsByDelegate, getTokenSupply, getLatestBlockhash, isBlockhashValid, getRecentBlockhash, getFeeForMessage, getRecentPrioritizationFees, getFeeCalculatorForBlockhash, getFeeRateGovernor, getFees, getBlockHeight, getConfirmedBlock, getConfirmedBlocks, getConfirmedBlocksWithLimit, getFirstAvailableBlock, minimumLedgerSlot, getSlot, getSlotLeader, getSlotLeaders, getLeaderSchedule, getMaxRetransmitSlot, getMaxShredInsertSlot, getSnapshotSlot, getHighestSnapshotSlot, getHealth, getVersion, getIdentity, getGenesisHash, getClusterNodes, getVoteAccounts, getEpochInfo, getEpochSchedule, getSupply, getInflationGovernor, getInflationRate, getRecentPerformanceSamples.
Methods with a lower cap (requests per second):
| Method | 200 req/s plan | 500 req/s plan |
|---|---|---|
sendTransaction | 50 | 200 |
The ZK-compression and indexer methods are not served on any plan.
Streams and connections
| Feature | Limit |
|---|---|
| WebSocket subscriptions | Set by your plan |
| Yellowstone gRPC streams | Set by your plan |
| Enhanced and Program Streams | Set by your plan |
| Shredstream destinations | Set by your plan |
See the plan comparison at checkout or in your dashboard for the numbers on your plan.
HTTP rate limits
The RPC endpoint returns HTTP 429 after your request rate exceeds its limit.
Retry with exponential backoff and jitter.
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function callRpc(body, attempt = 0) {
const response = await fetch("https://api.mainnet-beta.solana.com", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": process.env.NODE_API_KEY,
},
body: JSON.stringify(body),
})
if (response.status === 429 && attempt < 4) {
const delay = 250 * 2 ** attempt + Math.floor(Math.random() * 150)
await wait(delay)
return callRpc(body, attempt + 1)
}
return response.json()
}Connection limits
Close subscriptions after use. A disconnected client still needs server cleanup time.
Use one filtered Yellowstone subscription instead of many broad subscriptions where possible.
Reduce usage
- Batch independent RPC reads.
- Use
getMultipleAccountsfor grouped account reads. - Subscribe instead of polling.
- Cache epoch and cluster metadata.