Read The Order Book

Three endpoints return depth, differing in how much of the book they expose and how they treat retail price improvement (RPI) orders.

Method Depth RPI size
market.orderbook up to 1000 levels per side (25 for options) folded into the level
market.full_orderbook up to 10000 levels per side excluded
market.rpi_orderbook up to 50 levels per side reported separately

Depth Snapshot

from typed_bybit import Bybit

async with Bybit.new(public=True) as client:
  book = await client.http.market.orderbook(category='spot', symbol='BTCUSDT', limit=5)
  print(book['s'])
  for price, size in book['b']:
    print('bid', price, size)
  for price, size in book['a']:
    print('ask', price, size)

Field names are terse because Bybit's are: s is the symbol, b the bids, a the asks, ts the snapshot time as a millisecond epoch, and u the update id that matches the WebSocket order book stream. Bids are sorted by price descending, asks ascending.

Each level is a (price, size) tuple of strings.

Best Bid And Ask

The top of book is just the first level of each side:

from typed_bybit import Bybit, timestamp

async with Bybit.new(public=True) as client:
  book = await client.http.market.orderbook(category='linear', symbol='BTCUSDT', limit=1)
  (bid, bid_size), (ask, ask_size) = book['b'][0], book['a'][0]
  spread = float(ask) - float(bid)
  print(f'{bid} x {bid_size} | {ask} x {ask_size} | spread {spread:.2f}')
  print(timestamp.parse(book['ts']))

market.tickers also carries bid1Price and ask1Price if that is all you need — see Read Tickers And Trades.

Full Depth

from typed_bybit import Bybit

async with Bybit.new(public=True) as client:
  book = await client.http.market.full_orderbook(category='spot', symbol='BTCUSDT')
  print(len(book['b']), len(book['a']))

This returns the whole book — expect ten thousand levels per side on a liquid pair, and size the request budget accordingly. There is no limit parameter.

Upstream documents linear and inverse for this endpoint, but both currently answer with HTTP 404 and an empty body, which surfaces as a BadRequest. In practice only spot works.

RPI Depth

from typed_bybit import Bybit

async with Bybit.new(public=True) as client:
  book = await client.http.market.rpi_orderbook(category='spot', symbol='BTCUSDT', limit=5)
  for price, size, rpi_size in book['b']:
    print('bid', price, size, 'rpi', rpi_size)

Levels here are three-column (price, size, rpi_size) tuples: the extra column is the size available only to retail price improvement flow. limit is required and ranges from 1 to 50.