Async Usage
Bit2Me clients are async-first and support two usage styles:
- construct a client and call methods directly for quick one-off requests
- use
async withwhen you want explicit lifecycle management
Quick Usage
For short request-response flows against the REST surface, plain construction is fine — the underlying HTTP transport opens lazily on first use.
from typed_bit2me import Bit2Me
client = Bit2Me.new(public=True)
book = await client.v2.trading.order_book(symbol='BTC/EUR')
print(book.get('bids', [])[:1])Context Manager Usage
Use async with to open the client up front and close it cleanly at the end of the block.
from typed_bit2me import Bit2Me
async with Bit2Me.new() as client:
balances = await client.v1.trading.balance()
orders = await client.v1.trading.orders.list(limit=5)Bit2Me's own async with only opens client.http. client.v1, client.v2, and
client.v3 all share that one HTTP transport, so nothing further is needed for the REST
surface. This is the one place Bit2Me departs from every other client in this catalog: the
top-level async with does not also open client.trading_ws or client.crypto_ws — each
WebSocket surface connects only when you separately enter it with its own async with.
WebSocket Surfaces
client.trading_ws (the Trading Spot socket) and client.crypto_ws (account notifications)
are two independent connections, and each needs its own async with before use:
from typed_bit2me import Bit2Me
async with Bit2Me.new() as client:
async with client.trading_ws as trading:
... # subscribe to channels or send order commands hereFor client.trading_ws, entering it is also what authenticates the connection when the
client holds credentials — there's no separate login step. client.crypto_ws needs an
explicit authenticate(token=...) call after entering (see Getting Started's WebSocket
section and Listen To Streams).
Streams
client.trading_ws's channel subscriptions (order_book, public_trades, my_orders,
my_trades, my_balance, my_working_capital) return a subscription manager, not a stream
directly. order_book/public_trades are public; the rest need an authenticated connection
via authed_subscribe under the hood. Both usage variants work:
from typed_bit2me import Bit2Me
async with Bit2Me.new(public=True) as client:
async with client.trading_ws as trading:
async with trading.order_book(symbol='BTC/EUR') as stream:
async for update in stream:
print(update['bids'][:1], update['asks'][:1])
# auto-unsubscribed on block exitfrom typed_bit2me import Bit2Me
async with Bit2Me.new(public=True) as client:
async with client.trading_ws as trading:
stream = await trading.order_book(symbol='BTC/EUR')
async for update in stream:
print(update['bids'][:1])
break
await stream.unsubscribe()client.crypto_ws has no subscribe/unsubscribe protocol at all: after authenticate(...),
every notification your account is entitled to arrives unprompted on notifications(), so
there's no separate stream manager to unsubscribe from.
Guidance
Use direct construction for quick reads. Use async with by default when doing more than one
call, and always wrap client.trading_ws/client.crypto_ws in their own async with when
you need either WebSocket surface — the top-level async with Bit2Me.new() does not cover
them.