public class ExchangeRestClient : IExchangeRestClient
ExchangeRestClient is the primary entry point for REST API access across all supported exchanges. It exposes individual exchange clients as properties and provides cross-exchange methods for querying market data and managing orders through a unified shared interface.
Constructors
Parameterless
IExchangeRestClient client = new ExchangeRestClient();
Creates a new instance with default options for all exchanges. This is the simplest way to get started.
With per-exchange clients (advanced / DI)
IExchangeRestClient client = new ExchangeRestClient(
asterClient,
binanceClient,
bybitClient,
// ... one argument per supported exchange
);
Pass pre-configured exchange-specific client instances. This is how the dependency injection container wires clients when using AddCryptoClients.
Properties
TotalRequestsMade
int TotalRequestsMade { get; }
The total number of HTTP requests made across all exchange clients since this instance was created.
Exchange-specific clients
Each property returns the typed interface for that exchange’s REST API. Use these when you need to call exchange-specific endpoints that are not covered by the shared interface.
| Property | Type | Exchange |
|---|
Aster | IAsterRestClient | Aster (DEX) |
Binance | IBinanceRestClient | Binance |
BingX | IBingXRestClient | BingX |
Bitfinex | IBitfinexRestClient | Bitfinex |
Bitget | IBitgetRestClient | Bitget |
BitMart | IBitMartRestClient | BitMart |
BitMEX | IBitMEXRestClient | BitMEX |
Bitstamp | IBitstampRestClient | Bitstamp |
BloFin | IBloFinRestClient | BloFin |
Bybit | IBybitRestClient | Bybit |
Coinbase | ICoinbaseRestClient | Coinbase |
CoinEx | ICoinExRestClient | CoinEx |
CoinW | ICoinWRestClient | CoinW |
CryptoCom | ICryptoComRestClient | Crypto.com |
DeepCoin | IDeepCoinRestClient | DeepCoin |
GateIo | IGateIoRestClient | Gate.io |
HTX | IHTXRestClient | HTX |
HyperLiquid | IHyperLiquidRestClient | HyperLiquid (DEX) |
Kraken | IKrakenRestClient | Kraken |
Kucoin | IKucoinRestClient | Kucoin |
Mexc | IMexcRestClient | Mexc |
OKX | IOKXRestClient | OKX |
Polymarket | IPolymarketRestClient | Polymarket |
Toobit | IToobitRestClient | Toobit |
Upbit | IUpbitRestClient | Upbit |
WhiteBit | IWhiteBitRestClient | WhiteBit |
XT | IXTRestClient | XT |
The CoinGecko property (ICoinGeckoRestClient) is available on the concrete ExchangeRestClient class but not declared on the IExchangeRestClient interface. Access it by using the concrete type directly: ((ExchangeRestClient)client).CoinGecko.
Example:
var client = new ExchangeRestClient();
// Exchange-specific call via typed property
var ticker = await client.Binance.SpotApi.ExchangeData.GetTickerAsync("ETHUSDT");
var kucoinTicker = await client.Kucoin.SpotApi.ExchangeData.GetTickerAsync("ETH-USDT");
Credentials
SetApiCredentials(ExchangeCredentials)
Set credentials for one or more exchanges at once using a typed ExchangeCredentials object.
void SetApiCredentials(ExchangeCredentials credentials);
credentials
ExchangeCredentials
required
An object containing exchange-specific credential instances. Only the exchanges you populate will be affected.
client.SetApiCredentials(new ExchangeCredentials
{
Binance = new BinanceCredentials("myKey", "mySecret"),
OKX = new OKXCredentials("myKey", "mySecret", "myPassphrase")
});
SetApiCredentials(string, DynamicCredentials)
Set credentials for a single exchange using dynamic (runtime-supplied) credentials.
void SetApiCredentials(string exchange, DynamicCredentials credentials);
The canonical exchange name, e.g. Exchange.Binance.
credentials
DynamicCredentials
required
The credential values. Use ExchangeCredentials.GetDynamicCredentialInfo to discover what fields are required.
Utility methods
GetSymbolName
Returns the exchange-specific symbol string for a given SharedSymbol.
string? GetSymbolName(string exchange, SharedSymbol symbol);
The canonical exchange name.
The shared symbol (e.g. new SharedSymbol(TradingMode.Spot, "ETH", "USDT")).
The exchange-native symbol name (e.g. "ETHUSDT" for Binance, "ETH-USDT" for Kucoin), or null if not supported.
GenerateClientOrderId
Generates a random client order ID suitable for the specified exchange and trading mode.
string? GenerateClientOrderId(TradingMode tradingMode, string exchange);
Spot, PerpetualLinear, PerpetualInverse, etc.
The canonical exchange name.
A newly generated client order ID string, or null if not supported for this exchange.
GetExchangeSharedClients
Returns all shared interface clients available for a given exchange, optionally filtered by trading mode.
IEnumerable<ISharedClient> GetExchangeSharedClients(string exchange, TradingMode? tradingMode = null);
Market data methods
All multi-exchange data methods follow a consistent pattern:
- Single exchange —
Get...Async(string exchange, Request, ...) returns ExchangeWebResult<T>
- Multi-exchange async enumerable —
Get...AsyncEnumerable(Request, ...) yields results as each exchange responds
- Multi-exchange array —
Get...Async(Request, ...) waits for all exchanges and returns ExchangeWebResult<T>[]
GetSpotTickerAsync
Task<ExchangeWebResult<SharedSpotTicker>> GetSpotTickerAsync(
string exchange,
GetTickerRequest request,
CancellationToken ct = default);
Contains the SharedSymbol to query
var symbol = new SharedSymbol(TradingMode.Spot, "ETH", "USDT");
var result = await client.GetSpotTickerAsync("Binance", new GetTickerRequest(symbol));
Console.WriteLine(result.Data.LastPrice);
IAsyncEnumerable<ExchangeWebResult<SharedSpotTicker>> GetSpotTickerAsyncEnumerable(
GetTickerRequest request,
IEnumerable<string>? exchanges = null,
CancellationToken ct = default);
Exchange filter; queries all exchanges when null
await foreach (var result in client.GetSpotTickerAsyncEnumerable(
new GetTickerRequest(symbol),
[Exchange.Binance, Exchange.Bybit, Exchange.OKX]))
{
Console.WriteLine($"{result.Exchange}: {result.Data?.LastPrice}");
}
Task<ExchangeWebResult<SharedSpotTicker>[]> GetSpotTickerAsync(
GetTickerRequest request,
IEnumerable<string>? exchanges = null,
CancellationToken ct = default);
Exchange filter; queries all exchanges when null
var results = await client.GetSpotTickerAsync(
new GetTickerRequest(symbol),
[Exchange.Binance, Exchange.Kucoin, Exchange.OKX]);
foreach (var result in results)
Console.WriteLine($"{result.Exchange}: {result.Data?.LastPrice}");
GetSpotTickersAsync
Retrieves all spot tickers for every symbol on an exchange (or all exchanges).
// Single exchange — all symbols
Task<ExchangeWebResult<SharedSpotTicker[]>> GetSpotTickerAsync(
string exchange, GetTickersRequest request, CancellationToken ct = default);
// Multi-exchange async enumerable
IAsyncEnumerable<ExchangeWebResult<SharedSpotTicker[]>> GetSpotTickersAsyncEnumerable(
GetTickersRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
// Multi-exchange array
Task<ExchangeWebResult<SharedSpotTicker[]>[]> GetSpotTickersAsync(
GetTickersRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetFuturesTickerAsync
Retrieves futures ticker data for a single symbol.
// Single exchange
Task<ExchangeWebResult<SharedFuturesTicker>> GetFuturesTickerAsync(
string exchange, GetTickerRequest request, CancellationToken ct = default);
// Multi-exchange async enumerable
IAsyncEnumerable<ExchangeWebResult<SharedFuturesTicker>> GetFuturesTickerAsyncEnumerable(
GetTickerRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
// Multi-exchange array
Task<ExchangeWebResult<SharedFuturesTicker>[]> GetFuturesTickerAsync(
GetTickerRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetFuturesTickersAsync
Retrieves all futures tickers on an exchange.
Task<ExchangeWebResult<SharedFuturesTicker[]>> GetFuturesTickersAsync(
string exchange, GetTickersRequest request, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedFuturesTicker[]>> GetFuturesTickersAsyncEnumerable(
GetTickersRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedFuturesTicker[]>[]> GetFuturesTickersAsync(
GetTickersRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetKlinesAsync
// Single exchange (supports pagination via pageRequest)
Task<ExchangeWebResult<SharedKline[]>> GetKlinesAsync(
string exchange,
GetKlinesRequest request,
PageRequest? pageRequest = null,
CancellationToken ct = default);
// Multi-exchange async enumerable
IAsyncEnumerable<ExchangeWebResult<SharedKline[]>> GetKlinesAsyncEnumerable(
GetKlinesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
// Multi-exchange array
Task<ExchangeWebResult<SharedKline[]>[]> GetKlinesAsync(
GetKlinesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Pass the NextPageRequest property from a previous result to continue paginating.
GetMarkPriceKlinesAsync / GetIndexPriceKlinesAsync
Mark price and index price klines follow the same three-overload pattern as GetKlinesAsync, returning SharedFuturesKline[] instead of SharedKline[].
Task<ExchangeWebResult<SharedFuturesKline[]>> GetMarkPriceKlinesAsync(
string exchange, GetKlinesRequest request, PageRequest? pageRequest = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedFuturesKline[]>> GetIndexPriceKlinesAsync(
string exchange, GetKlinesRequest request, PageRequest? pageRequest = null, CancellationToken ct = default);
GetRecentTradesAsync
Task<ExchangeWebResult<SharedTrade[]>> GetRecentTradesAsync(
string exchange, GetRecentTradesRequest request, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedTrade[]>> GetRecentTradesAsyncEnumerable(
GetRecentTradesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedTrade[]>[]> GetRecentTradesAsync(
GetRecentTradesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetTradeHistoryAsync
Task<ExchangeWebResult<SharedTrade[]>> GetTradeHistoryAsync(
string exchange, GetTradeHistoryRequest request, PageRequest? pageRequest = null, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedTrade[]>> GetTradeHistoryAsyncEnumerable(
GetTradeHistoryRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedTrade[]>[]> GetTradeHistoryAsync(
GetTradeHistoryRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetOrderBookAsync
Task<ExchangeWebResult<SharedOrderBook>> GetOrderBookAsync(
string exchange, GetOrderBookRequest request, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedOrderBook>> GetOrderBookAsyncEnumerable(
GetOrderBookRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedOrderBook>[]> GetOrderBookAsync(
GetOrderBookRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
GetBookTickerAsync
Task<ExchangeWebResult<SharedBookTicker>> GetBookTickerAsync(
string exchange, GetBookTickerRequest request, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedBookTicker>> GetBookTickersAsyncEnumerable(
GetBookTickerRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedBookTicker>[]> GetBookTickersAsync(
GetBookTickerRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
User data methods
These methods require API credentials to be set.
GetBalancesAsync
Task<ExchangeWebResult<SharedBalance[]>> GetBalancesAsync(
string exchange, GetBalancesRequest request, CancellationToken ct = default);
IAsyncEnumerable<ExchangeWebResult<SharedBalance[]>> GetBalancesAsyncEnumerable(
GetBalancesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedBalance[]>[]> GetBalancesAsync(
GetBalancesRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
PlaceSpotOrderAsync
Task<ExchangeWebResult<SharedId>> PlaceSpotOrderAsync(
string exchange, PlaceSpotOrderRequest request, CancellationToken ct = default);
GetSpotOrderAsync / GetSpotOpenOrdersAsync / GetSpotClosedOrdersAsync / CancelSpotOrderAsync
Task<ExchangeWebResult<SharedSpotOrder>> GetSpotOrderAsync(
string exchange, GetOrderRequest request, CancellationToken ct = default);
Task<ExchangeWebResult<SharedSpotOrder[]>> GetSpotOpenOrdersAsync(
string exchange, GetOpenOrdersRequest request, CancellationToken ct = default);
Task<ExchangeWebResult<SharedSpotOrder[]>> GetSpotClosedOrdersAsync(
string exchange, GetClosedOrdersRequest request, PageRequest? pageRequest = null, CancellationToken ct = default);
Task<ExchangeWebResult<SharedId>> CancelSpotOrderAsync(
string exchange, CancelOrderRequest request, CancellationToken ct = default);
PlaceFuturesOrderAsync
Task<ExchangeWebResult<SharedId>> PlaceFuturesOrderAsync(
string exchange, PlaceFuturesOrderRequest request, CancellationToken ct = default);
GetPositionsAsync / ClosePositionAsync
Task<ExchangeWebResult<SharedPosition[]>> GetPositionsAsync(
string exchange, GetPositionsRequest request, CancellationToken ct = default);
Task<ExchangeWebResult<SharedId>> ClosePositionAsync(
string exchange, ClosePositionRequest request, CancellationToken ct = default);
GetFeesAsync
Task<ExchangeWebResult<SharedFee>> GetFeesAsync(
string exchange, GetFeeRequest request, CancellationToken ct = default);
Listen key management
Some exchanges require a listen key to subscribe to user data over WebSocket.
Task<ExchangeWebResult<string>> StartListenKeyAsync(
string exchange, StartListenKeyRequest request, CancellationToken ct = default);
Task<ExchangeWebResult<string>> KeepAliveListenKeyAsync(
string exchange, KeepAliveListenKeyRequest request, CancellationToken ct = default);
Task<ExchangeWebResult<string>> StopListenKeyAsync(
string exchange, StopListenKeyRequest request, CancellationToken ct = default);
// Multi-exchange variants
Task<ExchangeWebResult<string>[]> StartListenKeysAsync(
StartListenKeyRequest request, IEnumerable<string>? exchanges = null, CancellationToken ct = default);
Helper methods — getting shared interface clients
These methods return the typed shared interface client for a specific exchange. Useful when you want to call a shared interface method directly without going through the multi-exchange overloads.
Spot ticker
ISpotTickerRestClient? GetSpotTickerClient(string exchange);
IEnumerable<ISpotTickerRestClient> GetSpotTickerClients();
Spot orders
ISpotOrderRestClient? GetSpotOrderClient(string exchange);
IEnumerable<ISpotOrderRestClient> GetSpotOrderClients();
Futures tickers
IFuturesTickerRestClient? GetFuturesTickerClient(TradingMode tradingMode, string exchange);
IEnumerable<IFuturesTickerRestClient> GetFuturesTickerClients();
IEnumerable<IFuturesTickerRestClient> GetFuturesTickerClients(TradingMode tradingMode);
Futures orders
IFuturesOrderRestClient? GetFuturesOrderClient(TradingMode tradingMode, string exchange);
IEnumerable<IFuturesOrderRestClient> GetFuturesOrderClients();
IEnumerable<IFuturesOrderRestClient> GetFuturesOrderClients(TradingMode tradingMode);
Klines
IKlineRestClient? GetKlineClient(TradingMode tradingMode, string exchange);
IEnumerable<IKlineRestClient> GetKlineClients();
IEnumerable<IKlineRestClient> GetKlineClients(TradingMode tradingMode);
Order book
IOrderBookRestClient? GetOrderBookClient(TradingMode tradingMode, string exchange);
IEnumerable<IOrderBookRestClient> GetOrderBookClients();
IEnumerable<IOrderBookRestClient> GetOrderBookClients(TradingMode tradingMode);
Balances
IBalanceRestClient? GetBalancesClient(TradingMode tradingMode, string exchange);
IEnumerable<IBalanceRestClient> GetBalancesClients();
IEnumerable<IBalanceRestClient> GetBalancesClients(TradingMode tradingMode);
Other shared clients
The following shared clients are also available via the same GetXxxClient / GetXxxClients pattern:
IAssetsRestClient — GetAssetClient / GetAssetsClients
IDepositRestClient — GetDepositsClient / GetDepositsClients
IWithdrawalRestClient — GetWithdrawalsClient / GetWithdrawalsClients
IWithdrawRestClient — GetWithdrawClient / GetWithdrawClients
IRecentTradeRestClient — GetRecentTradesClient / GetRecentTradesClients
ITradeHistoryRestClient — GetTradeHistoryClient / GetTradeHistoryClients
IBookTickerRestClient — GetBookTickerClient / GetBookTickerClients
IFundingRateRestClient — GetFundingRateClient / GetFundingRateClients
IOpenInterestRestClient — GetOpenInterestClient / GetOpenInterestClients
ILeverageRestClient — GetLeverageClient / GetLeverageClients
IPositionModeRestClient — GetPositionModeClient / GetPositionModeClients
IPositionHistoryRestClient — GetPositionHistoryClient / GetPositionHistoryClients
IFeeRestClient — GetFeeClient / GetFeeClients
ISpotSymbolRestClient — GetSpotSymbolClient / GetSpotSymbolClients
IFuturesSymbolRestClient — GetFuturesSymbolClient / GetFuturesSymbolClients
Example — using a typed shared client directly:
var client = new ExchangeRestClient();
var spotTickerClient = client.GetSpotTickerClient("Kraken")!;
var result = await spotTickerClient.GetSpotTickerAsync(
new GetTickerRequest(new SharedSymbol(TradingMode.Spot, "ETH", "BTC")));
Console.WriteLine(result.Data.LastPrice);
Symbol discovery
// Find all exchanges that list a spot symbol by name
Task<string[]> GetExchangesSupportingSpotSymbolAsync(string symbolName);
Task<string[]> GetExchangesSupportingSpotSymbolAsync(SharedSymbol symbol);
// Check if a specific exchange supports a symbol
Task<ExchangeResult<bool>> SupportsSpotSymbolAsync(string exchange, SharedSymbol symbol);
// Get all spot symbols for a base asset
Task<Dictionary<string, SharedSymbol[]>> GetSpotSymbolsForBaseAssetAsync(string baseAsset);
Task<ExchangeResult<SharedSymbol[]>> GetSpotSymbolsForBaseAssetAsync(string exchange, string baseAsset);
// Futures equivalents
Task<string[]> GetExchangesSupportingFuturesSymbolAsync(string symbolName);
Task<ExchangeResult<bool>> SupportsFuturesSymbolAsync(string exchange, SharedSymbol symbol);
Task<Dictionary<string, SharedSymbol[]>> GetFuturesSymbolsForBaseAssetAsync(string baseAsset);