IRONFLOW
IRONBOXDATA APILIQUIDATIONSPRICINGDOCSGET_API_KEY
GET_API_KEY
GUIDES · UPDATED 27 OCTOBER 2026 · 18 MIN READ

How to run a Hyperliquid non-validator node

A setup guide for engineers who want to run their own Hyperliquid non-validator node. It covers hardware, install, peers, output flags, first sync, disk, monitoring and gaps. We run these nodes in production.

CONTENTS
  1. Before you start
  2. What the node does
  3. Terms
  4. 1. Hardware
  5. 2. Install hl-visor
  6. 3. Gossip peers
  7. 4. Run the node
  8. 5. First sync
  9. 6. Disk cleanup
  10. 7. Watchdog
  11. 8. Gaps
  12. 9. Where to host it
  13. Health check
  14. Troubleshooting
  15. Common errors
  16. Questions
  17. Related guides
  18. References
BEFORE YOU START
  • You need: a bare-metal server with Ubuntu 24.04 and root access. 8 fast cores, 128 GB RAM, 2 TB NVMe.
  • Ports: TCP 4001 and 4002 open to the internet.
  • Time: about 1 hour of work, plus 10 to 30 minutes for the first sync.
  • Scripted version: hyperliquid-node-kit installs everything in this guide, adds the cleanup, watchdog and peer refresh timers, and runs the node as a separate hl user instead of root. MIT licensed.
  • You end with: a synced node that writes every fill, order book change and chain event to disk, and answers account reads on localhost:3001 with no public rate limit.
  • Managed option: Ironflow's dedicated nodes in Tokyo come with this setup, upgrades and gap filling handled, plus SSH access for your own software. Nodes page.

Skip the nodeIf you want the data rather than the machine: Ironflow serves every fill since May 2025, liquidations, funding and candles from its own nodes, free without a key and 30 days back with a free key. For a node of your own that someone else keeps running, see managed nodes.

What the node does#

A non-validator node follows the chain without voting on it. It applies every block and keeps the full exchange state in memory. It can write every fill, every order book change and every funding or ledger event to disk as JSON lines, which means one JSON object per line. The Hyperliquid node docs and the node repository are the primary sources.

With --serve-info it also answers part of the info API locally. These request types work: clearinghouseState, spotClearinghouseState, openOrders, frontendOpenOrders, meta, userAbstraction. These return 422: allMids, l2Book, userFills, portfolio. A 422 is an HTTP error that means the server does not support the request. Local reads do not count against the public API rate limits. The node does not take orders. Orders still go to Hyperliquid's API, for example through the official Python SDK.

Terms#

Validator / non-validator
Validators vote on new blocks. A non-validator node receives the same blocks and keeps the same state, but does not vote.
Gossip
The peer-to-peer network nodes use to pass blocks and state to each other.
Root peers
Entry points Hyperliquid publishes. Your node connects to them first and finds other peers through them.
hl-visor
The supervisor program. It downloads the node binary, verifies it, runs it and restarts or upgrades it.
Node (child process)
The program hl-visor starts. It does the actual work of applying blocks and writing data.
State snapshot (ABCI state)
A copy of the full exchange state at a recent block. A new node loads it so it does not have to replay the whole chain.
Pointer file
hyperliquid_data/visor_abci_state.json. It tells the visor which saved state to load on restart.
replica_cmds
The raw block data the node receives. It is the largest thing on disk.
Fills and book diffs
A fill is one executed trade. A book diff is one change to an order book: an order added, changed or removed.
Info API
Hyperliquid's read-only HTTP API for account and market data. The node can answer part of it locally.

1. Hardware#

  • RAM: 128 GB. The node uses about 40 GB in normal operation. During network stress it buffers blocks it has not applied yet and memory climbs fast. 64 GB is not enough headroom.
  • CPU: 8 cores / 16 threads, high clock speed. Applying blocks is mostly single-threaded. More cores do not help much.
  • Disk: 2 TB NVMe. The node writes about 700 GB a day before cleanup. Most of it is replica_cmds (raw block data) and the hourly event files.
  • Network: gossip traffic from other nodes is about 2 MB/s inbound, around 5 TB a month. Open TCP 4001 and 4002 so peers can reach you.
  • Bare metal. Shared or burstable instances fall behind under load.

CHECKThe server matches the numbers above. nproc prints the number of CPU threads. free -g prints memory in GB. df -h / prints free disk space.

bash
nproc && free -g | sed -n 2p && df -h /

2. Install hl-visor#

hl-visor is the supervisor. It downloads the node binary, checks its signature and runs it. Install it on Ubuntu 24.04:

bash
curl -L https://binaries.hyperliquid.xyz/Mainnet/hl-visor -o /usr/local/bin/hl-visor
chmod +x /usr/local/bin/hl-visor

# the visor checks node binaries against Hyperliquid's key
apt install -y gnupg
curl -s https://raw.githubusercontent.com/hyperliquid-dex/node/main/pub_key.asc | gpg --import

# the visor will not start without this file
echo '{"is_validator": false, "chain": "Mainnet"}' > /usr/local/bin/visor.json
  • curl -L ... -o downloads the file and follows redirects. chmod +x makes it executable.
  • gpg --import adds Hyperliquid's public signing key. The visor uses it to verify every node binary it downloads.
  • visor.json tells the visor to run as a non-validator on mainnet.

The visor can fail to start when the host resolves its own address to IPv6. This line tells the system to prefer IPv4 addresses when a name has both:

bash
echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf

If it still says it cannot determine its public IP on a host with both IPv4 and IPv6, turn IPv6 off.

CHECKThe binary is executable, the config exists and the key is imported. ls -l shows the files and their permissions. gpg --list-keys lists imported keys.

bash
ls -l /usr/local/bin/hl-visor /usr/local/bin/visor.json && gpg --list-keys

3. Gossip peers#

The node needs root peers to join gossip. It will not start without them. Ask the public API for the current list. The gossipRootIps request returns a JSON array of IP addresses:

bash
curl -s -X POST https://api.hyperliquid.xyz/info \
  -H 'Content-Type: application/json' -d '{"type":"gossipRootIps"}'

Put the addresses in ~/hl/override_gossip_config.json, the node's working directory:

json
{
  "root_node_ips": [{"Ip": "<ip-1>"}, {"Ip": "<ip-2>"}, {"Ip": "<ip-3>"}],
  "try_new_peers": true,
  "chain": "Mainnet"
}
  • root_node_ips: the peers the node connects to first.
  • try_new_peers: lets the node connect to other peers it learns about.
  • chain: the network, Mainnet or Testnet.

Peer quality matters more than CPU. A node with one slow or distant upstream peer falls behind while the server sits idle. Keep several root peers. Prefer peers close to you. Refresh the list regularly. n_gossip_peers is an optional setting in the same file. It sets how many peers the node keeps connected.

Root peers right now#

ROOT PEERS · LIVE

Checking the root peers.

50 MS150 MS300 MSNO ANSWER
DISTANCE FROM CENTRE = CONNECT TIME
    Hover or tab over a region or a peer

    The map and the radar show a TCP connect to port 4001 of each root peer, made from one server location at the time shown. Peer regions come from the cloud providers' published IP ranges. Peers outside those ranges show as "other". This does not tell you which peer is a good upstream for your node. Latency from your server will differ. A peer that does not answer this probe may still serve other nodes. Run the same check from your own server. jq -r '.[]' prints each address on its own line. nc -z -w2 tries a TCP connection without sending data and gives up after 2 seconds:

    bash
    for ip in $(curl -s -X POST https://api.hyperliquid.xyz/info \
      -H 'Content-Type: application/json' -d '{"type":"gossipRootIps"}' | jq -r '.[]'); do
      nc -z -w2 "$ip" 4001 && echo "$ip up" || echo "$ip no answer"; done

    CHECKThe file parses as JSON. python3 -m json.tool prints the file, or an error if the JSON is invalid.

    bash
    python3 -m json.tool ~/hl/override_gossip_config.json

    4. Run the node#

    You never start the node binary yourself. You start hl-visor. It downloads the node binary, verifies its signature with the key you imported, starts the node as a child process and restarts it if it exits. It also upgrades the node when Hyperliquid publishes a new version.

    Run the visor as a systemd service so it starts on boot and restarts after a crash. Save this as /etc/systemd/system/hlnode.service. The unit is named hlnode on purpose, so no command you type contains the program names. Step 7 explains why that matters.

    ini
    [Unit]
    Description=Hyperliquid non-validator node
    After=network-online.target
    
    [Service]
    WorkingDirectory=/root/hl
    ExecStart=/usr/local/bin/hl-visor run-non-validator \
      --write-fills \
      --write-raw-book-diffs \
      --write-misc-events \
      --batch-by-block \
      --disable-output-file-buffering \
      --serve-info
    Restart=always
    RestartSec=10
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    What each line does:

    • After=network-online.target: start only once the network is up.
    • WorkingDirectory=/root/hl: the folder the node uses. The peer config and the data folder live here.
    • The unit runs as root to keep the guide short. A separate user with no sudo rights is safer; hyperliquid-node-kit sets that up.
    • ExecStart=... run-non-validator: the command systemd runs. It starts the visor in non-validator mode with the flags below.
    • Restart=always and RestartSec=10: if the visor exits for any reason, start it again after 10 seconds.
    • LimitNOFILE=65536: lets the process keep many files and connections open at once.
    • WantedBy=multi-user.target: start the service on boot.

    The flags choose what the node writes and serves. Every output costs disk. Turn on only the ones you read:

    • --write-fills: writes every fill, both sides, with builder and liquidation fields.
    • --write-raw-book-diffs: writes every order book change. About 5 GB an hour. You can rebuild the full book from it.
    • --write-misc-events: writes funding, deposits, withdrawals, vault and ledger events.
    • --batch-by-block: writes one line per block that holds all of that block's events. This is the same format as the public S3 archive. You cannot combine it with --stream-with-block-info, which is a different output layout.
    • --disable-output-file-buffering: writes each line to disk as soon as it exists. Without it, lines wait in memory and your readers see them late.
    • --serve-info: starts the local info API on port 3001.
    • --write-order-statuses (not in the unit above): writes every order status change. About 25 GB an hour. Leave it off unless you need it.

    Output goes under ~/hl/data/ in hourly files, for example node_fills_by_block/hourly/20260918/9. The L1 data schemas page documents the line formats. The hour names are not zero-padded: 0, 1, ... 9, 10, ... 23. Sort them as numbers. A string sort puts 9 after 10.

    Create the folder and start the service:

    bash
    mkdir -p /root/hl
    systemctl daemon-reload
    systemctl enable --now hlnode
    • systemctl daemon-reload: makes systemd read the new unit file.
    • systemctl enable --now hlnode: starts the service now and on every boot.

    Follow the logs:

    bash
    journalctl -u hlnode -f

    journalctl -u hlnode -fshows the service's log and keeps printing new lines. On a healthy first start you see three phases. First the visor downloads and verifies the node binary. Then the node downloads a state snapshot from a peer and prints its progress in bytes. Then it applies blocks and the hourly files appear under ~/hl/data/. Step 5 covers the wait.

    A flag change applies at the next restart. A forced restart can make the node download the state snapshot again. Change flags when you can wait for a natural restart.

    CHECKThe service reports active. systemctl is-active prints the service state.

    bash
    systemctl is-active hlnode

    5. First sync#

    On first start the node downloads a state snapshot of about 940 MB from a peer. The snapshot is a copy of the full exchange state at a recent block. The node then applies the blocks that came after it. It takes 10 to 30 minutes. Output files only appear once it has caught up. Restart once at most, then leave it. Every restart starts the download again.

    The node also saves its own state to data/periodic_abci_states/ about every 12 minutes. On restart the visor loads the newest saved state instead of downloading one. It finds that state through a small pointer file, hyperliquid_data/visor_abci_state.json. Loading local state takes seconds. An unclean crash can lose the pointer file, and then the visor downloads the snapshot from peers again. Back up the pointer file and restore it before a restart.

    CHECKHour files exist for today and the local info server answers. ls lists today's hour files. The curl sends a meta request to the local info API and prints the first 200 bytes of the answer.

    bash
    ls ~/hl/data/node_fills_by_block/hourly/$(date -u +%Y%m%d)/
    
    curl -s localhost:3001/info -H 'Content-Type: application/json' \
      -d '{"type":"meta"}' | head -c 200

    6. Disk cleanup#

    Without cleanup a 2 TB disk fills in two to three days. A full disk crashes the node. Run a cleanup job every hour:

    • Delete hourly output older than your retention window. 24 hours is a reasonable default.
    • Delete old replica_cmds date directories.
    • Check with lsof before deleting. lsof lists the files that running processes have open, so you can skip a file the node is still writing.
    • In bash, force base 10 when you compare hour numbers. Bash reads a number with a leading zero as octal (base 8), so 08 and 09 are invalid. 10# in front of the variable forces base 10.
    bash
    h=$((10#$hour))

    CHECKDisk use stays flat from one day to the next. df -h shows free space. du -sh shows the size of each data folder, and sort -h | tail -5 keeps the five largest.

    bash
    df -h ~/hl && du -sh ~/hl/data/* | sort -h | tail -5

    7. Watchdog#

    • Measure freshness from the data. The process can be running and still be hours behind the chain. Every line the node writes carries a block_time, the time the block was produced. Read it from the last line of the newest fills file and compare it to the clock.
    • Keep the program names out of command lines. Every running process has a command line: the program name plus the arguments it was started with. When the supervisor starts, it lists all running processes. If another process has hl-visor or hl-node anywhere in its command line, the supervisor thinks a second copy is running and stops with a panic.
    • How this happens in practice. A monitoring script runs pgrep hl-node, which searches the process list for that name and has the name in its own command line. An alert sends a message that contains the name. Someone runs an ssh command with the name in it. Any of these running at the moment the supervisor starts is enough.
    • What to do instead. To check whether the node runs, read the process names from /proc/*/comm. Every process has a small file there that holds only its name, and reading it puts no name in your own command line. In scripts and alerts, build the name from parts, for example n="hl-"; n="$n"node, so the full name never appears as one argument.
    • Restart with a cooldown and a limit. Use systemctl restart --no-block hlnode. --no-block makes the command return at once instead of waiting until the service has restarted. Your script then exits before the supervisor starts and lists processes, so your script's own command line is not in that list. Wait between attempts. Do not restart while the node is still downloading state. After a few failed restarts, stop and page a person.

    CHECKThe last block time is within a few seconds of the clock. sort -V sorts the hour folders as numbers. tail -n 1 takes the last line and grep -o prints only the block time.

    bash
    f=$(ls -d ~/hl/data/node_fills_by_block/hourly/*/* | sort -V | tail -1)
    tail -n 1 "$f" | grep -o '"block_time":"[^"]*"'
    date -u +%Y-%m-%dT%H:%M:%S

    8. Gaps#

    Under load or around a restart the node sometimes skips writing a range of blocks. You cannot get those back from the node. Every hour, check that block numbers in your data run in order with no missing ranges. Do it in whatever database you load the files into.

    Many blocks have no fills. Short runs of missing block numbers are normal. Set your gap threshold high enough to ignore them, or you will get false alarms.

    Fill gaps from Hyperliquid's public archive, s3://hl-mainnet-node-data. It is an Amazon S3 bucket. It is requester-pays, which means your AWS account pays the download cost, so you need AWS credentials. The files are compressed with LZ4. Decompress them with lz4 -d. The format matches --batch-by-block. The hour file shows up about an hour after the hour closes.

    bash
    aws s3 cp s3://hl-mainnet-node-data/node_fills_by_block/hourly/20260918/9.lz4 . \
      --request-payer requester

    CHECKYou can list yesterday's hour files in the archive. aws s3 ls lists files in the bucket. --request-payer requester confirms you accept the download cost.

    bash
    aws s3 ls s3://hl-mainnet-node-data/node_fills_by_block/hourly/$(date -u -d yesterday +%Y%m%d)/ \
      --request-payer requester

    9. Where to host it#

    Hyperliquid's validators are in Tokyo. Distance to Tokyo sets two things: how fast your orders reach Hyperliquid's API, and how close your gossip peers are. From a Tokyo server an order reaches the API in about 4.5 ms and the nearest peer is about 2 ms away. From other continents both take several hundred milliseconds.

    A node far from Tokyo still works for data collection. It falls behind more often because its peers are far away. Host in or near Tokyo if anything downstream cares about latency.

    Health check#

    One script checks the usual failure points in a few seconds. It is read-only, needs no root, and keeps the program names out of every command line it runs, so it cannot trip the supervisor panic described in the watchdog step. Read it before you run it.

    bash
    curl -fsSL https://ironflow.sh/node-check.sh -o node-check.sh
    less node-check.sh
    bash node-check.sh                 # HL_HOME=/root/hl bash node-check.sh if the node runs as root
    • The supervisor and the node are both running.
    • Your supervisor binary matches the published one. It never updates itself, and an old one crash-looped nodes at the 25 October 2026 hardfork.
    • How many seconds since the node last wrote fills: behind after a minute, stalled after ten.
    • Disk use and the number of EVM checkpoints kept, and how much memory is free.
    • Gossip ports 4001 and 4002 listen, and the info server on 3001 is not open on every interface.
    • The gossip peers file exists.

    It exits 0 when everything passes, 1 on warnings and 2 on a failure, so a cron line can alert on it: */5 * * * * bash /opt/node-check.sh > /var/log/node-check.log || your-alert-command.

    Troubleshooting#

    SymptomCauseFix
    The visor says it cannot determine its public IP.The host resolves its own address to IPv6.Add the gai.conf precedence line from step 2. Turn IPv6 off if it persists.
    The node is minutes behind and the CPU is idle.A slow or distant upstream peer.Refresh the root peer list. Prefer peers in your region. See step 3.
    No output files after the first start.The node is still downloading and replaying state.Wait 10 to 30 minutes. Do not restart. Each restart starts the download again.
    The supervisor panics at startup.Another process has the node's binary names in its command line.Remove the names from scripts, alerts and ssh commands. See step 7.
    The node crashed and the disk is at 100%.No cleanup job, or the job stopped running.Free space, restart once, then install the hourly cleanup from step 6.
    Your reader skips hours or reads an old file.Hour file names are not zero-padded and were sorted as strings.Sort hour names as numbers. In bash, force base 10.
    Disk use grows by about 15 GB an hour after the October 2026 hardfork.Binary 115 keeps an EVM checkpoint every 10000 blocks in hyperliquid_data/evm_db_hub_slow/checkpoint and never deletes them.Prune old checkpoints every hour. The EVM checkpoint guide has the rule and a script.

    Common errors#

    Log lines people hit when they run a node, with the cause and the fix. Addresses and byte counts in your log will differ. Crash logs from the node process are in ~/hl/data/visor_child_stderr/.

    /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.39' not found (required by hl-visor)#

    Cause. The binaries need a newer C library than the host has. Ubuntu 22.04 ships glibc 2.35. The node README supports only Ubuntu 24.04.

    Fix. Run the node on Ubuntu 24.04. Upgrading the release in place or using the Docker image are the other options reported (hyperliquid-dex/node #14). See step 1.

    failed to spawn child, retrying#

    Cause. On mainnet a non-validator needs at least one root peer in ~/override_gossip_config.json. Without the file the child exits at once; run directly it panics in gossip_config.rs with "not implemented".

    Fix. Create the file with current root peer IPs, then restart the supervisor. Operators in hyperliquid-dex/node #55 confirmed the node started syncing right after. See step 3.

    more than one matching proc found for keywords#

    Cause. At startup the supervisor scans running processes. Another process has the node's binary names in its command line. A log follower, a pgrep or an ssh command is enough.

    Fix. Stop that process. Keep the binary names out of scripts, alerts and command lines. See step 7.

    Could not parse home public ip: ... invalid IPv4 address syntax#

    Cause. The host resolved its own address to IPv6. The node expects IPv4.

    Fix. Add the gai.conf precedence line. Turn IPv6 off if it persists. See step 2.

    multiple equivalence sets detected for public ip#

    Cause. The host has both IPv4 and IPv6, and the services the node asks for its public address disagree: some answer IPv4, some IPv6. The supervisor then keeps restarting the child.

    Fix. Turn IPv6 off on the host and restart. Reported working in hyperliquid-dex/node #80. The line is in the newest file under ~/hl/data/visor_child_stderr/. See step 2.

    could not load VisorAbciState after retrying ... missing file: hyperliquid_data/visor_abci_state.json#

    Cause. The pointer to the node's saved state does not exist. This is normal on a first start. After a crash it means the pointer was lost.

    Fix. Let the node download state from a peer. Back up the pointer file so later restarts load local state. See step 5.

    reading bytes for abci_stream greeting: 680000000/757521515#

    Cause. Not an error. The node is downloading the state snapshot from a peer. The two numbers are bytes received and total bytes.

    Fix. Wait. Do not restart. A restart starts the download again. See step 5.

    could not read abci state from <ip>: early eof#

    Cause. The peer closed the connection before it sent the full state snapshot. The peer is overloaded or does not serve state.

    Fix. The node tries other peers on its own. If every peer fails, refresh the root peer list and prefer peers in your region. See step 3.

    abci_stream from <ip> timed out: lu::timeout deadline has elapsed#

    Cause. The state snapshot is several hundred MB. It did not arrive from that peer before the deadline. The peer is slow or far away.

    Fix. Use closer root peers. Check that nothing throttles inbound traffic on the host. See step 3.

    error connecting to candidate peer Ip(...) with greeting TcpGreeting { send_abci: true, send_evm_kvs: false, id: Live }: Timed out connecting to peer#

    Cause. The peer did not answer or the state download timed out. Closed gossip ports on your side make it worse, because peers deprioritize nodes they cannot reach.

    Fix. Open TCP 4001 and 4002 to the internet. Refresh the root peer list. See step 3.

    visor child in bad state, restarting @@ [child_low_memory: true]#

    Cause. The node's memory use crossed the supervisor's threshold and the supervisor restarted it. This happens on hosts with 64 GB during network stress.

    Fix. Run the node on 128 GB of RAM. See step 1.

    visor child in bad state, restarting @@ [child_stuck: true] @ [child_running: false]#

    Cause. The node process crashed or stopped making progress. This line is the supervisor reacting. The real error is in the child's stderr log.

    Fix. Read the newest file under ~/hl/data/visor_child_stderr/ and look up the error it shows.

    failed to validate hardfork version: missing file: /root/hl/hyperliquid_data/node_metadata.json#

    Cause. hl-node binary 115, from the 25 October 2026 hardfork, needs a file that only a current hl-visor writes. The visor upgrades the node but never itself, so an old visor leaves the node crashing on every start.

    Fix. Update hl-visor to the current published binary, verify its signature and restart. No resync. See the full fix.

    crashing process because tokio_spawn_forever ended, name=nv_stream_forward_client_blocks ... panicked with message "too many blocks to request"#

    Cause. A panic inside the node while it streams blocks from a peer. It is reported upstream in hyperliquid-dex/node and is not caused by your config.

    Fix. The supervisor restarts the node. A backed-up state pointer keeps the restart short. Expect a gap in the output files and fill it from the archive. See step 8.

    curl: (7) Failed to connect to localhost port 3001 after 0 ms: Couldn't connect to server#

    Cause. The local info server, and the EVM RPC behind --serve-eth-rpc, open on port 3001 only once the node is connected to a peer and in sync. Port 4001 is gossip, not the API.

    Fix. Wait for the sync to finish; the health check shows when fills start arriving. In Docker, also map 3001:3001. See the health check.

    422 Failed to deserialize the JSON body into the target type#

    Cause. The local info server does not support that request type. allMids, l2Book, userFills and portfolio are not served by a node.

    Fix. Send those requests to the public API. Keep account state, open orders and metadata on the local server. See What the node does.

    No space left on device#

    Cause. The node's output filled the disk. Without cleanup a 2 TB disk fills in two to three days.

    Fix. Free space, restart once, then install the hourly cleanup job. See step 6.

    gpg: Can't check signature: No public key#

    Cause. Hyperliquid's signing key is not imported. The supervisor verifies every node binary and will not upgrade when verification fails.

    Fix. Import pub_key.asc from the node repository, then restart the supervisor. See step 2.

    Questions#

    What are the hardware requirements for a Hyperliquid non-validator node?#

    Hyperliquid's README lists 16 vCPUs, 128 GB RAM and a 500 GB SSD on Ubuntu 24.04. We recommend 2 TB of NVMe, because the node writes about 700 GB a day before cleanup.

    How much disk does a Hyperliquid node use?#

    About 700 GB a day before cleanup. Most of it is replica_cmds and the hourly event files. With an hourly cleanup job and 24 hours of retention, a 2 TB disk is enough.

    Can a non-validator node place orders?#

    No. The node is read-only. Orders go to Hyperliquid's exchange API. A bot on the same server can read from the node and send its orders to the API.

    Does running a node remove API rate limits?#

    For reads it does. Requests to your local info server do not count against the public limit of 1200 weight per minute per IP. Address-based limits on order actions still apply.

    How long does the first sync take?#

    10 to 30 minutes. The node downloads a state snapshot from a peer and replays blocks from there. Output files appear once it has caught up.

    Does the local info server support l2Book, allMids or userFills?#

    No. The local server answers requests that depend only on current state, such as clearinghouseState, openOrders and meta. l2Book, allMids, userFills and portfolio return 422.

    Which ports does a Hyperliquid node need?#

    TCP 4001 and 4002, open to the internet, for gossip. The local info server listens on port 3001. Keep 3001 closed to the outside.

    Can I run it on a cloud VM or a VPS?#

    A dedicated cloud instance with 128 GB of RAM works. Shared or burstable instances fall behind under load. Bare metal gives the most stable results.

    Does the node offer a WebSocket feed?#

    No. The local server has no WebSocket and no historical queries. Use the --write flags and read the hourly files as they grow.

    Where do I get historical data from before my node started?#

    From Hyperliquid's public S3 archive. s3://hl-mainnet-node-data holds fills and other node output in the same format the node writes. The requester pays for transfer.

    How do I run a testnet node?#

    Put {"chain": "Testnet"} in visor.json and download the supervisor from binaries.hyperliquid-testnet.xyz. The run command is the same.

    Does the node have to be in Tokyo?#

    No. Hyperliquid recommends Tokyo for the lowest latency, because the validators are there. A node elsewhere works for data collection and falls behind more often.

    Related guides#

    • Hyperliquid node crash after the October 2026 hardfork: missing node_metadata.json
    • Hyperliquid node disk filling up: EVM checkpoints and how to prune them
    • Hyperliquid API rate limits explained
    • Hyperliquid historical data: API, S3 archive and Python

    References#

    • hyperliquid-dex/node. Official node README: install, flags, ports, hardware.
    • ironflowsh/hyperliquid-node-kit. Scripts for this guide: installer, cleanup, watchdog and peer refresh timers, and a read-only MCP server for the local node.
    • Hyperliquid docs: Nodes. Overview of validator and non-validator nodes.
    • Hyperliquid docs: L1 data schemas. Format of the files the node writes.
    • Hyperliquid docs: Info endpoint. Request types the local info server mirrors.
    • Hyperliquid docs: Rate limits and user limits. The public API limits a local node avoids for reads.
    • Hyperliquid docs: Historical data. The public S3 archive used to fill gaps.
    • hyperliquid-python-sdk. Official SDK for placing orders from the same server.

    We also run nodes for other teams, with this setup and our data stack on the same server. Details and price are on the nodes page.

    ON THIS PAGE
    1. Before you start
    2. What the node does
    3. Terms
    4. 1. Hardware
    5. 2. Install hl-visor
    6. 3. Gossip peers
    7. 4. Run the node
    8. 5. First sync
    9. 6. Disk cleanup
    10. 7. Watchdog
    11. 8. Gaps
    12. 9. Where to host it
    13. Health check
    14. Troubleshooting
    15. Common errors
    16. Questions
    17. Related guides
    18. References
    DEDICATED NODES
    Your own node in Tokyo, run by us. Full SSH, no read limits.

    Automated derivatives trading is high-risk: you can lose all of your funds. Ironflow is trading software, not financial advice, and never holds your funds. Not available to U.S. persons or in sanctioned jurisdictions. See Risk Disclosure.

    Not affiliated with Hyperliquid or Pear Protocol.

    IRONFLOW

    © 2026 IRONFLOW

    Product

    IronboxAPI and MCPPricingNodesTerminal

    Data

    Live liquidationsLiquidation mapLiquidation heatmapHIP-4 outcomesDatasets

    Developers

    DocsGuidesFree API keyStatusGitHub

    Company

    TermsPrivacyRiskAcknowledgements