Loading...
Loading...
CCXT cryptocurrency exchange library for TypeScript and JavaScript developers (Node.js and browser). Covers both REST API (standard) and WebSocket API (real-time). Helps install CCXT, connect to exchanges, fetch market data, place orders, stream live tickers/orderbooks, handle authentication, and manage errors. Use when working with crypto exchanges in TypeScript/JavaScript projects, trading bots, arbitrage systems, or portfolio management tools. Includes both REST and WebSocket examples.
npx skill4agent add ccxt/ccxt ccxt-typescriptnpm install ccxtnpm install ccxtimport ccxt from 'ccxt'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)const ccxt = require('ccxt')
(async () => {
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
})()import ccxt from 'ccxt'
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker) // Live updates!
}
await exchange.close()| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | | |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Import | | |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
// Public API (no authentication)
const exchange = new ccxt.binance({
enableRateLimit: true // Recommended!
})
// Private API (with authentication)
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})// Public WebSocket
const exchange = new ccxt.pro.binance()
// Private WebSocket (with authentication)
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
// Always close when done
await exchange.close()// Load all available trading pairs
await exchange.loadMarkets()
// Access market information
const btcMarket = exchange.market('BTC/USDT')
console.log(btcMarket.limits.amount.min) // Minimum order amount// Single ticker
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // Last price
console.log(ticker.bid) // Best bid
console.log(ticker.ask) // Best ask
console.log(ticker.volume) // 24h volume
// Multiple tickers (if supported)
const tickers = await exchange.fetchTickers(['BTC/USDT', 'ETH/USDT'])// Full orderbook
const orderbook = await exchange.fetchOrderBook('BTC/USDT')
console.log(orderbook.bids[0]) // [price, amount]
console.log(orderbook.asks[0]) // [price, amount]
// Limited depth
const orderbook = await exchange.fetchOrderBook('BTC/USDT', 5) // Top 5 levels// Buy limit order
const order = await exchange.createLimitBuyOrder('BTC/USDT', 0.01, 50000)
console.log(order.id)
// Sell limit order
const order = await exchange.createLimitSellOrder('BTC/USDT', 0.01, 60000)
// Generic limit order
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)// Buy market order
const order = await exchange.createMarketBuyOrder('BTC/USDT', 0.01)
// Sell market order
const order = await exchange.createMarketSellOrder('BTC/USDT', 0.01)
// Generic market order
const order = await exchange.createOrder('BTC/USDT', 'market', 'sell', 0.01)const balance = await exchange.fetchBalance()
console.log(balance.BTC.free) // Available balance
console.log(balance.BTC.used) // Balance in orders
console.log(balance.BTC.total) // Total balance// Open orders
const openOrders = await exchange.fetchOpenOrders('BTC/USDT')
// Closed orders
const closedOrders = await exchange.fetchClosedOrders('BTC/USDT')
// All orders (open + closed)
const allOrders = await exchange.fetchOrders('BTC/USDT')
// Single order by ID
const order = await exchange.fetchOrder(orderId, 'BTC/USDT')// Recent public trades
const trades = await exchange.fetchTrades('BTC/USDT', undefined, 10)
// Your trades (requires authentication)
const myTrades = await exchange.fetchMyTrades('BTC/USDT')// Cancel single order
await exchange.cancelOrder(orderId, 'BTC/USDT')
// Cancel all orders for a symbol
await exchange.cancelAllOrders('BTC/USDT')const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker.last, ticker.timestamp)
}
await exchange.close()const exchange = new ccxt.pro.binance()
while (true) {
const orderbook = await exchange.watchOrderBook('BTC/USDT')
console.log('Best bid:', orderbook.bids[0])
console.log('Best ask:', orderbook.asks[0])
}
await exchange.close()const exchange = new ccxt.pro.binance()
while (true) {
const trades = await exchange.watchTrades('BTC/USDT')
for (const trade of trades) {
console.log(trade.price, trade.amount, trade.side)
}
}
await exchange.close()const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const orders = await exchange.watchOrders('BTC/USDT')
for (const order of orders) {
console.log(order.id, order.status, order.filled)
}
}
await exchange.close()const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const balance = await exchange.watchBalance()
console.log('BTC:', balance.BTC)
console.log('USDT:', balance.USDT)
}
await exchange.close()const exchange = new ccxt.pro.binance()
const symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT']
while (true) {
// Watch all symbols concurrently
const tickers = await exchange.watchTickers(symbols)
for (const symbol in tickers) {
console.log(symbol, tickers[symbol].last)
}
}
await exchange.close()fetchTicker(symbol)fetchTickers([symbols])fetchBidsAsks([symbols])fetchLastPrices([symbols])fetchMarkPrices([symbols])fetchOrderBook(symbol, limit)fetchOrderBooks([symbols])fetchL2OrderBook(symbol)fetchL3OrderBook(symbol)fetchTrades(symbol, since, limit)fetchMyTrades(symbol, since, limit)fetchOrderTrades(orderId, symbol)fetchOHLCV(symbol, timeframe, since, limit)fetchIndexOHLCV(symbol, timeframe)fetchMarkOHLCV(symbol, timeframe)fetchPremiumIndexOHLCV(symbol, timeframe)fetchBalance()fetchAccounts()fetchLedger(code, since, limit)fetchLedgerEntry(id, code)fetchTransactions(code, since, limit)fetchDeposits(code, since, limit)fetchWithdrawals(code, since, limit)fetchDepositsWithdrawals(code, since, limit)createOrder(symbol, type, side, amount, price, params)createLimitOrder(symbol, side, amount, price)createMarketOrder(symbol, side, amount)createLimitBuyOrder(symbol, amount, price)createLimitSellOrder(symbol, amount, price)createMarketBuyOrder(symbol, amount)createMarketSellOrder(symbol, amount)createMarketBuyOrderWithCost(symbol, cost)createStopLimitOrder(symbol, side, amount, price, stopPrice)createStopMarketOrder(symbol, side, amount, stopPrice)createStopLossOrder(symbol, side, amount, stopPrice)createTakeProfitOrder(symbol, side, amount, takeProfitPrice)createTrailingAmountOrder(symbol, side, amount, trailingAmount)createTrailingPercentOrder(symbol, side, amount, trailingPercent)createTriggerOrder(symbol, side, amount, triggerPrice)createPostOnlyOrder(symbol, side, amount, price)createReduceOnlyOrder(symbol, side, amount, price)createOrders([orders])createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)fetchOrder(orderId, symbol)fetchOrders(symbol, since, limit)fetchOpenOrders(symbol, since, limit)fetchClosedOrders(symbol, since, limit)fetchCanceledOrders(symbol, since, limit)fetchOpenOrder(orderId, symbol)fetchOrdersByStatus(status, symbol)cancelOrder(orderId, symbol)cancelOrders([orderIds], symbol)cancelAllOrders(symbol)editOrder(orderId, symbol, type, side, amount, price)fetchBorrowRate(code)fetchBorrowRates([codes])fetchBorrowRateHistory(code, since, limit)fetchCrossBorrowRate(code)fetchIsolatedBorrowRate(symbol, code)borrowMargin(code, amount, symbol)repayMargin(code, amount, symbol)fetchLeverage(symbol)setLeverage(leverage, symbol)fetchLeverageTiers(symbols)fetchMarketLeverageTiers(symbol)setMarginMode(marginMode, symbol)fetchMarginMode(symbol)fetchPosition(symbol)fetchPositions([symbols])fetchPositionsForSymbol(symbol)fetchPositionHistory(symbol, since, limit)fetchPositionsHistory(symbols, since, limit)fetchPositionMode(symbol)setPositionMode(hedged, symbol)closePosition(symbol, side)closeAllPositions()fetchFundingRate(symbol)fetchFundingRates([symbols])fetchFundingRateHistory(symbol, since, limit)fetchFundingHistory(symbol, since, limit)fetchFundingInterval(symbol)fetchSettlementHistory(symbol, since, limit)fetchMySettlementHistory(symbol, since, limit)fetchOpenInterest(symbol)fetchOpenInterests([symbols])fetchOpenInterestHistory(symbol, timeframe, since, limit)fetchLiquidations(symbol, since, limit)fetchMyLiquidations(symbol, since, limit)fetchOption(symbol)fetchOptionChain(code)fetchGreeks(symbol)fetchVolatilityHistory(code, since, limit)fetchUnderlyingAssets()fetchTradingFee(symbol)fetchTradingFees([symbols])fetchTradingLimits([symbols])fetchTransactionFee(code)fetchTransactionFees([codes])fetchDepositWithdrawFee(code)fetchDepositWithdrawFees([codes])fetchDepositAddress(code, params)fetchDepositAddresses([codes])fetchDepositAddressesByNetwork(code)createDepositAddress(code, params)fetchDeposit(id, code)fetchWithdrawal(id, code)fetchWithdrawAddresses(code)fetchWithdrawalWhitelist(code)withdraw(code, amount, address, tag, params)deposit(code, amount, params)transfer(code, amount, fromAccount, toAccount)fetchTransfer(id, code)fetchTransfers(code, since, limit)fetchConvertCurrencies()fetchConvertQuote(fromCode, toCode, amount)createConvertTrade(fromCode, toCode, amount)fetchConvertTrade(id)fetchConvertTradeHistory(code, since, limit)fetchMarkets()fetchCurrencies()fetchTime()fetchStatus()fetchBorrowInterest(code, symbol, since, limit)fetchLongShortRatio(symbol, timeframe, since, limit)fetchLongShortRatioHistory(symbol, timeframe, since, limit)watch*watchTicker(symbol)watchTickers([symbols])watchOrderBook(symbol)watchOrderBookForSymbols([symbols])watchTrades(symbol)watchOHLCV(symbol, timeframe)watchBidsAsks([symbols])watchBalance()watchOrders(symbol)watchMyTrades(symbol)watchPositions([symbols])watchPositionsForSymbol(symbol)create*cancel*edit*fetchMy*fetchBalancefetchLedgerfetchAccountswithdrawtransferdepositwatchBalancewatchOrderswatchMyTradeswatchPositions// Check if method is supported
if (exchange.has['fetchOHLCV']) {
const candles = await exchange.fetchOHLCV('BTC/USDT', '1h')
}
// Check multiple capabilities
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOHLCV: true,
// fetchMyTrades: true,
// fetchPositions: false,
// ...
// }fetch*watch*create*cancel*edit*set**Ws// HTTP Proxy
exchange.httpProxy = 'http://your-proxy-host:port'
// HTTPS Proxy
exchange.httpsProxy = 'https://your-proxy-host:port'
// SOCKS Proxy
exchange.socksProxy = 'socks://your-proxy-host:port'
// Proxy with authentication
exchange.httpProxy = 'http://user:pass@proxy-host:port'exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxyexchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}*WscreateOrderWscreateLimitOrderWscreateMarketOrderWscreateLimitBuyOrderWscreateLimitSellOrderWscreateMarketBuyOrderWscreateMarketSellOrderWscreateStopLimitOrderWscreateStopMarketOrderWscreateStopLossOrderWscreateTakeProfitOrderWscreateTrailingAmountOrderWscreateTrailingPercentOrderWscreatePostOnlyOrderWscreateReduceOnlyOrderWseditOrderWscancelOrderWscancelOrdersWscancelAllOrdersWsfetchOrderWsfetchOrdersWsfetchOpenOrdersWsfetchClosedOrdersWsfetchMyTradesWsfetchBalanceWsfetchPositionWsfetchPositionsWsfetchPositionsForSymbolWsfetchTradingFeesWs*Wsconst order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)if (exchange.has['createOrderWs']) {
// Exchange supports WebSocket order creation
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} else {
// Fall back to REST
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
}// During instantiation
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})
// After instantiation
exchange.apiKey = 'YOUR_API_KEY'
exchange.secret = 'YOUR_SECRET'const exchange = new ccxt.binance({
apiKey: process.env.BINANCE_API_KEY,
secret: process.env.BINANCE_SECRET,
enableRateLimit: true
})try {
const balance = await exchange.fetchBalance()
console.log('Authentication successful!')
} catch (error) {
if (error instanceof ccxt.AuthenticationError) {
console.error('Invalid API credentials')
}
}BaseError
├─ NetworkError (recoverable - retry)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (non-recoverable - don't retry)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupportedimport ccxt from 'ccxt'
try {
const ticker = await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError) {
console.error('Network error - retry:', error.message)
} else if (error instanceof ccxt.ExchangeError) {
console.error('Exchange error - do not retry:', error.message)
} else {
console.error('Unknown error:', error)
}
}try {
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} catch (error) {
if (error instanceof ccxt.InsufficientFunds) {
console.error('Not enough balance')
} else if (error instanceof ccxt.InvalidOrder) {
console.error('Invalid order parameters')
} else if (error instanceof ccxt.RateLimitExceeded) {
console.error('Rate limit hit - wait before retrying')
await exchange.sleep(1000) // Wait 1 second
} else if (error instanceof ccxt.AuthenticationError) {
console.error('Check your API credentials')
}
}async function fetchWithRetry(maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError && i < maxRetries - 1) {
console.log(`Retry ${i + 1}/${maxRetries}`)
await exchange.sleep(1000 * (i + 1)) // Exponential backoff
} else {
throw error
}
}
}
}const exchange = new ccxt.binance({
enableRateLimit: true // Automatically throttles requests
})await exchange.fetchTicker('BTC/USDT')
await exchange.sleep(1000) // Wait 1 second
await exchange.fetchTicker('ETH/USDT')console.log(exchange.rateLimit) // Milliseconds between requestsawait// Wrong - returns Promise, not data
const ticker = exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // ERROR: ticker is a Promise!
// Correct
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // Works!// Wrong - wastes rate limits, slow
while (true) {
const ticker = await exchange.fetchTicker('BTC/USDT') // REST
console.log(ticker.last)
await exchange.sleep(1000)
}
// Correct - use WebSocket
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT') // WebSocket
console.log(ticker.last)
}// Wrong - memory leak
const exchange = new ccxt.pro.binance()
const ticker = await exchange.watchTicker('BTC/USDT')
// Forgot to close!
// Correct
const exchange = new ccxt.pro.binance()
try {
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker)
}
} finally {
await exchange.close()
}// Wrong - nonce conflicts
const ex1 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
const ex2 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await ex1.fetchBalance()
await ex2.fetchBalance() // May fail due to nonce issues!
// Correct - reuse single instance
const exchange = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await exchange.fetchBalance()
await exchange.fetchBalance()// Wrong - may hit rate limits
const exchange = new ccxt.binance()
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // May fail!
}
// Correct
const exchange = new ccxt.binance({ enableRateLimit: true })
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // Automatically throttled
}<script src="https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js"></script>
<script>
const exchange = new ccxt.binance()
exchange.loadMarkets().then(() => {
return exchange.fetchTicker('BTC/USDT')
}).then(ticker => {
console.log(ticker)
})
</script>import ccxt from 'https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)npm install ccxtenableRateLimit: truebalance.BTC.freewatch*// Enable verbose logging
exchange.verbose = true
// Check exchange capabilities
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOrderBook: true,
// createOrder: true,
// ...
// }
// Check market information
console.log(exchange.markets['BTC/USDT'])
// Check last request/response
console.log(exchange.last_http_response)
console.log(exchange.last_json_response)