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/StreamDataFilter 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
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
coinanduserfilters 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 byoid; there is no snapshot of currently-open orders. - Trigger orders fire in two steps. A stop or take-profit first appears with its
trigger_pxandtrigger_condition, then emitstriggeredwhen it activates and rests or executes as a normal order. - Partial fills keep the order open. Join against the trades stream by
oidto see the fills behind an order;filledarrives 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/StreamDataMeasure 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.