Skip to main content
public class ExchangeSocketClient : IExchangeSocketClient
ExchangeSocketClient is the primary entry point for WebSocket API access across all supported exchanges. It manages connections and subscriptions and exposes each exchange’s socket client as a typed property.

Constructors

Parameterless

IExchangeSocketClient socketClient = new ExchangeSocketClient();
Creates a new instance with default options for all exchanges.

With per-exchange clients (advanced / DI)

IExchangeSocketClient socketClient = new ExchangeSocketClient(
    asterSocketClient,
    binanceSocketClient,
    // ... one argument per supported exchange
);
Pass pre-configured exchange-specific socket client instances. This is how the dependency injection container wires clients when using AddCryptoClients.

Properties

Connection metrics

PropertyTypeDescription
IncomingKbpsdoubleIncoming data rate in kilobytes per second across all connections
CurrentConnectionsintNumber of active WebSocket connections. A single connection can have multiple subscriptions
CurrentSubscriptionsintTotal number of active subscriptions across all connections

Exchange-specific socket clients

Each property returns the typed interface for that exchange’s WebSocket API.
PropertyTypeExchange
AsterIAsterSocketClientAster (DEX)
BinanceIBinanceSocketClientBinance
BingXIBingXSocketClientBingX
BitfinexIBitfinexSocketClientBitfinex
BitgetIBitgetSocketClientBitget
BitMartIBitMartSocketClientBitMart
BitMEXIBitMEXSocketClientBitMEX
BitstampIBitstampSocketClientBitstamp
BloFinIBloFinSocketClientBloFin
BybitIBybitSocketClientBybit
CoinbaseICoinbaseSocketClientCoinbase
CoinExICoinExSocketClientCoinEx
CoinWICoinWSocketClientCoinW
CryptoComICryptoComSocketClientCrypto.com
DeepCoinIDeepCoinSocketClientDeepCoin
GateIoIGateIoSocketClientGate.io
HTXIHTXSocketClientHTX
HyperLiquidIHyperLiquidSocketClientHyperLiquid (DEX)
KrakenIKrakenSocketClientKraken
KucoinIKucoinSocketClientKucoin
MexcIMexcSocketClientMexc
OKXIOKXSocketClientOKX
PolymarketIPolymarketSocketClientPolymarket
ToobitIToobitSocketClientToobit
UpbitIUpbitSocketClientUpbit
WhiteBitIWhiteBitSocketClientWhiteBit
XTIXTSocketClientXT
Example:
var socketClient = new ExchangeSocketClient();

// Exchange-specific subscription via typed property
await socketClient.Binance.SpotApi.SubscribeToTradeUpdatesAsync(
    "ETHUSDT", data => Console.WriteLine(data.Data.Price));

Credentials

SetApiCredentials(ExchangeCredentials)

void SetApiCredentials(ExchangeCredentials credentials);
credentials
ExchangeCredentials
required
Exchange-specific credential instances. Only exchanges you populate are affected.

SetApiCredentials(string, DynamicCredentials)

void SetApiCredentials(string exchange, DynamicCredentials credentials);
exchange
string
required
The canonical exchange name, e.g. Exchange.Binance.
credentials
DynamicCredentials
required
The credential values for that exchange.

Utility methods

GetSymbolName

string? GetSymbolName(string exchange, SharedSymbol symbol);
Returns the exchange-native symbol string for a SharedSymbol.

GetExchangeSharedClients

IEnumerable<ISharedClient> GetExchangeSharedClients(string exchange, TradingMode? tradingMode = null);
Returns all shared socket interface clients for a given exchange.

Market data subscriptions

All subscription methods follow a consistent two-overload pattern:
  • Single exchange — pass string exchange as the first argument, returns Task<ExchangeResult<UpdateSubscription>>
  • Multi-exchange — omit the exchange argument; pass an optional IEnumerable<string>? exchanges filter, returns Task<ExchangeResult<UpdateSubscription>[]>

SubscribeToAllTickerUpdatesAsync

Subscribe to ticker updates for all symbols on one or many exchanges.
// Single exchange
Task<ExchangeResult<UpdateSubscription>> SubscribeToAllTickerUpdatesAsync(
    string exchange,
    SubscribeAllTickersRequest request,
    Action<DataEvent<SharedSpotTicker[]>> handler,
    CancellationToken ct = default);

// Multi-exchange
Task<ExchangeResult<UpdateSubscription>[]> SubscribeToAllTickerUpdatesAsync(
    SubscribeAllTickersRequest request,
    Action<DataEvent<SharedSpotTicker[]>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);
exchange
string
Single exchange name (single-exchange overload only)
request
SubscribeAllTickersRequest
required
Subscription request
handler
Action<DataEvent<SharedSpotTicker[]>>
required
Callback invoked on each update
exchanges
IEnumerable<string>?
Exchange filter; queries all exchanges when null
ct
CancellationToken
Cancellation token used to stop the subscription

SubscribeToTickerUpdatesAsync

Subscribe to ticker updates for a specific symbol.
Task<ExchangeResult<UpdateSubscription>> SubscribeToTickerUpdatesAsync(
    string exchange,
    SubscribeTickerRequest request,
    Action<DataEvent<SharedSpotTicker>> handler,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToTickerUpdatesAsync(
    SubscribeTickerRequest request,
    Action<DataEvent<SharedSpotTicker>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);
Example:
var socketClient = new ExchangeSocketClient();
var symbol = new SharedSymbol(TradingMode.Spot, "ETH", "USDT");

var subscriptions = await socketClient.SubscribeToTickerUpdatesAsync(
    new SubscribeTickerRequest(symbol),
    data => Console.WriteLine($"{data.Exchange} price: {data.Data.LastPrice}"),
    [Exchange.Binance, Exchange.OKX, Exchange.Bybit]);

SubscribeToTradeUpdatesAsync

Subscribe to public trade updates for a symbol.
Task<ExchangeResult<UpdateSubscription>> SubscribeToTradeUpdatesAsync(
    string exchange,
    SubscribeTradeRequest request,
    Action<DataEvent<SharedTrade[]>> handler,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToTradeUpdatesAsync(
    SubscribeTradeRequest request,
    Action<DataEvent<SharedTrade[]>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);

SubscribeToBookTickerUpdatesAsync

Subscribe to best bid/ask price updates (book ticker) for a symbol.
Task<ExchangeResult<UpdateSubscription>> SubscribeToBookTickerUpdatesAsync(
    string exchange,
    SubscribeBookTickerRequest request,
    Action<DataEvent<SharedBookTicker>> handler,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToBookTickerUpdatesAsync(
    SubscribeBookTickerRequest request,
    Action<DataEvent<SharedBookTicker>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);

SubscribeToKlineUpdatesAsync

Subscribe to candlestick/kline updates for a symbol.
Task<ExchangeResult<UpdateSubscription>> SubscribeToKlineUpdatesAsync(
    string exchange,
    SubscribeKlineRequest request,
    Action<DataEvent<SharedKline>> handler,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToKlineUpdatesAsync(
    SubscribeKlineRequest request,
    Action<DataEvent<SharedKline>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);

SubscribeToOrderBookUpdatesAsync

Subscribe to order book snapshot updates for a symbol.
Task<ExchangeResult<UpdateSubscription>> SubscribeToOrderBookUpdatesAsync(
    string exchange,
    SubscribeOrderBookRequest request,
    Action<DataEvent<SharedOrderBook>> handler,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToOrderBookUpdatesAsync(
    SubscribeOrderBookRequest request,
    Action<DataEvent<SharedOrderBook>> handler,
    IEnumerable<string>? exchanges = null,
    CancellationToken ct = default);

User data subscriptions

User data subscriptions require API credentials. Some exchanges also require a listen key, which you can obtain from the REST client using StartListenKeyAsync.
Pass previously obtained listen keys via the listenKeyResults parameter. If not provided, the socket client will attempt to subscribe without a listen key, which may fail for exchanges that require one.

SubscribeToBalanceUpdatesAsync

Subscribe to user balance updates.
Task<ExchangeResult<UpdateSubscription>> SubscribeToBalanceUpdatesAsync(
    string exchange,
    SubscribeBalancesRequest request,
    Action<DataEvent<SharedBalance[]>> handler,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToBalanceUpdatesAsync(
    SubscribeBalancesRequest request,
    Action<DataEvent<SharedBalance[]>> handler,
    IEnumerable<string>? exchanges = null,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);
request
SubscribeBalancesRequest
required
Subscription request
handler
Action<DataEvent<SharedBalance[]>>
required
Callback invoked on each update
listenKeyResults
ExchangeWebResult<string>[]?
Listen keys obtained from StartListenKeysAsync
ct
CancellationToken
Cancellation token

SubscribeToSpotOrderUpdatesAsync

Subscribe to user spot order updates.
Task<ExchangeResult<UpdateSubscription>> SubscribeToSpotOrderUpdatesAsync(
    string exchange,
    SubscribeSpotOrderRequest request,
    Action<DataEvent<SharedSpotOrder[]>> handler,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToSpotOrderUpdatesAsync(
    SubscribeSpotOrderRequest request,
    Action<DataEvent<SharedSpotOrder[]>> handler,
    IEnumerable<string>? exchanges = null,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

SubscribeToFuturesOrderUpdatesAsync

Subscribe to user futures order updates.
Task<ExchangeResult<UpdateSubscription>> SubscribeToFuturesOrderUpdatesAsync(
    string exchange,
    SubscribeFuturesOrderRequest request,
    Action<DataEvent<SharedFuturesOrder[]>> handler,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToFuturesOrderUpdatesAsync(
    SubscribeFuturesOrderRequest request,
    Action<DataEvent<SharedFuturesOrder[]>> handler,
    IEnumerable<string>? exchanges = null,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

SubscribeToUserTradeUpdatesAsync

Subscribe to user trade execution updates.
Task<ExchangeResult<UpdateSubscription>> SubscribeToUserTradeUpdatesAsync(
    string exchange,
    SubscribeUserTradeRequest request,
    Action<DataEvent<SharedUserTrade[]>> handler,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToUserTradeUpdatesAsync(
    SubscribeUserTradeRequest request,
    Action<DataEvent<SharedUserTrade[]>> handler,
    IEnumerable<string>? exchanges = null,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

SubscribeToPositionUpdatesAsync

Subscribe to user futures position updates.
Task<ExchangeResult<UpdateSubscription>> SubscribeToPositionUpdatesAsync(
    string exchange,
    SubscribePositionRequest request,
    Action<DataEvent<SharedPosition[]>> handler,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Task<ExchangeResult<UpdateSubscription>[]> SubscribeToPositionUpdatesAsync(
    SubscribePositionRequest request,
    Action<DataEvent<SharedPosition[]>> handler,
    IEnumerable<string>? exchanges = null,
    ExchangeWebResult<string>[]? listenKeyResults = null,
    CancellationToken ct = default);

Managing subscriptions

UnsubscribeAllAsync

Close all active subscriptions and WebSocket connections.
Task UnsubscribeAllAsync();
await socketClient.UnsubscribeAllAsync();

Helper methods — getting shared interface clients

These return the typed shared socket interface client for a specific exchange.

Ticker clients

ITickerSocketClient? GetTickerClient(TradingMode tradingMode, string exchange);
IEnumerable<ITickerSocketClient> GetTickerClients();
IEnumerable<ITickerSocketClient> GetTickerClients(TradingMode tradingMode);

ITickersSocketClient? GetTickersClient(TradingMode tradingMode, string exchange);
IEnumerable<ITickersSocketClient> GetTickersClients();
IEnumerable<ITickersSocketClient> GetTickersClients(TradingMode tradingMode);

Trade clients

ITradeSocketClient? GetTradeClient(TradingMode tradingMode, string exchange);
IEnumerable<ITradeSocketClient> GetTradeClients();
IEnumerable<ITradeSocketClient> GetTradeClients(TradingMode tradingMode);

Kline clients

IKlineSocketClient? GetKlineClient(TradingMode tradingMode, string exchange);
IEnumerable<IKlineSocketClient> GetKlineClients();
IEnumerable<IKlineSocketClient> GetKlineClients(TradingMode tradingMode);

Order book clients

IOrderBookSocketClient? GetOrderBookClient(TradingMode tradingMode, string exchange);
IEnumerable<IOrderBookSocketClient> GetOrderBookClients();
IEnumerable<IOrderBookSocketClient> GetOrderBookClients(TradingMode tradingMode);

Book ticker clients

IBookTickerSocketClient? GetBookTickerClient(TradingMode tradingMode, string exchange);
IEnumerable<IBookTickerSocketClient> GetBookTickerClients();
IEnumerable<IBookTickerSocketClient> GetBookTickerClients(TradingMode tradingMode);

Balance clients

IBalanceSocketClient? GetBalanceClient(TradingMode tradingMode, string exchange);
IEnumerable<IBalanceSocketClient> GetBalanceClients();
IEnumerable<IBalanceSocketClient> GetBalanceClients(TradingMode tradingMode);

Order clients

ISpotOrderSocketClient? GetSpotOrderClient(string exchange);
IEnumerable<ISpotOrderSocketClient> GetSpotOrderClients();

IFuturesOrderSocketClient? GetFuturesOrderClient(TradingMode tradingMode, string exchange);
IEnumerable<IFuturesOrderSocketClient> GetFuturesOrderClients();
IEnumerable<IFuturesOrderSocketClient> GetFuturesOrderClients(TradingMode tradingMode);

User trade and position clients

IUserTradeSocketClient? GetUserTradeClient(TradingMode tradingMode, string exchange);
IEnumerable<IUserTradeSocketClient> GetUserTradeClients();
IEnumerable<IUserTradeSocketClient> GetUserTradeClients(TradingMode tradingMode);

IPositionSocketClient? GetPositionClient(TradingMode tradingMode, string exchange);
IEnumerable<IPositionSocketClient> GetPositionClients();
IEnumerable<IPositionSocketClient> GetPositionClients(TradingMode tradingMode);

Build docs developers (and LLMs) love