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
- Sailfish SDK — Real-time data streaming
- Sailfish Examples — Working code samples
- API Documentation — Endpoints, schemas, and SDK reference