Skip to content

Free-tier maxxing

Run RPC Plane at zero cost by stacking free and public endpoints. Each provider has a per-second or per-day request limit; spreading traffic across five of them means no single key ever sees enough load to hit its cap.


Providers

Two endpoints require no sign-up:

Provider URL Notes
Solana Foundation https://api.mainnet-beta.solana.com Public RPC operated by the Solana Foundation. Rate limited, no SLA.
Ankr https://rpc.ankr.com/solana Free public endpoint. No API key for basic access.

Three providers offer free tiers that require an account:

Provider Free tier URL format
Helius Developer plan https://mainnet.helius-rpc.com/?api-key=KEY
QuickNode Free starter endpoint https://your-endpoint.quiknode.pro/KEY
Alchemy Free compute units https://solana-mainnet.g.alchemy.com/v2/KEY

Config

[health]
interval_ms             = 2000
window_secs             = 30
circuit_open_failures   = 3    # open quickly when a key rate-limits
circuit_error_threshold = 0.4
circuit_cooldown_secs   = 2    # RPS windows reset per-second; recover fast

[routing]
strategy    = "weighted_random"  # spread load evenly across all providers
max_retries = 4                  # try all five before giving up

[[providers]]
name   = "solana-foundation"
url    = "https://api.mainnet-beta.solana.com"
weight = 1

[[providers]]
name   = "ankr"
url    = "https://rpc.ankr.com/solana"
weight = 1

[[providers]]
name   = "helius"
url    = "https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}"
weight = 1
http3  = true

[[providers]]
name   = "quicknode"
url    = "https://your-endpoint.quiknode.pro/${QUICKNODE_API_KEY}"
weight = 1

[[providers]]
name   = "alchemy"
url    = "https://solana-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
weight = 1

Save this as free-tier.toml or use the bundled example (examples/free-tier.toml):

export HELIUS_API_KEY=...
export QUICKNODE_API_KEY=...
export ALCHEMY_API_KEY=...
rpc-plane -c examples/free-tier.toml run

Why it works

weighted_random over failover_ordered

failover_ordered hammers the first provider until its circuit opens, then dumps all traffic on the second, and so on. This cycles through your quota fast. weighted_random distributes requests roughly evenly from the start so each provider stays under its limit.

circuit_cooldown_secs = 2

Free tier limits are typically enforced as requests-per-second or requests-per-minute windows that reset continuously. The default cooldown of 30 seconds leaves most of that capacity untouched. Setting it to 2 seconds lets the proxy recover and route to the temporarily-limited provider again as soon as its window resets.

max_retries = 4

With five providers, setting max_retries to N - 1 means every provider is tried before the proxy gives up and returns an error.


When to upgrade

This setup is ideal for development, side projects, and non-critical traffic. Free endpoints are rate-limited and carry no SLA, so for production workloads or anything latency-sensitive, add a paid provider as primary and keep the free stack as failover using failover_ordered.