This runbook defines the public RPC endpoints Sigil mainnet and the Evolve canary expose, the rate limits each carries, and the censorship-resistance posture for the direct endpoints.

Endpoint matrix

HostnamePathNetworkProfileMiddleboxDefault rate limitTLS
rpc.sigil.ml/rpc, /health, /metrics, /wsmainnetpublicCloudflare25 req/s sustained, 100 burst per IPCloudflare-managed
rpc-direct.sigil.ml/rpc, /health, /wsmainnetpublicnone10 req/s sustained, 25 burst per IPLet’s Encrypt via cert-manager
canary-rpc.sigil.ml/rpc, /health, /metrics, /wscanarypublicCloudflare25 req/s sustained, 100 burst per IPCloudflare-managed
canary-rpc-direct.sigil.ml/rpc, /health, /wscanarypublicnone10 req/s sustained, 25 burst per IPLet’s Encrypt

Why two endpoints

A single Cloudflare-fronted public RPC is operationally clean but reduces censorship resistance: Cloudflare can geofence, log, or reject any user’s traffic, which reproduces the single-CDN concentration that Solana’s api.mainnet-beta.solana.com is critiqued for. The dual-endpoint design is the compromise:
  • rpc.sigil.ml — default for browser users. Full WAF, full DDoS shield, generous rate limit. Optimised for “it just works”.
  • rpc-direct.sigil.ml — the no-middlebox escape hatch. Lower rate limit, full IP exposure to the validator-cluster ingress. Documented trade-off.
Both endpoints serve the same canonical method table. Both are scrape-monitored. Both publish state to status.sigil.ml.

Rate limits

Per-IP token bucket. Defaults benchmarked against:
ProviderFree-tier rate
Alchemy25 req/s
Infura~10 req/s
QuickNode25 req/s
Solana api.mainnet-beta.solana.com~4 req/s/IP

Public profile defaults

SIGIL_RPC_RATE_LIMIT_RPS=25
SIGIL_RPC_RATE_LIMIT_BURST=100

Direct profile defaults

SIGIL_RPC_RATE_LIMIT_RPS=10
SIGIL_RPC_RATE_LIMIT_BURST=25
Premium tiers with JWT-authenticated higher limits are available; see authentication.

Method profile

Public RPC profiles only expose the method table in node/sigil-rpc/src/profiles.rs::PUBLIC. Validator-internal methods (peer management, block production, log inspection) return MethodNotFound on the public endpoints. The conformance test node/sigil-node/tests/rpc_conformance.rs asserts that every method in the public profile resolves under the public profile and that validator-internal methods reject from it.

Operational checks

# Mainnet height (Cloudflare-fronted).
curl -s https://rpc.sigil.ml/rpc \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"sigil_height","params":{}}'

# Mainnet height (direct).
curl -s https://rpc-direct.sigil.ml/rpc \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"sigil_height","params":{}}'
The two responses should match within one block.

When to escalate

SymptomAction
Rate-limit 429s spike on the public endpointVerify Cloudflare rate-limit dashboard; raise the per-IP limit if legitimate; add ASN challenge if abusive.
Direct endpoint reachability dropsCheck ingress-nginx and the LB host; verify DNS is grey-cloud (not orange).
Method dispatch returns MethodNotFound for canonical methodsRe-deploy the RPC pods; verify profile flag matches public not validator.
5xx from /rpcPod log inspection; check AkashaKV health on the backing nodes.

See also