Streams referenceQuickNode-compatible

Order lifecycle

Every order-status event: open, filled, canceled, triggered, rejected.

The full L1 order lifecycle for every wallet and market: placements, modifications, cancels, fills, trigger activations, and rejections, with the order's complete parameters on each event.

Method
hyperliquid.Streaming/StreamData (stream_type: ORDERS)
Endpoint
stream.hyperliquidrpc.com:443 · gRPC over TLS (HTTP/2)
Auth
API key in x-api-key metadata
Volume
725M+ order updates/day platform-wide (~8,400/s average). Server-side coin and wallet filters are strongly recommended.

When to use it

Use this stream when fills alone don't tell the story: order management systems confirming their own placements and cancels, execution research measuring time-from-open-to-fill, risk systems watching trigger (stop/TP) orders arm and fire, and flow analytics on cancel-to-trade ratios. Every event carries the order's full parameters, so you never need a lookup to interpret a status change.

At 725M+ events a day platform-wide, this is not a feed to drink unfiltered. Subscribe with coin and user filters and the server drops everything else before it reaches you.

Method

// stream.hyperliquidrpc.com:443 — gRPC over TLS (HTTP/2)// auth: API key in x-api-key metadata · server reflection enabledpackage hyperliquid; service Streaming {  // Bidirectional: send one subscription, then read updates.  // Subscribe with stream_type: ORDERS.  rpc StreamData (stream SubscribeRequest) returns (stream SubscribeUpdate);}

StreamData is the QuickNode-compatible multiplexed service; the subscription names the stream_type and an optional filters map. Each update carries the block number and the event payload as JSON.

Subscribe

# StreamData is bidirectional; grpcurl sends the subscription for you.grpcurl -H 'x-api-key: YOUR_KEY' \  -d '{"subscribe":{"stream_type":"ORDERS","filters":{"coin":{"values":["ETH"]}}}}' \  stream.hyperliquidrpc.com:443 \  hyperliquid.Streaming/StreamData

Filter values are exact matches: coin takes market symbols, user takes wallet addresses. Add start_block to the subscription to replay before going live.

Message fields

FieldTypeDescription
userstringWallet that owns the order.
coinstringMarket symbol.
sidestringB (buy) or A (sell).
limit_pxstringLimit price.Byte-exact decimal string.
szstringOrder size.Byte-exact decimal string.
order_typestringLimit, trigger (stop/TP), etc.
tifstringTime-in-force: Gtc, Ioc, Alo.
trigger_px / trigger_conditionstring?Trigger parameters for stop and take-profit orders.
reduce_onlyboolTrue for reduce-only orders.
statusstringopen / filled / canceled / triggered / rejected.
oid / cloiduint64 / stringOrder id and optional client order id.

Fields typed string that carry numbers are byte-exact decimal strings, verbatim from the node. Compare and store them as strings or arbitrary-precision decimals. Never parseFloat a price you intend to reconcile.

Server-side filters

  • coins[]
  • wallets[]
  • replay from a block height

Filters are applied on the server, so filtered-out messages never leave our edge. You only pay for what you subscribe to. Request shapes for every stream family are on Filtering; backfill semantics on Replay & backfill.

Semantics & gotchas

Pure event stream in block order: one message per order-status transition. No snapshot phase.

  • Filter, or pay for the firehose. 725M+ order updates a day (~8,400/s average) arrive if you subscribe bare. Server-side coin and user filters are strongly recommended.
  • Statuses are transitions, not state. You receive one message per transition (open, filled, canceled, triggered, rejected). Keep your own order table keyed by oid; there is no snapshot of currently-open orders.
  • Trigger orders fire in two steps. A stop or take-profit first appears with its trigger_px and trigger_condition, then emits triggered when it activates and rests or executes as a normal order.
  • Partial fills keep the order open. Join against the trades stream by oid to see the fills behind an order; filled arrives only when the order completes.

Sample message

{  "block_height": 612408135,  "block_time": "2026-06-09T08:14:03.121Z",  "user": "0x91b3c07a4de2f6cc185a0fd2b94e7a30c8d1572e",  "coin": "ETH",  "side": "B",  "limit_px": "3498.25",  "sz": "12.4400",  "order_type": "Limit",  "tif": "Gtc",  "trigger_px": null,  "trigger_condition": null,  "reduce_only": false,  "oid": 91834221384,  "cloid": null,  "status": "open"}

725M+ order updates/day platform-wide (~8,400/s average). Server-side coin and wallet filters are strongly recommended.

Recipes

Mirror your own open orders

Filter by your wallet and maintain a table keyed by oid. This is an independent, node-derived view of your order state, useful as a check against what your trading stack believes.

open_orders = {} for update in stub.StreamData(iter([subscribe]), metadata=meta):    ev = json.loads(update.data.data)    if ev["status"] == "open":        open_orders[ev["oid"]] = ev    elif ev["status"] in ("filled", "canceled", "rejected"):        open_orders.pop(ev["oid"], None)

Watch stops arm and fire on one market

Subscribe to a single coin and keep only events where trigger_px is set. Clusters of stops near the mark price are visible before they fire, and triggered events tell you exactly when they did.

grpcurl -H 'x-api-key: YOUR_KEY' \  -d '{"subscribe":{"stream_type":"ORDERS","filters":{"coin":{"values":["BTC"]}}}}' \  stream.hyperliquidrpc.com:443 \  hyperliquid.Streaming/StreamData

Measure cancel-to-trade ratios

Count canceled versus filled per wallet over a window. Paired with the L4 book, this separates firms providing liquidity from firms fishing with quotes.

Related