All tutorials

2026-03-27

How to Stream Hyperliquid Perpetuals Data in Real-Time

Hyperliquid is a high-performance perpetuals exchange running on its own L1. The Sailfish SDK provides real-time streaming of Hyperliquid orderbook updates and trades via WebSocket, plus a historic REST API for querying past data. This is a separate chain from Solana — it uses its own dedicated WebSocket endpoint.

Hyperliquid WebSocket Endpoint

  • WebSocket: wss://sailfish.0xfire.com/stream/hyperliquid/ws
  • REST API: https://sailfish.0xfire.com

Stream Hyperliquid Trades

Connect to the Hyperliquid WebSocket by passing the wsUrl parameter:

import { Sailfish, SailfishTier, Trade } from "sailfish-sdk";

const sailfish = new Sailfish({
  tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }),
  wsUrl: "wss://sailfish.0xfire.com/stream/hyperliquid/ws",
  filter: {
    token_addresses: [],
    pool_addresses: [],
    dex_types: [],
  },
  callbacks: {
    onTrade: (trade: Trade) => {
      console.log(`Hyperliquid trade: ${trade.base_amount} @ ${trade.price}`);
      console.log(`Pair: ${trade.pool_address}`);
      console.log(`Tx: ${trade.index.tx_hash}`);
    },
  },
});

sailfish.swim();

On Hyperliquid, pool_address maps to the trading pair/market (e.g., BTC-PERP).

Filter by Market

To stream only specific markets, pass their addresses in pool_addresses:

filter: {
  token_addresses: [],
  pool_addresses: ["BTC-PERP_MARKET_ADDRESS"],
  dex_types: [],
},

Use TradeRaw for Raw Data

TradeRaw gives raw token amounts with no PoolInfo lookup — lower latency for high-frequency use cases:

callbacks: {
  onTradeRaw: (tradeRaw) => {
    console.log(`Market: ${tradeRaw.pool_address}`);
    console.log(`In: ${tradeRaw.token_amount_in} ${tradeRaw.token_address_in}`);
    console.log(`Out: ${tradeRaw.token_amount_out} ${tradeRaw.token_address_out}`);
    console.log(`Price: ${tradeRaw.price}`);
  },
},

Query Historic Trades

The REST API supports querying past Hyperliquid trades by market address:

import { SailfishApi, SailfishTier } from "sailfish-sdk";

const api = new SailfishApi({ tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }) });

const trades = await api.fetchTrades({
  pool_address: "MARKET_ADDRESS",
  limit: 100,
});

for (const trade of trades) {
  console.log(`Block ${trade.index.tick}: ${trade.base_amount} @ ${trade.price}`);
}

Build a Price Feed

A minimal price tracker that maintains the latest price per market:

const prices: Map<string, string> = new Map();

const sailfish = new Sailfish({
  tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }),
  wsUrl: "wss://sailfish.0xfire.com/stream/hyperliquid/ws",
  filter: {
    token_addresses: [],
    pool_addresses: [],
    dex_types: [],
  },
  callbacks: {
    onTrade: (trade: Trade) => {
      prices.set(trade.pool_address, trade.price);
    },
  },
});

sailfish.swim();

setInterval(() => {
  for (const [market, price] of prices) {
    console.log(`${market}: ${price}`);
  }
}, 5000);

Resources