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:
- Fetch the nonce with
eth_getTransactionCount(use thependingtag if you submit in bursts). - Price and budget the transaction with
eth_gasPriceandeth_estimateGas. - Sign locally against chain id
0x3e7and submit the raw bytes viaeth_sendRawTransaction. - Poll
eth_getTransactionReceiptuntil 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.
{ "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:
-32600invalid request,-32601method not found (anything outside the table above),-32602invalid params. 401/403HTTP responses mean a missing or invalidx-api-key— see Authentication.429means 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.