RPC reference

HyperEVM JSON-RPC

Standard Ethereum-style JSON-RPC against HyperEVM state: read contract state, index logs, and broadcast signed transactions. If your tooling speaks Ethereum JSON-RPC — viem, ethers, web3.py, Foundry — it works here unchanged.

Endpoint

Endpoint
https://rpc.hyperliquidrpc.com
Protocol
JSON-RPC 2.0 over HTTPS (POST)
Auth
API key in the x-api-key header
Chain id
0x3e7 (999) — from eth_chainId / net_version

Every request is a JSON-RPC 2.0 body POSTed to the endpoint with your key in x-api-key. Get a key from the console, then verify the round-trip:

curl https://rpc.hyperliquidrpc.com \  -H 'x-api-key: YOUR_KEY' \  -H 'content-type: application/json' \  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

RPC works best as the companion to the streams: stream the live data, use RPC for point reads and transaction submission. Don't poll eth_getLogs in a loop for data that exists as a push stream.

Supported methods

The supported eth_* set, with a runnable request/response pair per method. Expand a row for the exact body shapes; the copy button copies the method name.

Request

{ "jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": [] }

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x7b2a4f1" }

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getBlockByNumber",  "params": ["latest", false]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": {    "number": "0x7b2a4f1",    "hash": "0x9c41d2e8f06a3b7d5512cc09e8b1f4a6d3370c25b8e9410f7aa61d20c4b53e18",    "timestamp": "0x684694aa",    "gasUsed": "0x1b8e4",    "transactions": []  }}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getBlockByHash",  "params": ["0x9c41d2e8f06a3b7d5512cc09e8b1f4a6d3370c25b8e9410f7aa61d20c4b53e18", false]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": {    "number": "0x7b2a4f1",    "hash": "0x9c41d2e8f06a3b7d5512cc09e8b1f4a6d3370c25b8e9410f7aa61d20c4b53e18",    "parentHash": "0x4f8be20cd1a967340a1f2dd086c5e3b6b9407d83cf25e6a1908b4d27f013ae52"  }}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_call",  "params": [    {      "to": "0x5555555555555555555555555555555555555555",      "data": "0x70a08231000000000000000000000000913ef4b96e9fd7d6f8c14e22b1a1a1e7c41a0a2b"    },    "latest"  ]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": "0x000000000000000000000000000000000000000000000002b5e3af16b1880000"}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_estimateGas",  "params": [    {      "from": "0x913ef4b96e9fd7d6f8c14e22b1a1a1e7c41a0a2b",      "to": "0x5555555555555555555555555555555555555555",      "value": "0xde0b6b3a7640000"    }  ]}

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x5208" }

Request

{ "jsonrpc": "2.0", "id": 1, "method": "eth_gasPrice", "params": [] }

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x3b9aca00" }

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getBalance",  "params": ["0x913ef4b96e9fd7d6f8c14e22b1a1a1e7c41a0a2b", "latest"]}

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x1bc16d674ec80000" }

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getCode",  "params": ["0x5555555555555555555555555555555555555555", "latest"]}

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x6080604052348015610010..." }

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getStorageAt",  "params": ["0x5555555555555555555555555555555555555555", "0x0", "latest"]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": "0x0000000000000000000000000000000000000000000000000000000000000001"}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getTransactionCount",  "params": ["0x913ef4b96e9fd7d6f8c14e22b1a1a1e7c41a0a2b", "pending"]}

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x2a" }

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getLogs",  "params": [    {      "fromBlock": "0x7b2a000",      "toBlock": "latest",      "address": "0x5555555555555555555555555555555555555555",      "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]    }  ]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": [    {      "address": "0x5555555555555555555555555555555555555555",      "blockNumber": "0x7b2a4f1",      "transactionHash": "0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3",      "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],      "data": "0x000000000000000000000000000000000000000000000000016345785d8a0000"    }  ]}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getTransactionReceipt",  "params": ["0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3"]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": {    "transactionHash": "0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3",    "blockNumber": "0x7b2a4f1",    "status": "0x1",    "gasUsed": "0x5208",    "logs": []  }}

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getTransactionByHash",  "params": ["0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3"]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": {    "hash": "0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3",    "from": "0x913ef4b96e9fd7d6f8c14e22b1a1a1e7c41a0a2b",    "to": "0x5555555555555555555555555555555555555555",    "value": "0x0",    "nonce": "0x29",    "blockNumber": "0x7b2a4f1"  }}

Note: HyperEVM transactions only. CLOB orders go through Hyperliquid's signed-action exchange API.

Request

{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_sendRawTransaction",  "params": ["0x02f8718205398084773594008504a817c80082520894555555555555..."]}

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": "0x6b1f0e9a4d27c5583f10ab8e2d94c7106e3bd1a05f88c2e4917d30b6a25c84f3"}

Request

{ "jsonrpc": "2.0", "id": 1, "method": "eth_chainId", "params": [] }

Response

{ "jsonrpc": "2.0", "id": 1, "result": "0x3e7" }

Request

{ "jsonrpc": "2.0", "id": 1, "method": "net_version", "params": [] }

Response

{ "jsonrpc": "2.0", "id": 1, "result": "999" }

Broadcasting transactions

eth_sendRawTransaction broadcasts a signed HyperEVM transaction to the network — contract calls, transfers, bridging. You sign locally; we never see a private key. The flow is the standard Ethereum one:

  1. Fetch the nonce with eth_getTransactionCount (use the pending tag if you submit in bursts).
  2. Price and budget the transaction with eth_gasPrice and eth_estimateGas.
  3. Sign locally against chain id 0x3e7 and submit the raw bytes via eth_sendRawTransaction.
  4. Poll eth_getTransactionReceipt until the receipt lands; status: "0x1" means success.
curl https://rpc.hyperliquidrpc.com \  -H 'x-api-key: YOUR_KEY' \  -H 'content-type: application/json' \  -d '{"jsonrpc":"2.0","id":1,"method":"eth_sendRawTransaction",       "params":["0x02f8718205398084773594008504a817c80082520894555555555555..."]}'

Indexing with eth_getLogs

eth_getLogs is the indexing workhorse: filter by address, topics, and a block range. Page through history in bounded ranges rather than one open-ended query — a fixed window of a few thousand blocks per request keeps responses fast and retries cheap.

eth_getLogs — bounded rangejson
{  "jsonrpc": "2.0",  "id": 1,  "method": "eth_getLogs",  "params": [    {      "fromBlock": "0x7b2a000",      "toBlock": "0x7b2bf40",      "address": "0x5555555555555555555555555555555555555555",      "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]    }  ]}

For continuous indexing, track the head with eth_blockNumber and re-request the last few blocks on each tick to absorb short reorgs.

Errors and limits

  • Standard JSON-RPC errors: -32600 invalid request, -32601 method not found (anything outside the table above), -32602 invalid params.
  • 401 / 403 HTTP responses mean a missing or invalid x-api-key — see Authentication.
  • 429 means you have hit your plan's request rate — budgets per tier are on Rate limits & tiers. Back off and retry with jitter.

Related

  • HyperCore /info — the read API for the perps/spot CLOB: metadata, book snapshots, user state.
  • Streams — push feeds for everything that changes block-to-block; RPC for what doesn't.
  • Historical query API — SQL over the archived events instead of crawling logs.