Docs

Moonriver RPC with Dwellir

Production-ready Moonriver RPC endpoints, Substrate JSON-RPC coverage, and best practices for building on Moonriver (Kusama parachain 2023) with Dwellir.

Moonriver RPC

With Dwellir, you get access to our global Moonriver network which always routes your API requests to the nearest available location, ensuring low latency and the fastest speeds.

Get your API key

Why Build on Moonriver?

Moonriver is Moonbeam’s canary network on Kusama, delivering the same Substrate foundation and EVM compatibility with faster iteration cycles. It is ideal for deploying and testing EVM and Substrate-based functionality under real economic conditions before promoting to Moonbeam.

Fast Iteration, Real Economics

  • Rapid runtime upgrade cadence enables shipping features earlier than Moonbeam.
  • Real MOVR token economics and on-chain governance for production-like validation.
  • Shared Kusama security provides fast finality while enabling experimentation.

EVM + Substrate Interop

  • Full EVM compatibility via Frontier with MetaMask, Hardhat, and Solidity tooling.
  • Native Substrate interfaces for storage, blocks, and runtime APIs.
  • Seamless migration path to Moonbeam after validation on Moonriver.

Quick Start with Moonriver

Connect to Moonriver production endpoints with Dwellir’s global network.

Moonriver RPC Endpoints
HTTPS
WSS
curl -sS -X POST https://api-moonriver.n.dwellir.com/<API_Keys_Are_Not_Made_for_Bots> \  -H 'Content-Type: application/json' \  -d '{"jsonrpc":"2.0","method":"chain_getBlockHash","params":[0],"id":1}'
import { ApiPromise, WsProvider } from '@polkadot/api';const provider = new WsProvider('wss://api-moonriver.n.dwellir.com/<API_Keys_Are_Not_Made_for_Bots>');const api = await ApiPromise.create({ provider });const hash = await api.rpc.chain.getBlockHash(0);console.log(hash.toHex());
from substrateinterface import SubstrateInterfacesubstrate = SubstrateInterface(url='wss://api-moonriver.n.dwellir.com/<API_Keys_Are_Not_Made_for_Bots>')block_hash = substrate.get_block_hash(block_id=0)print(block_hash)
package mainimport (  "bytes"  "fmt"  "io"  "net/http")func main() {  url := "https://api-moonriver.n.dwellir.com/<API_Keys_Are_Not_Made_for_Bots>"  payload := []byte(`{"jsonrpc":"2.0","id":1,"method":"chain_getBlockHash","params":[0]}`)  resp, err := http.Post(url, "application/json",    bytes.NewBuffer(payload))  if err != nil { panic(err) }  defer resp.Body.Close()  body, _ := io.ReadAll(resp.Body)  fmt.Println(string(body))}

Installation & Setup

Network Information

ParameterValueDetails
Genesis Hash0x401a1f9d…1474bchain_getBlockHash(0)
Native TokenMOVR18 decimals
SS58 Prefix1285system_properties
Relay / Para IDKusama / 2023Parachain on Kusama
Runtime Spec Version3900As of 9 Oct 2025
Transaction Version3state_getRuntimeVersion
ExplorerMoonscanmoonriver.moonscan.io

Example Values Used in Docs

These chain-specific variables are used across Moonriver examples:

exampleEvmAddress: 0x6bEc0BCA2F15876f675f2C38958Ff986551e4db1
exampleBlockHash: 0x1849c7bc2c547b315fef716c6f2fb6f5e256da60482a013286caf975d035f766
exampleBlockNumberHex: 0xcd64f5
explorerMainnet: https://moonriver.moonscan.io

API Reference

Moonriver exposes standard Substrate RPC namespaces for node telemetry, block production, storage access, and fee estimation.

Common Integration Patterns

Track new blocks (subscriptions)

TypeScript
const unsub = await api.rpc.chain.subscribeNewHeads((header) => {
  console.log(`New #${header.number} (${header.hash})`);
});

Paginate large storage scans

TypeScript
const page = await api.rpc.state.getKeysPaged(
  api.query.system.account.keyPrefix(),
  100,
  '0x',
  null
);
console.log('Fetched', page.length, 'System.Account keys');

Estimate fees before broadcast

TypeScript
const ext = api.tx.balances.transferAllowDeath(dest, amount);
const info = await api.rpc.payment.queryInfo(ext.toHex());
console.log(`PartialFee: ${info.partialFee.toHuman()}`);

Performance Best Practices

  • Prefer WebSocket connections for subscriptions and multi-round queries.
  • Cache runtime metadata and reuse a single ApiPromise instance.
  • Use state_getKeysPaged for large scans; avoid full-chain traversals.
  • Exponential backoff on retries for transient -32010/TooManyRequests errors.

Troubleshooting

  • WebSocket failure – Verify your API key and outbound TCP/443. Try HTTPS for single calls.
  • Type mismatches – Refresh metadata after runtime upgrades (api.runtimeVersion).
  • Invalid address – Moonriver uses SS58 prefix 1285 for Substrate addresses; EVM 0x… accounts are also supported in the runtime.
  • Extrinsic rejected – Decode with api.registry.findMetaError to surface module/error.

Smoke Tests

Run these checks against production endpoints (values as of 9 Oct 2025):

Bash
# Node health
curl -s https://api-moonriver.n.dwellir.com/YOUR_API_KEY \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"system_health","params":[]}'

# Latest block header
curl -s https://api-moonriver.n.dwellir.com/YOUR_API_KEY \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"chain_getHeader","params":[]}'

# Runtime version
curl -s https://api-moonriver.n.dwellir.com/YOUR_API_KEY \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"state_getRuntimeVersion","params":[]}'

Migration Guide

  • Endpoints – Replace Polkadot/Moonbeam URLs with https://api-moonriver.n.dwellir.com/YOUR_API_KEY or wss://api-moonriver.n.dwellir.com/YOUR_API_KEY.
  • Addresses – Use SS58 prefix 1285 for Substrate-style addresses when needed; EVM 0x… addresses remain valid for account state.
  • Runtime types – Update custom type bundles as needed and refresh metadata caches after upgrades (specVersion 3900 on Oct 9, 2025).
  • Fees – Calibrate using payment_queryInfo/payment_queryFeeDetails for MOVR-denominated fees.
  • XCM/Parachain – Confirm HRMP channels and destination parachain IDs for XCM; Moonriver is parachain 2023 on Kusama.

Resources & Tools