Skip to main content
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.
PropertyTypeExchange
AsterIAsterRestClientAster (DEX)
BinanceIBinanceRestClientBinance
BingXIBingXRestClientBingX
BitfinexIBitfinexRestClientBitfinex
BitgetIBitgetRestClientBitget
BitMartIBitMartRestClientBitMart
BitMEXIBitMEXRestClientBitMEX
BitstampIBitstampRestClientBitstamp
BloFinIBloFinRestClientBloFin
BybitIBybitRestClientBybit
CoinbaseICoinbaseRestClientCoinbase
CoinExICoinExRestClientCoinEx
CoinWICoinWRestClientCoinW
CryptoComICryptoComRestClientCrypto.com
DeepCoinIDeepCoinRestClientDeepCoin
GateIoIGateIoRestClientGate.io
HTXIHTXRestClientHTX
HyperLiquidIHyperLiquidRestClientHyperLiquid (DEX)
KrakenIKrakenRestClientKraken
KucoinIKucoinRestClientKucoin
MexcIMexcRestClientMexc
OKXIOKXRestClientOKX
PolymarketIPolymarketRestClientPolymarket
ToobitIToobitRestClientToobit
UpbitIUpbitRestClientUpbit
WhiteBitIWhiteBitRestClientWhiteBit
XTIXTRestClientXT
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);
exchange
string
required
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);
exchange
string
required
The canonical exchange name.
symbol
SharedSymbol
required
The shared symbol (e.g. new SharedSymbol(TradingMode.Spot, "ETH", "USDT")).
return
string?
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);
tradingMode
TradingMode
required
Spot, PerpetualLinear, PerpetualInverse, etc.
exchange
string
required
The canonical exchange name.
return
string?
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 exchangeGet...Async(string exchange, Request, ...) returns ExchangeWebResult<T>
  • Multi-exchange async enumerableGet...AsyncEnumerable(Request, ...) yields results as each exchange responds
  • Multi-exchange arrayGet...Async(Request, ...) waits for all exchanges and returns ExchangeWebResult<T>[]

GetSpotTickerAsync

Task<ExchangeWebResult<SharedSpotTicker>> GetSpotTickerAsync(
    string exchange,
    GetTickerRequest request,
    CancellationToken ct = default);
exchange
string
required
Exchange name
request
GetTickerRequest
required
Contains the SharedSymbol to query
ct
CancellationToken
Cancellation token
var symbol = new SharedSymbol(TradingMode.Spot, "ETH", "USDT");
var result = await client.GetSpotTickerAsync("Binance", new GetTickerRequest(symbol));
Console.WriteLine(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);
pageRequest
PageRequest?
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:
  • IAssetsRestClientGetAssetClient / GetAssetsClients
  • IDepositRestClientGetDepositsClient / GetDepositsClients
  • IWithdrawalRestClientGetWithdrawalsClient / GetWithdrawalsClients
  • IWithdrawRestClientGetWithdrawClient / GetWithdrawClients
  • IRecentTradeRestClientGetRecentTradesClient / GetRecentTradesClients
  • ITradeHistoryRestClientGetTradeHistoryClient / GetTradeHistoryClients
  • IBookTickerRestClientGetBookTickerClient / GetBookTickerClients
  • IFundingRateRestClientGetFundingRateClient / GetFundingRateClients
  • IOpenInterestRestClientGetOpenInterestClient / GetOpenInterestClients
  • ILeverageRestClientGetLeverageClient / GetLeverageClients
  • IPositionModeRestClientGetPositionModeClient / GetPositionModeClients
  • IPositionHistoryRestClientGetPositionHistoryClient / GetPositionHistoryClients
  • IFeeRestClientGetFeeClient / GetFeeClients
  • ISpotSymbolRestClientGetSpotSymbolClient / GetSpotSymbolClients
  • IFuturesSymbolRestClientGetFuturesSymbolClient / 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);

Build docs developers (and LLMs) love