Choose a network
Every method page has a server selector with both networks:
Testnet is the default, and the developer examples in these docs target it. Devnet state may be wiped at any time, so don’t rely on devnet block numbers, hashes, or balances staying valid.
To send testnet requests from a method page, open Try it and paste your
endpoint ID into the
endpointId field under Server. Your endpoint ID is
a credential: anyone who has it can spend your account’s credits. The
playground keeps it in this browser for every method page, and sends each
request from your browser straight to Metal.
Test the connection
Create an endpoint in the Metal console and replace<endpoint-id> below with your endpoint ID. See
RPC endpoint setup for the setup steps.
Requests can be batched. This asks for the chain ID, latest block height, and finalized consensus state in one round trip:
How requests work
Metal follows JSON-RPC 2.0. Send each request as an HTTPPOST to your
/v1/<endpoint-id> URL, with jsonrpc, method, ordered params, and an id
in the body. The response echoes the id. Use the same endpoint URL for every
method, without appending a method name to the path. The bare
https://rpc-testnet.metalntwx.com/v1 answers 402 with a price: an agent
with only a wallet buys an endpoint there
over x402.
Each page pre-fills a valid request, so once your endpoint ID is set,
read-only methods succeed as-is. Methods that take a transaction hash, block hash, or address are pre-filled with placeholders; replace them with real values from the network you selected. Calling eth_getBlockByNumber with "latest" is an easy way to get a current block hash.
Wallet-facing overrides
Metal adapts several Ethereum methods so standard wallets can quote and submit transactions against its MIP20-denominated gas model.State proofs and blob sidecars
eth_getProof returns account and storage proofs against a block’s state root.
Its balance field is the EVM account’s native balance, rather than the MIP20
balance returned by Metal’s eth_getBalance override. Proving a MIP20 balance
requires a storage proof at the token contract address for
keccak256(abi.encode(holder, uint256(0))). Slot 0 is the base slot of the
_balances mapping, rather than a holder’s balance. For holder
0x0000000000000000000000000000000000000001, the derived key is
0xada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d.
metal_getBlobSidecars retrieves retained EIP-7594 sidecars by execution block
hash. It returns null for blocks outside the canonical finalized chain or
without a retained verified sidecar. See Blob Transactions and
Sidecars for ordering and verification requirements.
Block tags and finality
Block-reading methods accept the standard Ethereum block selectors.
For settlement decisions, use
"finalized" or compare the receipt’s block
against consensus_status.finalized. A transaction hash identifies a submission,
and a successful receipt reports EVM execution; neither alone proves finality.
Errors
Errors come back in-band as a JSON-RPCerror object with code and message in place of result. Protocol-level errors use the standard codes:
Transaction admission failures are returned by
eth_sendRawTransaction with a more specific message.
Error codes
Match Metal admission and MIP20 transfer failures to corrective actions.
Connect to testnet
Wallet and SDK connection details for the public testnet.