Ir diretamente para o conteúdo principal

BBO Book Dataset

Atualizado em
Jun 10, 2026

Visão geral

O StreamBboBook stream delivers the best bid and best ask (top of book) for one or more coins. An update is emitted only when the best bid or ask changes for a coin, making it the lightweight feed for clients that just need live prices and spread without order book depth.

gRPC Service: OrderBookStreaming
gRPC Method: StreamBboBook
Update Model: Emit-on-change: one message per coin whose best bid or ask changed

Como funciona

StreamBboBook watches the top of the book for every subscribed coin and emits a message whenever the best bid or best ask changes, including size changes at the same best price. Compared to consuming full StreamL2Book snapshots:

  • Each message carries only the best bid and best ask, not full depth
  • Messages are emitted only on change, not every block
  • A single stream can cover multiple coins (or all coins with an empty coins list)
  • No client-side state management is required, since each message is the current top of book

Each message covers exactly one coin. If a side of the book is empty, the corresponding bid ou ask field is absent.

Data Structure

Each BboBookUpdate message contains the current best bid and ask for a single coin:

{
"coin": "BTC",
"time": 1781109022243,
"block_number": 586404610,
"bid": { "px": "62990", "sz": "0.001", "n": 1 },
"ask": { "px": "63054", "sz": "0.00008", "n": 1 }
}

Request Parameters

CampoTipoRequiredDescription
coinsrepeated stringNoList of symbols to subscribe to (e.g., "BTC", "ETH"). Empty means all coins

Coin Naming

O coins parameter follows Hyperliquid's naming convention, which unambiguously distinguishes perpetuals from spot:

  • Perpetuals: Human-readable names, such as "BTC", "ETH", "HYPE", "SOL"
  • Spot tokens: @{index} format, such as "@1", "@107", "@142", "@166"
  • Outcome markets (HIP-4): #N format. Each outcome has two #N coins, 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 the outcomeMeta endpoint to map coin indices to market names and sides.
  • Exception: "PURR/USDC" is the only spot coin with a readable name

There is no overlap between formats. "BTC" always refers to the BTC perpetual; spot BTC is "@142". To discover @index mappings for spot tokens, query the meta ou spotMeta info endpoints.

Response Fields

BboBookUpdate

CampoTipoDescription
moedacadeia de caracteresSymbol (e.g., "BTC", "ETH")
tempouint64Block timestamp in milliseconds
block_numberuint64Block number
bidL2LevelBest bid level. Absent if there is no resting bid
askL2LevelBest ask level. Absent if there is no resting ask

L2Level

CampoTipoDescription
pxcadeia de caracteresPrice as a decimal string
szcadeia de caracteresTotal size across all orders at this price level, as a decimal string
nuint32Number of individual orders at this price level

Proto Definition

StreamBboBook is defined in orderbook.proto:

service OrderBookStreaming {
rpc StreamBboBook (BboBookRequest) returns (stream BboBookUpdate);
}

message BboBookRequest {
repeated string coins = 1;
}

message BboBookUpdate {
string coin = 1;
uint64 time = 2;
uint64 block_number = 3;
L2Level bid = 4;
L2Level ask = 5;
}

message L2Level {
string px = 1;
string sz = 2;
uint32 n = 3;
}

Example Updates

BBO Update (single coin)
{
"coin": "BTC",
"time": 1781109022243,
"block_number": 586404610,
"bid": { "px": "62990", "sz": "0.001", "n": 1 },
"ask": { "px": "63054", "sz": "0.00008", "n": 1 }
}
Consecutive Updates (emit-on-change)

Consecutive ETH updates demonstrating the emit-on-change model. A size change at the same best price triggers an update:

{ "coin": "ETH", "time": 1781109213042, "block_number": 586405802,
"bid": { "px": "1701.1", "sz": "0.015", "n": 1 },
"ask": { "px": "1701.2", "sz": "0.0176", "n": 2 } }
{ "coin": "ETH", "time": 1781109220213, "block_number": 586405844,
"bid": { "px": "1701.1", "sz": "0.015", "n": 1 },
"ask": { "px": "1701.2", "sz": "0.0105", "n": 1 } }
{ "coin": "ETH", "time": 1781109221825, "block_number": 586405854,
"bid": { "px": "1701.1", "sz": "0.0079", "n": 1 },
"ask": { "px": "1701.2", "sz": "0.0105", "n": 1 } }

API Usage

gRPC Streaming
// Single coin
const request = {
coins: ['BTC']
};

// Multiple coins in one stream
const multiRequest = {
coins: ['BTC', 'ETH', 'HYPE']
};

// All coins
const allCoinsRequest = {
coins: []
};

gRPC Only

StreamBboBook is only available via the gRPC Streaming API (OrderBookStreaming service). It is not available through JSON-RPC or WebSocket.

Comparison with StreamL2Book

FeatureStreamBboBookStreamL2Book
Data per messageBest bid and best ask onlyFull depth snapshot (up to n_levels per side)
Message cadenceOnly when the BBO changesEvery block
Coins per streamMultiple (or all coins)One coin per stream
Client-side state managementNenhumNenhum
BandwidthLowest (top-of-book only)Medium (capped by n_levels)
Ideal paraLive prices, spread monitoring, tickersMarket depth, analytics dashboards

Important Notes


  • Emit-on-change: Updates are sent only when the best bid or ask changes for a coin, including size changes at the same best price
  • One coin per message: Each BboBookUpdate covers a single coin; subscribe to multiple coins (or all coins) on one stream and demultiplex by the moeda field
  • Absent sides: If a side of the book is empty, the bid ou ask field is absent. Check for presence before reading it
  • zstd compression recommended: Enable zstd compression on your gRPC channel to reduce bandwidth, especially when streaming all coins

  • StreamL2Book - Aggregated price-level depth, full snapshot every block
  • StreamL2BookDiff - Incremental L2 price-level changes with sequence numbers
  • Trades - Executed trade data with maker/taker information
Partilhar este documento