Overview
The StreamL2Book stream delivers aggregated price-level depth for a given coin. Each message contains the full L2 snapshot — total size and order count at each price level — refreshed every block.
gRPC Service: OrderBookStreaming
gRPC Method: StreamL2Book
Update Model: Full snapshot every block — no client-side state management required
How It Works
Instant, ongoing access to the full L2 order book: StreamL2Book delivers a complete L2 snapshot every block. There is no need to:
- Fetch an initial snapshot from the REST Info endpoint
- Stitch incremental diffs onto a snapshot
- Handle race conditions during the snapshot-to-diff transition
- Re-bootstrap on reconnect
Each message is the full current state of the order book at that block, aggregated by price level.
Data Structure
Each L2BookUpdate message contains the full aggregated book at the time of a block:
{
"coin": "BTC",
"time": 1764867600518,
"block_number": 817863403,
"bids": [
{ "px": "95000.0", "sz": "12.5432", "n": 47 },
{ "px": "94999.5", "sz": "8.2100", "n": 23 },
{ "px": "94999.0", "sz": "5.0000", "n": 12 }
],
"asks": [
{ "px": "95000.5", "sz": "10.8900", "n": 38 },
{ "px": "95001.0", "sz": "6.3210", "n": 15 },
{ "px": "95001.5", "sz": "3.7500", "n": 9 }
]
}
Request Parameters
Price Bucketing
The optional n_sig_figs and mantissa parameters control how prices are aggregated into buckets. When omitted, each distinct price level is reported individually. When set, orders are grouped into price buckets — for example, bucketing BTC orders into $100 increments instead of exact prices.
n_sig_figs(2–5): Number of significant figures in the bucket pricemantissa(1, 2, or 5): Mantissa multiplier for the bucket width
Response Fields
L2BookUpdate
L2Level
Proto Definition
StreamL2Book is defined in orderbook.proto:
service OrderBookStreaming {
rpc StreamL2Book (L2BookRequest) returns (stream L2BookUpdate);
}
message L2BookRequest {
string coin = 1;
uint32 n_levels = 2;
optional uint32 n_sig_figs = 3;
optional uint64 mantissa = 4;
}
message L2BookUpdate {
string coin = 1;
uint64 time = 2;
uint64 block_number = 3;
repeated L2Level bids = 4;
repeated L2Level asks = 5;
}
message L2Level {
string px = 1;
string sz = 2;
uint32 n = 3;
}
Example Updates
Full L2 Snapshot (top 5 levels)
{
"coin": "BTC",
"time": 1764867600518,
"block_number": 817863403,
"bids": [
{ "px": "95000.0", "sz": "12.5432", "n": 47 },
{ "px": "94999.5", "sz": "8.2100", "n": 23 },
{ "px": "94999.0", "sz": "5.0000", "n": 12 },
{ "px": "94998.0", "sz": "3.1250", "n": 8 },
{ "px": "94997.5", "sz": "1.7500", "n": 5 }
],
"asks": [
{ "px": "95000.5", "sz": "10.8900", "n": 38 },
{ "px": "95001.0", "sz": "6.3210", "n": 15 },
{ "px": "95001.5", "sz": "3.7500", "n": 9 },
{ "px": "95002.0", "sz": "2.5000", "n": 6 },
{ "px": "95003.0", "sz": "1.2000", "n": 3 }
]
}
L2 Snapshot with Price Bucketing
When using n_sig_figs=3 and mantissa=1, prices are aggregated into broader buckets:
{
"coin": "BTC",
"time": 1764867600518,
"block_number": 817863403,
"bids": [
{ "px": "95000.0", "sz": "25.8782", "n": 82 },
{ "px": "94900.0", "sz": "18.4300", "n": 61 },
{ "px": "94800.0", "sz": "12.1000", "n": 34 }
],
"asks": [
{ "px": "95100.0", "sz": "21.0110", "n": 62 },
{ "px": "95200.0", "sz": "14.7210", "n": 40 },
{ "px": "95300.0", "sz": "8.9500", "n": 18 }
]
}
API Usage
gRPC Streaming
// StreamL2Book — OrderBookStreaming service
const request = {
coin: 'BTC',
n_levels: 20
};
// With price bucketing
const bucketedRequest = {
coin: 'BTC',
n_levels: 20,
n_sig_figs: 3,
mantissa: 1
};
StreamL2Book is only available via the gRPC Streaming API (OrderBookStreaming service). It is not available through JSON-RPC or WebSocket.
Comparison with Book Updates Dataset
Important Notes
- Full snapshot every block: Each
L2BookUpdateis a complete snapshot — no need to track state across messages - zstd compression recommended: Enable zstd compression on your gRPC channel to reduce bandwidth, especially when streaming multiple coins
Related Streams
- StreamL4Book - Individual order granularity with user, oid, size, triggers, and timestamps
- Book Updates - Forward-only incremental diffs via StreamData
- Orders - Order lifecycle events (open, filled, canceled, etc.)
- Trades - Executed trade data with maker/taker information