Paginate Through Results

Endpoints that return a page carry a _paged sibling that walks every page automatically, with no manual cursor bookkeeping. Most of these are a plain async iterator; a cursor-paged endpoint whose response is just {rows, cursor} -- nothing else worth keeping per page -- is instead PaginatedResponse-shaped: usable both as async for (one page of rows at a time) and as a single await (every page flattened into one list).

Cursor-Paged, PaginatedResponse-Shaped: Order History

from typed_bitget import Bitget

async with Bitget.new() as client:
  async for page in client.uta.trade.history_orders_paged(category='SPOT', symbol='BTCUSDT'):
    for order in page:
      print(order['orderId'], order['orderStatus'])

  # Or flatten every page into one list in a single call:
  every_order = await client.uta.trade.history_orders_paged(category='SPOT', symbol='BTCUSDT')

history_orders_paged follows the response's cursor and stops once a page carries none -- async for yields each page's rows directly (no {list, cursor} envelope to unwrap), and await walks every page for you. elite_records, move_position_history, current_track_orders/history_track_orders/profit_share_history (and their Classic Spot counterparts), order_fills, position_history, virtual_subaccount_list, current_followers/history_followers/profit_details, all_orders/my_ads/pending_orders, sub_transfer_records, withdraw_address_book, sub_api_list, and market data's liquidations follow the same shape.

The one-shot form returns a single page directly, with its own cursor for manual paging:

from typed_bitget import Bitget

async with Bitget.new() as client:
  page = await client.uta.trade.history_orders(category='SPOT', symbol='BTCUSDT')

Cursor-Paged, Plain Async Iterator: Financial Records

A cursor-paged endpoint whose page also carries something worth keeping alongside the rows -- financial_records/fills/unfilled_orders's own {list, cursor} page object, say -- stays a plain async iterator instead, yielding the whole response per page:

from typed_bitget import Bitget

async with Bitget.new() as client:
  async for page in client.uta.account.financial_records_paged(category='SPOT', coin='USDT'):
    for record in page['list'] or []:  # `list` is `null`, not `[]`, on an empty page
      print(record['amount'])

Pass max_pages to cap how many pages a plain async-iterator _paged method walks -- unlike the PaginatedResponse-shaped form above, which has no such parameter.

Window-Paged: Candles

from datetime import datetime, timezone
from typed_bitget import Bitget

async with Bitget.new(public=True) as client:
  async for page in client.uta.market.candles_paged(
    category='SPOT', symbol='BTCUSDT', interval='1m',
    start_time=datetime(2024, 1, 1, tzinfo=timezone.utc),
    end_time=datetime(2024, 1, 2, tzinfo=timezone.utc),
  ):
    print(page)

candles_paged walks the start_time to end_time window backwards by its own width and stops on the first empty window. A page that comes back full (as many rows as requested) may be hiding more candles the venue truncated. In that case candles_paged raises LogicError rather than silently skipping rows; pass allow_truncation=True to accept the loss and continue.