Skip to content

WebSockets

PolyTrader provides real-time WebSocket connections for market data and user events.

Market WebSocket

Subscribe to public market data for specific asset IDs.

from polytrader import (
    Book, PriceChange, LastTradePrice,
    BestBidAsk, TickSizeChange, NewMarket, MarketResolved,
)

def on_market_event(event):
    match event:
        case Book():
            print(f"Order book update: {len(event.bids)} bids, {len(event.asks)} asks")
            print(f"Best bid: {event.best_bid}, Best ask: {event.best_ask}")
            print(f"Spread: {event.spread}, Mid: {event.mid_price}")
        case PriceChange():
            for change in event.price_changes:
                print(f"Price change: {change.side} {change.size} @ {change.price}")
        case LastTradePrice():
            print(f"Last trade: {event.size} @ {event.price} ({event.side})")
            print(f"Quote value: {event.quote_value}")
        case BestBidAsk():
            print(f"BBO: {event.best_bid} / {event.best_ask} (spread: {event.spread})")
        case TickSizeChange():
            print(f"Tick size: {event.old_tick_size} -> {event.new_tick_size}")
        case NewMarket():
            print(f"New market: {event.question}")
        case MarketResolved():
            print(f"Resolved: {event.question} -> {event.winning_outcome}")

await trader.market_ws.connect()
await trader.market_ws.subscribe([market.up_token_id], on_market_event)
await trader.market_ws.run()

User WebSocket

Subscribe to authenticated user events (orders and trades) for specific market IDs.

from polytrader import UserOrder, UserTrade

def on_user_event(event):
    match event:
        case UserOrder():
            print(f"Order {event.id}: {event.side} {event.original_size} @ {event.price}")
            print(f"Status: {event.status}, Filled: {event.fill_ratio:.0%}")
        case UserTrade():
            print(f"Trade {event.id}: {event.side} {event.size} @ {event.price}")
            print(f"Fee: {event.fee}, Net: {event.net_size}")
            print(f"Role: {event.trader_side}")

await trader.user_ws.connect()
await trader.user_ws.subscribe([market.condition_id], on_user_event)
await trader.user_ws.run()

Managing Subscriptions

# Subscribe to multiple assets/markets
await trader.market_ws.subscribe(
    [market.up_token_id, market.down_token_id],
    on_market_event,
)

# Unsubscribe
await trader.market_ws.unsubscribe([market.up_token_id])

# Disconnect
await trader.market_ws.disconnect()

Connection Lifecycle

WebSockets support async context managers:

async with trader.market_ws:
    await trader.market_ws.subscribe([token_id], callback)
    await trader.market_ws.run()
# Automatically disconnected

Note

WebSocket connections automatically handle ping/pong keepalive messages every 10 seconds.