Skip to content

Free-tier setup

Run RPC Plane at zero cost by spreading load across free and public endpoints. Each provider has a per-second or per-day request limit; distributing traffic means no single endpoint sees enough load to trip its rate limit.


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:

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

Why these settings

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.


Limitations

Free tier endpoints are not suitable for latency-sensitive workloads (trading bots, high-frequency reads) or high-throughput production traffic. For those use cases, pair one paid provider as primary with free endpoints as failover using failover_ordered.