DevelopersSeptember 14, 2026by
EmpoorioChain Core
EmpoorioChain Core

Using the Public RPC: Endpoints, WebSocket, TLS and the Rate Limit

Two public nodes serve EmpoorioChain's testnet. They are enough for a wallet, a dashboard or a development loop, and not enough for an indexer or a load test. This post is how to use them well.

Endpoints

https://rpc.testnet.empooriochain.org      # HTTP JSON-RPC, node 1
wss://rpc.testnet.empooriochain.org        # WebSocket, node 1
https://rpc2.testnet.empooriochain.org     # HTTP JSON-RPC, node 2
wss://rpc2.testnet.empooriochain.org       # WebSocket, node 2

Both terminate TLS with their own valid certificates and proxy through nginx to the node's port 9944. There is no separate EVM endpoint: Substrate methods (chain_*, state_*, author_*, system_*) and Ethereum methods (eth_*, net_*, web3_*) are served on the same URL.

Substrate side

Polkadot.js Apps: add wss://rpc.testnet.empooriochain.org as a custom endpoint. Polkadot.js API, the Rust SDK and the Dart SDK take the same URL. Subscriptions (new heads, finalized heads, storage changes) need the WSS endpoint; one-shot queries work over HTTPS.

curl -s -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"system_health","params":[]}' \
  https://rpc.testnet.empooriochain.org

Ethereum side

MetaMask, Hardhat, viem, ethers: chain id 2026, RPC https://rpc.testnet.empooriochain.org. eth_chainId returns 0x7ea. web3_clientVersion reports empoorio-chain/v208.1/fc-rpc-2.0.0-dev. Gas price 1 gwei since runtime 220. One known quirk: eth_getCode at latest returns 0x for deployed contracts on runtime 213 (use pending, or confirm deployment by nonce and receipt).

The rate limit

The public nodes sit behind a fail2ban rpc-rate rule: roughly 10 requests per second per IP, with a one-hour ban. The symptom is connection refused — which looks exactly like the node being down. It is not down; you are banned. This catches automated agents and polling loops constantly, and it is the first thing to check before reporting an outage.

Respect it by batching JSON-RPC calls, using WebSocket subscriptions instead of polling, and caching metadata (refresh it after each runtime upgrade, not on every connect).

Metadata

state_getMetadata returns the runtime metadata. It changes in every runtime upgrade — the spec version lives inside it — so a client that caches it forever breaks at the next upgrade. Eight upgrades happened between 4 and 14 September 2026.

Custom methods

The node exposes an emp_* namespace (emp_getAiModelStatus, emp_getBlobData, emp_getDomainOwner, emp_getTrackInfo, emp_getValidatorScore, …). Signatures are not yet published; treat them as unstable until the reference exists.

When to run your own

Indexing, load testing, anything above a few requests per second, or anything you need to be up when the two public nodes are not. The operator guide gets a full node syncing in minutes: build, use the repository's chainspec.raw.json (never generate one), start without --validator. A full node needs no node key and no bond.

Uptime

The mainnet gate requires public RPC uptime above 99.5 % over 30 days. That is measured, not yet published. With two nodes in one data centre, treat the public RPC as best-effort — which, on a testnet, is what it should be.

Based on RED.json hosts, VALIDATOR_IN_30_MINUTES.md, the runtime 213 eth_getCode note and the RPC rate-limit finding.

Share this article