개요
그 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
작동 원리
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
동전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 또는 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
| 필드 | 유형 | Required | 설명 |
|---|---|---|---|
| 동전 | 반복되는 문자열 | 아니요 | List of symbols to subscribe to (e.g., "BTC", "ETH"). Empty means all coins |
Coin Naming
그 동전 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):
#Nformat. Each outcome has two#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 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 또는 spotMeta info endpoints.
Response Fields
BboBookUpdate
| 필드 | 유형 | 설명 |
|---|---|---|
| 동전 | 문자열 | Symbol (e.g., "BTC", "ETH") |
| 시간 | uint64 | Block timestamp in milliseconds |
| block_number | uint64 | Block number |
| bid | L2Level | Best bid level. Absent if there is no resting bid |
| ask | L2Level | Best ask level. Absent if there is no resting ask |
L2Level
| 필드 | 유형 | 설명 |
|---|---|---|
| px | 문자열 | Price as a decimal string |
| sz | 문자열 | Total size across all orders at this price level, as a decimal string |
| n | uint32 | Number 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: []
};
StreamBboBook is only available via the gRPC Streaming API (OrderBookStreaming service). It is not available through JSON-RPC or WebSocket.
Comparison with StreamL2Book
| Feature | StreamBboBook | StreamL2Book |
|---|---|---|
| Data per message | Best bid and best ask only | Full depth snapshot (up to n_levels per side) |
| Message cadence | Only when the BBO changes | Every block |
| Coins per stream | Multiple (or all coins) | One coin per stream |
| Client-side state management | 없음 | 없음 |
| Bandwidth | Lowest (top-of-book only) | Medium (capped by n_levels) |
| 다음에 가장 적합합니다 | Live prices, spread monitoring, tickers | Market 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
BboBookUpdatecovers a single coin; subscribe to multiple coins (or all coins) on one stream and demultiplex by the동전field - Absent sides: If a side of the book is empty, the
bid또는askfield 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
Related Streams
- 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