Skip to content

Other providers

RPC Plane works with any Solana JSON-RPC endpoint. There is no provider registry and no per-provider adapter — the proxy speaks standard JSON-RPC, so an endpoint that a Solana client can talk to is an endpoint RPC Plane can route to.

Adding a provider that isn't listed

[[providers]]
name = "my-provider"
url  = "https://your-endpoint.example.com/${MY_API_KEY}"
export MY_API_KEY=your_api_key_here
rpc-plane run

name is yours to choose — it is what appears in logs, on /health, and as the provider label on every Prometheus metric. url takes the full endpoint including whatever credential scheme the provider uses, whether that is a query parameter, a path segment, or neither.

Can I use a public Solana RPC endpoint?

For development, yes. Two need no account and no key:

https://api.mainnet-beta.solana.com     # Solana Foundation
https://solana-rpc.publicnode.com       # PublicNode, operated by Allnodes

Solana Foundation

It needs no key. It is also heavily rate-limited, per the Solana cluster documentation:

Limit Value
Requests 100 per 10s per IP
Requests to a single RPC method 40 per 10s per IP (4/s — the one you hit first)
Concurrent connections 40 per IP
Connection rate 40 per 10s per IP
Data 100 MB per 30s

Solana's own documentation is unambiguous about production use: "The public RPC endpoints are not intended for production applications. Please use dedicated/private RPC servers when you launch your application, drop NFTs, etc."

If you do point RPC Plane at it, cap it so the proxy sheds load to a real provider before the public node starts refusing:

[[providers]]
name    = "public"
url     = "https://api.mainnet-beta.solana.com"
max_rps = 10

Note the per-method row above: any single method is capped at 4/s, well under the 10/s overall. If your traffic is concentrated on one call — and most traffic is — that is the real ceiling, and max_rps = 10 will not enforce it. See working around a per-method limit.

PublicNode

PublicNode, operated by Allnodes, serves Solana mainnet free with no signup. Verified answering getHealth and getSlot on mainnet 2026-09-05.

It publishes no rate limits, which is a mixed blessing: nothing documented to design against, and no commitment that today's capacity holds tomorrow. Give it a conservative max_rps and raise it only on evidence — watch rpc_plane_rate_limited_total{provider="publicnode"} and the upstream 429 rate:

[[providers]]
name    = "publicnode"
url     = "https://solana-rpc.publicnode.com"
max_rps = 10   # no published limit — a starting guess, not a documented cap

Same caveat as any public endpoint: no SLA, and no one to call. Fine as a failover leg or a development default, not as a production primary. See free-tier maxxing for running both public endpoints alongside three free tiers.

Can I use my own validator?

Yes — a self-hosted node is just another URL, including over a private network:

[[providers]]
name = "own-validator"
url  = "http://10.0.1.20:8899"

This is a common pairing: your own node as primary for the cheap, high-volume reads, and a commercial provider as failover for the calls your node can't serve — archival history, for instance, if you don't run with --enable-rpc-transaction-history. Use failover_ordered so the paid provider only takes traffic when the local node is unhealthy. See routing strategies.

What works regardless of provider

Everything in the request path is provider-agnostic:

  • Health scoring — latency, error rate, slot drift, and success rate, measured live per provider.
  • Circuit breaking — a failing provider is taken out and probed back in.
  • Routing — all four strategies work across any mix of providers.
  • max_rps — cap dispatch to match whatever rate limit your provider documents.
  • Metrics — the same Prometheus series, labelled with the name you chose.

None of it requires the provider to be one RPC Plane knows about.

Submission-only endpoints

If an endpoint only accepts writes — a transaction-landing service, say — restrict it with methods so it never receives reads it cannot answer:

[[providers]]
name    = "lander"
url     = "https://lander.example.com/${LANDER_KEY}"
methods = ["sendTransaction"]

A provider that excludes getSlot skips the health probe and is scored from live request outcomes instead. See submission-only providers.

What you don't get

The provider pricing reference tracks published per-method rates for Alchemy, Helius, dRPC, Triton One, OnFinality, Chainstack and QuickNode. A provider outside that list has no complete rate data — GetBlock, Ankr, Shyft, RPC Fast, Syndica, Blockdaemon and Uniblock were all checked and don't publish enough to cost a full workload — so it won't appear in those cost comparisons. Routing and health scoring are unaffected.