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.