Skip to main content
API

RPC

One read-only JSON-RPC URL for Bittensor — health-aware load balancing, failover, and abuse controls. Plus the pool roster, endpoint catalog, and proxy usage analytics. No API key.

Proxy

POST a single JSON-RPC object to /rpc/v1/{network}. Supported networks: finney (mainnet) and test (testnet). WebSocket upgrade is not available on this HTTP path — use wss.metagraph.sh or a public WSS endpoint.

POST
https://api.metagraph.sh/rpc/v1/{network}
  • finney https://api.metagraph.sh/rpc/v1/finney
  • test https://api.metagraph.sh/rpc/v1/test
Example
curl -s 'https://api.metagraph.sh/rpc/v1/finney' \
  -X POST -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"chain_getHeader","params":[]}'

Catalog & analytics

Static registry projections and live proxy telemetry. Live explorer UI for pools and traffic lives on Endpoints.

MethodPathSummaryNotes
POST/rpc/v1/{network}Read-only JSON-RPC reverse proxyNetwork segment is finney (mainnet) or test (testnet). Single JSON-RPC object only — no batches, no HTTP WebSocket upgrade.
GET/api/v1/rpc/poolsProxy pool roster + live eligibilityServes rpc/pools.json with probe-derived health overlaid from KV so dead upstreams show as ineligible.
GET/api/v1/rpc/endpointsBase-layer Subtensor RPC/WSS registryFilterable catalog (kind, layer, status, provider, pool_eligible, latency). Pair with the live table on /endpoints.
GET/api/v1/rpc/usageProxy usage analyticsRequest volume, latency p50/p95, failover/error/cache rates, per-endpoint and per-network distribution. ?window=7d|30d.

Live pool + usage panels: Endpoints. Machine index: For agents.

Allowlisted methods

Only safe read methods pass. Mutating and heavy prefixes are denied. State-query methods need param validation and a separate rate budget.

Safe methods
  • chain_getBlock
  • chain_getBlockHash
  • chain_getFinalizedHead
  • chain_getHeader
  • rpc_methods
  • state_getRuntimeVersion
  • system_chain
  • system_health
  • system_name
  • system_properties
  • system_version
State-query (extra budget)
  • state_getStorage
  • state_getKeysPaged
Denied prefixes
  • author_*
  • state_call*
  • sudo_*
  • payment_*
  • contracts_*

Limits

Hard caps on every proxied POST. Matching constants live in workers/config.mjs and workers/request-handlers/rpc-proxy.mjs.

LimitValueNotes
Rate limit100 / 60sPer-client IP on POST /rpc/v1/* (429 + retry-after). Shared binding policy with GraphQL.
State-query rate20 / 60sAdditional budget for state_getStorage / state_getKeysPaged — does not starve ordinary chain/system reads.
Max POST body64 KiBHTTP request body size cap for the read-only proxy.
Max state-query response256 KiBDecoded upstream body cap for state-query methods after fetch.
state_getKeysPaged page250Caller-supplied count is clamped server-side (not rejected).
Failover attempts3Per request across the health-ordered pool before surfacing upstream failure.