Moonriver β Moonbeam's Canary Network on Kusama
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.
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.
π RPC Endpoints
Quick Connect:
curl -X POST https://api-moonriver.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"chain_getBlock","params":[],"id":1}'
Installation & Setupβ
- curl (HTTP JSON-RPC)
- JavaScript (polkadot.js)
- Rust (subxt)
- Python (py-substrate-interface)
curl -s https://api-moonriver.n.dwellir.com/YOUR_API_KEY \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"method": "chain_getHeader",
"params": [],
"id": 1
}'
import { ApiPromise, WsProvider } from '@polkadot/api';
async function main() {
const provider = new WsProvider('wss://api-moonriver.n.dwellir.com/YOUR_API_KEY');
const api = await ApiPromise.create({ provider });
const [chain, version] = await Promise.all([
api.rpc.system.chain(),
api.rpc.system.version(),
]);
console.log(`Connected to ${chain.toString()} v${version.toString()}`);
// Subscribe to new blocks
const unsub = await api.rpc.chain.subscribeNewHeads((header) => {
console.log(`New block #${header.number} at ${header.hash}`);
});
// Stop after a short period
setTimeout(async () => {
await unsub();
await api.disconnect();
}, 15000);
}
main().catch(console.error);
use subxt::{OnlineClient, PolkadotConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api = OnlineClient::<PolkadotConfig>::from_url(
"wss://api-moonriver.n.dwellir.com/YOUR_API_KEY"
).await?;
let header = api.rpc().block_header(None).await?.expect("latest header");
println!("Latest block: #{:?} (hash {:?})", header.number, header.hash());
Ok(())
}
from substrateinterface import SubstrateInterface
substrate = SubstrateInterface(
url="wss://api-moonriver.n.dwellir.com/YOUR_API_KEY"
)
chain = substrate.rpc_request("system_chain", [])
print(f"Connected to {chain['result']}")
head = substrate.rpc_request("chain_getFinalizedHead", [])
print(f"Finalized head: {head['result']}")
Network Informationβ
Genesis Hash
0x401a1f9dβ¦1474b
chain_getBlockHash(0)Native Token
MOVR
18 decimalsSS58 Prefix
1285
system_propertiesRelay / Para ID
Kusama / 2023
Parachain on KusamaRuntime Spec Version
3900
As of 9 Oct 2025Transaction Version
3
state_getRuntimeVersionExplorer
Moonscan
moonriver.moonscan.ioExample Values Used in Docsβ
These chain-specific variables are used across Moonriver examples:
exampleEvmAddress
: 0x6bEc0BCA2F15876f675f2C38958Ff986551e4db1
exampleBlockHash
: 0x1849c7bc2c547b315fef716c6f2fb6f5e256da60482a013286caf975d035f766
exampleBlockNumberHex
: 0xcd64f5
explorerMainnet
: https://moonriver.moonscan.io
Substrate JSON-RPC API Referenceβ
Moonriver exposes standard Substrate RPC namespaces for node telemetry, block production, storage access, and fee estimation. Open method guides from the dropdown below.
Available JSON-RPC Methods
System & Runtime
Identify the chain, runtime versions, and node health.
Chain Data & Finality
Inspect blocks, headers, and finality streams.
State Access & Storage
Query storage, metadata, and runtime entry points.
Authoring & Sessions
Submit extrinsics and manage session keys.
RPC Introspection
Discover supported RPC namespaces and versions.
Get your API key
Get your API key βCommon Integration Patternsβ
Track new blocks (subscriptions)β
const unsub = await api.rpc.chain.subscribeNewHeads((header) => {
console.log(`New #${header.number} (${header.hash})`);
});
Paginate large storage scansβ
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β
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; EVM0xβ¦
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):
# 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
orwss://api-moonriver.n.dwellir.com/YOUR_API_KEY
. - Addresses β Use SS58 prefix
1285
for Substrate-style addresses when needed; EVM0xβ¦
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.