Resumen
El StreamL4BookUpdates stream delivers typed order-level book changes as NEW, UPDATE, y REMOVE diffs for one or more coins. It gives clients per-order L4 movement without consuming full L4 book snapshots every block, and without parsing JSON-encoded payloads: every diff is a strongly typed protobuf message.
gRPC : OrderBookStreaming
gRPC : StreamL4BookUpdates
Modelo de actualización: Full reset snapshot on subscribe and for mid-stream replacement resets, then typed per-order diffs per block
Cómo funciona
- Al suscribirse: The first message has
snapshot: trueand contains every resting order as aL4_ORDER_DIFF_TYPE_NEWdiff, a full reset snapshot of the book - A partir de ahí, por bloque: Each
L4BookUpdatesUpdatecontains typed diffs for orders that changed:NEW(order entered the book),UPDATE(order size changed),REMOVE(order left the book,szis omitted) - Apply diffs to a local order map keyed by
oideto maintain the current book - Replacement resets: Any later message can also have
snapshot: true, for example when an ALO priority fee insertion changes queue order or when stream state is rebuilt. Whenever a message hassnapshot: true, clear the keyed local order state before applying its diffs, not only on the first message
Unlike StreamL4Book, which sends diffs as a JSON-encoded datos string, every field here is a typed protobuf field, so no secondary JSON parsing is required. A single stream can cover multiple coins (or all coins with an empty coins list).
Estructura de datos
Each L4BookUpdatesUpdate message contains the typed diffs for one block:
{
"time": 1781109115476,
"height": 586405189,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "ETH", "oid": 54764586686,
"user": "0x768484F7e2EBB675C57838366C02Ae99ba2A9B08", "side": "B", "px": "1649.1", "sz": "1.022" }
]
}
Parámetros de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| coins | repeated string | No | List of symbols to subscribe to (e.g., "BTC", "ETH"). Empty means all coins |
Denominación de las monedas
El coins El parámetro sigue la convención de nomenclatura Hyperliquid, que distingue sin ambigüedades entre los contratos perpetuos y los al contado:
- Perpetuos: Human-readable names, such as
«BTC»,«ETH»,«HYPE»,«SOL» - Fichas al contado:
@{índice}format, such as"@1",«@107»,«@142»,«@166» - Mercados de resultados (HIP-4):
#Nformato. Cada resultado tiene dos#Ncoins, one per side (Yes and No). Multi-price question markets consist of multiple grouped outcomes (price buckets plus a fallback), each with its own Yes/No coin pair. Use theoutcomeMetaendpoint asignar los índices de las monedas a los nombres y lados del mercado. - Excepción:
«PURR/USDC»es la única moneda de la serie «Spot» cuyo nombre se puede leer
No hay solapamiento entre los formatos. «BTC» siempre se refiere al contrato perpetuo de BTC; el BTC al contado es «@142». Para descubrir @índice asignaciones para tokens puntuales, consultar el meta o spotMeta puntos de información.
Campos de respuesta
L4BookUpdatesUpdate
| Campo | Tipo | Descripción |
|---|---|---|
| tiempo | uint64 | Marca de tiempo del bloque en milisegundos |
| altura | uint64 | Altura del bloque |
| instantánea | bool | True when the diffs carry a full reset snapshot of all resting orders (sent on subscribe and for mid-stream replacement resets) |
| diffs | L4OrderDiff[] | Typed per-order diffs for this block |
L4OrderDiff
| Campo | Tipo | Descripción |
|---|---|---|
| diff_type | L4OrderDiffType | L4_ORDER_DIFF_TYPE_NEW (order entered the book), L4_ORDER_DIFF_TYPE_UPDATE (order size changed), or L4_ORDER_DIFF_TYPE_REMOVE (order left the book) |
| moneda | cadena | Símbolo (p. ej., «BTC», «ETH») |
| oide | uint64 | N.º de pedido único |
| usuario | cadena | Ethereum de Ethereum del titular del pedido |
| lado | cadena | «A» (precio de venta/oferta) o «B» (precio de compra/demanda) |
| px | cadena | Order price as a decimal string |
| sz | cadena | New/current order size for NEW and UPDATE diffs. Omitted on REMOVE |
Definición de «Proto»
StreamL4BookUpdates se define en orderbook.proto:
service OrderBookStreaming {
rpc StreamL4BookUpdates (L4BookUpdatesRequest) returns (stream L4BookUpdatesUpdate);
}
message L4BookUpdatesRequest {
repeated string coins = 1;
}
enum L4OrderDiffType {
L4_ORDER_DIFF_TYPE_UNSPECIFIED = 0;
L4_ORDER_DIFF_TYPE_NEW = 1;
L4_ORDER_DIFF_TYPE_UPDATE = 2;
L4_ORDER_DIFF_TYPE_REMOVE = 3;
}
message L4BookUpdatesUpdate {
uint64 time = 1;
uint64 height = 2;
repeated L4OrderDiff diffs = 3;
bool snapshot = 4;
}
message L4OrderDiff {
L4OrderDiffType diff_type = 1;
string coin = 2;
uint64 oid = 3;
string user = 4;
string side = 5;
string px = 6;
string sz = 7;
}
Ejemplos de actualizaciones
Initial Snapshot (first message, truncated)
The first message has snapshot: true and contains every resting order as a NEW diff. Later messages can also carry snapshot: true as a replacement reset; handle each one the same way:
{
"time": 1781109063794,
"height": 586404872,
"snapshot": true,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764492622,
"user": "0x039442e06b482Bf01A1a65742cf061bD73A80f31", "side": "B", "px": "62963", "sz": "0.00009" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764537698,
"user": "0x3643290CD5DE72b37d2f10A351Ce57c30d103969", "side": "B", "px": "62963", "sz": "0.00024" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764482173,
"user": "0x4547B9E33F07965711f67d0bE2423939A4E33aF5", "side": "B", "px": "62955", "sz": "0.00015" }
]
}
Per-Block Update with Removals
sz is omitted on REMOVE diffs:
{
"time": 1781109083796,
"height": 586404997,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_REMOVE", "coin": "BTC", "oid": 54764554671,
"user": "0xc64cc00B46101bd40aA1C3121195E85c0B0918d8", "side": "B", "px": "62389.0" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_REMOVE", "coin": "BTC", "oid": 54764557274,
"user": "0xc64cc00B46101bd40aA1C3121195E85c0B0918d8", "side": "B", "px": "62421.0" }
]
}
New Order and Size Update
A new order entering the book:
{
"time": 1781109115476,
"height": 586405189,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "ETH", "oid": 54764586686,
"user": "0x768484F7e2EBB675C57838366C02Ae99ba2A9B08", "side": "B", "px": "1649.1", "sz": "1.022" }
]
}
A size change on a resting order (sz is the new current size):
{ "diff_type": "L4_ORDER_DIFF_TYPE_UPDATE", "coin": "ETH", "oid": 54764551695,
"user": "0x4547B9E33F07965711f67d0bE2423939A4E33aF5", "side": "B", "px": "1702.9", "sz": "0.0032" }
Uso de la API
gRPC
// Single coin
const request = {
coins: ['BTC']
};
// Multiple coins in one stream
const multiRequest = {
coins: ['BTC', 'ETH']
};
// All coins
const allCoinsRequest = {
coins: []
};
StreamL4BookUpdates solo está disponible a través de la API gRPC (OrderBookStreaming servicio). No está disponible a través de JSON-RPC ni de WebSocket.
Comparison: L4 Book Updates vs L4 Book vs Book Updates Dataset
| Característica | StreamL4BookUpdates | StreamL4Book | NOVEDADES_LIBROS |
|---|---|---|---|
| Granularidad | Individual orders, typed diffs | Pedidos individuales | Diferencias a nivel de pedido individual |
| Diff encoding | Typed protobuf (NEW/UPDATE/REMOVE) | JSON-encoded data string | JSON objects |
| Incluye el estado actual | Yes (reset snapshot as NEW diffs) | Yes (initial snapshot) | No (forward-only) |
| Requiere el arranque de REST | No | No | Sí |
| Coins per stream | Multiple (or all coins) | One coin per stream | Filterable |
| Detalles por pedido | User, oid, side, px, sz | Usuario, oid, disparadores, marcas de tiempo, tif | Usuario, oid, tamaño |
| Ideal para | Per-order book tracking without JSON parsing | Full order detail (triggers, tif, cloid) | Clientes que solo necesitan actualizaciones de libros |
Notas importantes
- Reset on every
snapshot: truemensaje: The first message is a full reset with all resting orders asNEWdiffs, and replacement resets can arrive mid-stream (for example after an ALO priority fee queue insertion). Clear any local state and rebuild wheneverinstantáneais true, not only on subscribe and reconnect REMOVEomitssz: Remove diffs identify the order byoide(withmoneda,usuario,lado,px) but carry no size. Delete the order from your local map- Typed alternative to StreamL4Book: If you need trigger info, timestamps,
tif, orcloideper order, useStreamL4Book; if you need lean typed per-order movement, use this stream - zstd compression recommended: Enable zstd compression on your gRPC channel to reduce bandwidth, especially when streaming multiple coins
Streams relacionados
- StreamL4Book - Full order book at order granularity with snapshot + JSON-encoded diffs
- StreamL2BookDiff - Incremental L2 price-level changes with sequence numbers
- Órdenes - Eventos del ciclo de vida de los pedidos (pendientes, completados, cancelados, etc.)