Wire-compatible with wss://api.hyperliquid.xyz/wsuserFills subscription - same channel name, same per-fill shape.
Up to 1,000 wallet addresses per subscription. Use addresses (string[]); aliases user(string) and users (string[]) are also accepted.
Messages are batched per HyperCore block as [address, fill] tuples; subscribe many wallets, receive one push per block per wallet that had activity.
Live-only - no historical snapshot on subscribe. For windowed history, use the Info API userFillsByTime.
No 1,000-subscription-per-IP cap. Multiplex many userFills subscriptions on a single connection.
Subscribe to one or more wallets and receive their live trade fills the moment they execute. The server batches one push per HyperCore block, carrying every matching fill as [address, fill] tuples.Supports up to 1,000 wallet addresses per subscription.
import WebSocket from "ws";const ws = new WebSocket( `wss://hypercore.goldrushdata.com/ws?key=${process.env.GOLDRUSH_API_KEY}`,);ws.on("open", () => { ws.send(JSON.stringify({ method: "subscribe", subscription: { type: "userFills", addresses: ["0x31ca8395cf837de08b24da3f660e77761dfb974b"], }, }));});ws.on("message", (raw) => { const msg = JSON.parse(raw.toString()); if (msg.channel === "userFills") { for (const [address, fill] of msg.fills) { console.log(address, fill.coin, fill.side, fill.sz, "@", fill.px); } }});
import asyncio, json, osimport websocketsasync def main(): uri = f"wss://hypercore.goldrushdata.com/ws?key={os.environ['GOLDRUSH_API_KEY']}" async with websockets.connect(uri) as ws: await ws.send(json.dumps({ "method": "subscribe", "subscription": { "type": "userFills", "addresses": ["0x31ca8395cf837de08b24da3f660e77761dfb974b"], }, })) async for raw in ws: msg = json.loads(raw) if msg.get("channel") == "userFills": for address, fill in msg["fills"]: print(address, fill["coin"], fill["side"], fill["sz"], "@", fill["px"])asyncio.run(main())
Unsubscribe matches subscriptions by exact body. A subscription created with addresses: ["0xAAA", "0xBBB"] is a different subscription from two single-address subscriptions. To narrow the set, unsubscribe the original list in full, then resubscribe with the smaller list.
Each push has channel: "userFills" and a fills array of [address, fill] tuples - all fills from the same HyperCore block that match any subscribed wallet.