
CCXT for PHP
FreeIntegrate cryptocurrency exchanges seamlessly in PHP.
Free ยท Opens the source repo
What CCXT for PHP does
CCXT for PHP is a powerful library designed for PHP developers looking to integrate cryptocurrency exchange functionalities into their applications. This library provides comprehensive support for both REST and WebSocket APIs, allowing for both synchronous and asynchronous operations. Whether you are building trading bots, web applications, or any project that requires interaction with cryptocurrency exchanges, CCXT simplifies the process of connecting to various platforms, fetching market data, and managing orders.
Installation is straightforward via Composer, ensuring that you can quickly get started with minimal setup. CCXT requires certain PHP extensions, such as cURL and mbstring, to function properly, and it also supports ReactPHP for asynchronous operations. The library covers a wide range of operations including loading markets, fetching tickers, managing orders, and monitoring balances, making it a versatile tool for developers.
For real-time data, CCXT offers WebSocket support, enabling developers to receive live updates on market prices and order books. This is particularly beneficial for applications that require continuous data streams, such as trading platforms or market analysis tools. The library is compatible with PHP 8.1 and above, ensuring that you can leverage the latest PHP features while developing your applications.
In summary, CCXT for PHP is an essential tool for developers working in the cryptocurrency space, providing the necessary functionalities to interact with exchanges efficiently and effectively. Its support for both synchronous and asynchronous operations makes it suitable for a variety of use cases, from simple data retrieval to complex trading strategies.
When to use it
Use this skill when developing PHP applications that require interaction with cryptocurrency exchanges, such as trading bots or market analysis tools.
When not to use it
This skill may not be suitable for applications that do not require real-time data or those built in languages other than PHP.
What you can build with it
Building a Trading Bot
Develop a trading bot that connects to various cryptocurrency exchanges, fetches market data, and places orders based on predefined strategies.
Real-time Market Monitoring
Create an application that streams live market data using WebSocket APIs to provide users with up-to-date information on cryptocurrency prices.
Portfolio Management Application
Build a web application that allows users to manage their cryptocurrency portfolios, track balances, and view transaction histories.
How to install CCXT for PHP
View source1. Install with the skills CLI
npx skills add ccxt/ccxt/ccxt-php --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by ccxtCCXT for PHP
A comprehensive guide to using CCXT in PHP projects for cryptocurrency exchange integration.
Installation
Via Composer (REST and WebSocket)
composer require ccxt/ccxt
Required PHP Extensions
- cURL
- mbstring (UTF-8)
- PCRE
- iconv
- gmp (for some exchanges)
Optional for Async/WebSocket
- ReactPHP (installed automatically with ccxt)
Quick Start
REST API - Synchronous
<?php
date_default_timezone_set('UTC'); // Required!
require_once 'vendor/autoload.php';
$exchange = new \ccxt\binance();
$exchange->load_markets();
$ticker = $exchange->fetch_ticker('BTC/USDT');
print_r($ticker);
REST API - Asynchronous (ReactPHP)
<?php
use function React\Async\await;
date_default_timezone_set('UTC');
require_once 'vendor/autoload.php';
$exchange = new \ccxt\async\binance();
$ticker = await($exchange->fetch_ticker('BTC/USDT'));
print_r($ticker);
WebSocket API - Real-time Updates
<?php
use function React\Async\await;
use function React\Async\async;
date_default_timezone_set('UTC');
require_once 'vendor/autoload.php';
$exchange = new \ccxt\pro\binance();
while (true) {
$ticker = await($exchange->watch_ticker('BTC/USDT'));
print_r($ticker); // Live updates!
}
await($exchange->close());
REST vs WebSocket
| Mode | REST | WebSocket |
|---|---|---|
| Sync | \ccxt\binance() | (WebSocket requires async) |
| Async | \ccxt\async\binance() | \ccxt\pro\binance() |
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | fetch_* (fetch_ticker, fetch_order_book) | watch_* (watch_ticker, watch_order_book) |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
Creating Exchange Instance
REST API - Synchronous
<?php
date_default_timezone_set('UTC');
require_once 'vendor/autoload.php';
// Public API (no authentication)
$exchange = new \ccxt\binance([
'enableRateLimit' => true // Recommended!
]);
// Private API (with authentication)
$exchange = new \ccxt\binance([
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET',
'enableRateLimit' => true
]);
REST API - Asynchronous
<?php
use function React\Async\await;
$exchange = new \ccxt\async\binance([
'enableRateLimit' => true
]);
$ticker = await($exchange->fetch_ticker('BTC/USDT'));
WebSocket API
<?php
use function React\Async\await;
// Public WebSocket
$exchange = new \ccxt\pro\binance();
// Private WebSocket (with authentication)
$exchange = new \ccxt\pro\binance([
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET'
]);
// Always close when done
await($exchange->close());
Common REST Operations
Loading Markets
// Load all available trading pairs
$exchange->load_markets();
// Access market information
$btc_market = $exchange->market('BTC/USDT');
print_r($btc_market['limits']['amount']['min']); // Minimum order amount
Fetching Ticker
// Single ticker
$ticker = $exchange->fetch_ticker('BTC/USDT');
print_r($ticker['last']); // Last price
print_r($ticker['bid']); // Best bid
print_r($ticker['ask']); // Best ask
print_r($ticker['volume']); // 24h volume
// Multiple tickers (if supported)
$tickers = $exchange->fetch_tickers(['BTC/USDT', 'ETH/USDT']);
Fetching Order Book
// Full orderbook
$orderbook = $exchange->fetch_order_book('BTC/USDT');
print_r($orderbook['bids'][0]); // [price, amount]
print_r($orderbook['asks'][0]); // [price, amount]
// Limited depth
$orderbook = $exchange->fetch_order_book('BTC/USDT', 5); // Top 5 levels
Creating Orders
Limit Order
// Buy limit order
$order = $exchange->create_limit_buy_order('BTC/USDT', 0.01, 50000);
print_r($order['id']);
// Sell limit order
$order = $exchange->create_limit_sell_order('BTC/USDT', 0.01, 60000);
// Generic limit order
$order = $exchange->create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000);
Market Order
// Buy market order
$order = $exchange->create_market_buy_order('BTC/USDT', 0.01);
// Sell market order
$order = $exchange->create_market_sell_order('BTC/USDT', 0.01);
// Generic market order
$order = $exchange->create_order('BTC/USDT', 'market', 'sell', 0.01);
Fetching Balance
$balance = $exchange->fetch_balance();
print_r($balance['BTC']['free']); // Available balance
print_r($balance['BTC']['used']); // Balance in orders
print_r($balance['BTC']['total']); // Total balance
Fetching Orders
// Open orders
$open_orders = $exchange->fetch_open_orders('BTC/USDT');
// Closed orders
$closed_orders = $exchange->fetch_closed_orders('BTC/USDT');
// All orders (open + closed)
$all_orders = $exchange->fetch_orders('BTC/USDT');
// Single order by ID
$order = $exchange->fetch_order($order_id, 'BTC/USDT');
Fetching Trades
// Recent public trades
$trades = $exchange->fetch_trades('BTC/USDT', null, 10);
// Your trades (requires authentication)
$my_trades = $exchange->fetch_my_trades('BTC/USDT');
Canceling Orders
// Cancel single order
$exchange->cancel_order($order_id, 'BTC/USDT');
// Cancel all orders for a symbol
$exchange->cancel_all_orders('BTC/USDT');
WebSocket Operations (Real-time)
Watching Ticker (Live Price Updates)
<?php
use function React\Async\await;
$exchange = new \ccxt\pro\binance();
while (true) {
$ticker = await($exchange->watch_ticker('BTC/USDT'));
print_r($ticker['last']);
}
await($exchange->close());
Watching Order Book (Live Depth Updates)
<?php
use function React\Async\await;
$exchange = new \ccxt\pro\binance();
while (true) {
$orderbook = await($exchange->watch_order_book('BTC/USDT'));
print_r('Best bid: ' . $orderbook['bids'][0][0]);
print_r('Best ask: ' . $orderbook['asks'][0][0]);
}
await($exchange->close());
Watching Trades (Live Trade Stream)
<?php
use function React\Async\await;
$exchange = new \ccxt\pro\binance();
while (true) {
$trades = await($exchange->watch_trades('BTC/USDT'));
foreach ($trades as $trade) {
print_r($trade['price'] . ' ' . $trade['amount'] . ' ' . $trade['side']);
}
}
await($exchange->close());
Watching Your Orders (Live Order Updates)
<?php
use function React\Async\await;
$exchange = new \ccxt\pro\binance([
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET'
]);
while (true) {
$orders = await($exchange->watch_orders('BTC/USDT'));
foreach ($orders as $order) {
print_r($order['id'] . ' ' . $order['status'] . ' ' . $order['filled']);
}
}
await($exchange->close());
Watching Balance (Live Balance Updates)
<?php
use function React\Async\await;
$exchange = new \ccxt\pro\binance([
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET'
]);
while (true) {
$balance = await($exchange->watch_balance());
print_r('BTC: ' . $balance['BTC']['total']);
}
await($exchange->close());
Complete Method Reference
Market Data Methods
Tickers & Prices
fetchTicker(symbol)- Fetch ticker for one symbolfetchTickers([symbols])- Fetch multiple tickers at oncefetchBidsAsks([symbols])- Fetch best bid/ask for multiple symbolsfetchLastPrices([symbols])- Fetch last pricesfetchMarkPrices([symbols])- Fetch mark prices (derivatives)
Order Books
fetchOrderBook(symbol, limit)- Fetch order bookfetchOrderBooks([symbols])- Fetch multiple order booksfetchL2OrderBook(symbol)- Fetch level 2 order bookfetchL3OrderBook(symbol)- Fetch level 3 order book (if supported)
Trades
fetchTrades(symbol, since, limit)- Fetch public tradesfetchMyTrades(symbol, since, limit)- Fetch your trades (auth required)fetchOrderTrades(orderId, symbol)- Fetch trades for specific order
OHLCV (Candlesticks)
fetchOHLCV(symbol, timeframe, since, limit)- Fetch candlestick datafetchIndexOHLCV(symbol, timeframe)- Fetch index price OHLCVfetchMarkOHLCV(symbol, timeframe)- Fetch mark price OHLCVfetchPremiumIndexOHLCV(symbol, timeframe)- Fetch premium index OHLCV
Account & Balance
fetchBalance()- Fetch account balance (auth required)fetchAccounts()- Fetch sub-accountsfetchLedger(code, since, limit)- Fetch ledger historyfetchLedgerEntry(id, code)- Fetch specific ledger entryfetchTransactions(code, since, limit)- Fetch transactionsfetchDeposits(code, since, limit)- Fetch deposit historyfetchWithdrawals(code, since, limit)- Fetch withdrawal historyfetchDepositsWithdrawals(code, since, limit)- Fetch both deposits and withdrawals
Trading Methods
Creating Orders
createOrder(symbol, type, side, amount, price, params)- Create order (generic)createLimitOrder(symbol, side, amount, price)- Create limit ordercreateMarketOrder(symbol, side, amount)- Create market ordercreateLimitBuyOrder(symbol, amount, price)- Buy limit ordercreateLimitSellOrder(symbol, amount, price)- Sell limit ordercreateMarketBuyOrder(symbol, amount)- Buy market ordercreateMarketSellOrder(symbol, amount)- Sell market ordercreateMarketBuyOrderWithCost(symbol, cost)- Buy with specific costcreateStopLimitOrder(symbol, side, amount, price, stopPrice)- Stop-limit ordercreateStopMarketOrder(symbol, side, amount, stopPrice)- Stop-market ordercreateStopLossOrder(symbol, side, amount, stopPrice)- Stop-loss ordercreateTakeProfitOrder(symbol, side, amount, takeProfitPrice)- Take-profit ordercreateTrailingAmountOrder(symbol, side, amount, trailingAmount)- Trailing stopcreateTrailingPercentOrder(symbol, side, amount, trailingPercent)- Trailing stop %createTriggerOrder(symbol, side, amount, triggerPrice)- Trigger ordercreatePostOnlyOrder(symbol, side, amount, price)- Post-only ordercreateReduceOnlyOrder(symbol, side, amount, price)- Reduce-only ordercreateOrders([orders])- Create multiple orders at oncecreateOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)- OCO order
Managing Orders
fetchOrder(orderId, symbol)- Fetch single orderfetchOrders(symbol, since, limit)- Fetch all ordersfetchOpenOrders(symbol, since, limit)- Fetch open ordersfetchClosedOrders(symbol, since, limit)- Fetch closed ordersfetchCanceledOrders(symbol, since, limit)- Fetch canceled ordersfetchOpenOrder(orderId, symbol)- Fetch specific open orderfetchOrdersByStatus(status, symbol)- Fetch orders by statuscancelOrder(orderId, symbol)- Cancel single ordercancelOrders([orderIds], symbol)- Cancel multiple orderscancelAllOrders(symbol)- Cancel all orders for symboleditOrder(orderId, symbol, type, side, amount, price)- Modify order
Margin & Leverage
fetchBorrowRate(code)- Fetch borrow rate for marginfetchBorrowRates([codes])- Fetch multiple borrow ratesfetchBorrowRateHistory(code, since, limit)- Historical borrow ratesfetchCrossBorrowRate(code)- Cross margin borrow ratefetchIsolatedBorrowRate(symbol, code)- Isolated margin borrow rateborrowMargin(code, amount, symbol)- Borrow marginrepayMargin(code, amount, symbol)- Repay marginfetchLeverage(symbol)- Fetch leveragesetLeverage(leverage, symbol)- Set leveragefetchLeverageTiers(symbols)- Fetch leverage tiersfetchMarketLeverageTiers(symbol)- Leverage tiers for marketsetMarginMode(marginMode, symbol)- Set margin mode (cross/isolated)fetchMarginMode(symbol)- Fetch margin mode
Derivatives & Futures
Positions
fetchPosition(symbol)- Fetch single positionfetchPositions([symbols])- Fetch all positionsfetchPositionsForSymbol(symbol)- Fetch positions for symbolfetchPositionHistory(symbol, since, limit)- Position historyfetchPositionsHistory(symbols, since, limit)- Multiple position historyfetchPositionMode(symbol)- Fetch position mode (one-way/hedge)setPositionMode(hedged, symbol)- Set position modeclosePosition(symbol, side)- Close positioncloseAllPositions()- Close all positions
Funding & Settlement
fetchFundingRate(symbol)- Current funding ratefetchFundingRates([symbols])- Multiple funding ratesfetchFundingRateHistory(symbol, since, limit)- Funding rate historyfetchFundingHistory(symbol, since, limit)- Your funding paymentsfetchFundingInterval(symbol)- Funding intervalfetchSettlementHistory(symbol, since, limit)- Settlement historyfetchMySettlementHistory(symbol, since, limit)- Your settlement history
Open Interest & Liquidations
fetchOpenInterest(symbol)- Open interest for symbolfetchOpenInterests([symbols])- Multiple open interestsfetchOpenInterestHistory(symbol, timeframe, since, limit)- OI historyfetchLiquidations(symbol, since, limit)- Public liquidationsfetchMyLiquidations(symbol, since, limit)- Your liquidations
Options
fetchOption(symbol)- Fetch option infofetchOptionChain(code)- Fetch option chainfetchGreeks(symbol)- Fetch option greeksfetchVolatilityHistory(code, since, limit)- Volatility historyfetchUnderlyingAssets()- Fetch underlying assets
Fees & Limits
fetchTradingFee(symbol)- Trading fee for symbolfetchTradingFees([symbols])- Trading fees for multiple symbolsfetchTradingLimits([symbols])- Trading limitsfetchTransactionFee(code)- Transaction/withdrawal feefetchTransactionFees([codes])- Multiple transaction feesfetchDepositWithdrawFee(code)- Deposit/withdrawal feefetchDepositWithdrawFees([codes])- Multiple deposit/withdraw fees
Deposits & Withdrawals
fetchDepositAddress(code, params)- Get deposit addressfetchDepositAddresses([codes])- Multiple deposit addressesfetchDepositAddressesByNetwork(code)- Addresses by networkcreateDepositAddress(code, params)- Create new deposit addressfetchDeposit(id, code)- Fetch single depositfetchWithdrawal(id, code)- Fetch single withdrawalfetchWithdrawAddresses(code)- Fetch withdrawal addressesfetchWithdrawalWhitelist(code)- Fetch whitelistwithdraw(code, amount, address, tag, params)- Withdraw fundsdeposit(code, amount, params)- Deposit funds (if supported)
Transfer & Convert
transfer(code, amount, fromAccount, toAccount)- Internal transferfetchTransfer(id, code)- Fetch transfer infofetchTransfers(code, since, limit)- Fetch transfer historyfetchConvertCurrencies()- Currencies available for convertfetchConvertQuote(fromCode, toCode, amount)- Get conversion quotecreateConvertTrade(fromCode, toCode, amount)- Execute conversionfetchConvertTrade(id)- Fetch convert tradefetchConvertTradeHistory(code, since, limit)- Convert history
Market Info
fetchMarkets()- Fetch all marketsfetchCurrencies()- Fetch all currenciesfetchTime()- Fetch exchange server timefetchStatus()- Fetch exchange statusfetchBorrowInterest(code, symbol, since, limit)- Borrow interest paidfetchLongShortRatio(symbol, timeframe, since, limit)- Long/short ratiofetchLongShortRatioHistory(symbol, timeframe, since, limit)- L/S ratio history
WebSocket Methods (ccxt.pro)
All REST methods have WebSocket equivalents with watch* prefix:
Real-time Market Data
watchTicker(symbol)- Watch single tickerwatchTickers([symbols])- Watch multiple tickerswatchOrderBook(symbol)- Watch order book updateswatchOrderBookForSymbols([symbols])- Watch multiple order bookswatchTrades(symbol)- Watch public tradeswatchOHLCV(symbol, timeframe)- Watch candlestick updateswatchBidsAsks([symbols])- Watch best bid/ask
Real-time Account Data (Auth Required)
watchBalance()- Watch balance updateswatchOrders(symbol)- Watch your order updateswatchMyTrades(symbol)- Watch your trade updateswatchPositions([symbols])- Watch position updateswatchPositionsForSymbol(symbol)- Watch positions for symbol
Authentication Required
Methods marked with ๐ require API credentials:
- All
create*methods (creating orders, addresses) - All
cancel*methods (canceling orders) - All
edit*methods (modifying orders) - All
fetchMy*methods (your trades, orders) fetchBalance,fetchLedger,fetchAccountswithdraw,transfer,deposit- Margin/leverage methods
- Position methods
watchBalance,watchOrders,watchMyTrades,watchPositions
Checking Method Availability
Not all exchanges support all methods. Check before using:
// 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,
// ...
// }
Method Naming Convention
fetch*- REST API methods (HTTP requests)watch*- WebSocket methods (real-time streams)create*- Create new resources (orders, addresses)cancel*- Cancel existing resourcesedit*- Modify existing resourcesset*- Configure settings (leverage, margin mode)*Wssuffix - WebSocket variant (some exchanges)
Proxy Configuration
CCXT supports HTTP, HTTPS, and SOCKS proxies for both REST and WebSocket connections.
Setting Proxy
// 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'
Proxy for WebSocket
WebSocket connections also respect proxy settings:
exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxy
Testing Proxy Connection
exchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}
WebSocket-Specific Methods
Some exchanges provide WebSocket variants of REST methods for faster order placement and management. These use the *Ws suffix:
Trading via WebSocket
Creating Orders:
createOrderWs- Create order via WebSocket (faster than REST)createLimitOrderWs- Create limit order via WebSocketcreateMarketOrderWs- Create market order via WebSocketcreateLimitBuyOrderWs- Buy limit order via WebSocketcreateLimitSellOrderWs- Sell limit order via WebSocketcreateMarketBuyOrderWs- Buy market order via WebSocketcreateMarketSellOrderWs- Sell market order via WebSocketcreateStopLimitOrderWs- Stop-limit order via WebSocketcreateStopMarketOrderWs- Stop-market order via WebSocketcreateStopLossOrderWs- Stop-loss order via WebSocketcreateTakeProfitOrderWs- Take-profit order via WebSocketcreateTrailingAmountOrderWs- Trailing stop via WebSocketcreateTrailingPercentOrderWs- Trailing stop % via WebSocketcreatePostOnlyOrderWs- Post-only order via WebSocketcreateReduceOnlyOrderWs- Reduce-only order via WebSocket
Managing Orders:
editOrderWs- Edit order via WebSocketcancelOrderWs- Cancel order via WebSocket (faster than REST)cancelOrdersWs- Cancel multiple orders via WebSocketcancelAllOrdersWs- Cancel all orders via WebSocket
Fetching Data:
fetchOrderWs- Fetch order via WebSocketfetchOrdersWs- Fetch orders via WebSocketfetchOpenOrdersWs- Fetch open orders via WebSocketfetchClosedOrdersWs- Fetch closed orders via WebSocketfetchMyTradesWs- Fetch your trades via WebSocketfetchBalanceWs- Fetch balance via WebSocketfetchPositionWs- Fetch position via WebSocketfetchPositionsWs- Fetch positions via WebSocketfetchPositionsForSymbolWs- Fetch positions for symbol via WebSocketfetchTradingFeesWs- Fetch trading fees via WebSocket
When to Use WebSocket Methods
Use *Ws methods when:
- You need faster order placement (lower latency)
- You're already connected via WebSocket
- You want to reduce REST API rate limit usage
- Trading strategies require sub-100ms latency
Use REST methods when:
- You need guaranteed execution confirmation
- You're making one-off requests
- The exchange doesn't support the WebSocket variant
- You need detailed error responses
Example: Order Placement Comparison
REST API (slower, more reliable):
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket API (faster, lower latency):
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
Checking WebSocket Method Availability
Not all exchanges support WebSocket trading methods:
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)
}
Authentication
Setting API Keys
<?php
// During instantiation (recommended)
$exchange = new \ccxt\binance([
'apiKey' => getenv('BINANCE_API_KEY'),
'secret' => getenv('BINANCE_SECRET'),
'enableRateLimit' => true
]);
// After instantiation
$exchange->apiKey = getenv('BINANCE_API_KEY');
$exchange->secret = getenv('BINANCE_SECRET');
Testing Authentication
try {
$balance = $exchange->fetch_balance();
print_r('Authentication successful!');
} catch (\ccxt\AuthenticationError $e) {
print_r('Invalid API credentials');
}
Error Handling
Exception Hierarchy
BaseError
โโ NetworkError (recoverable - retry)
โ โโ RequestTimeout
โ โโ ExchangeNotAvailable
โ โโ RateLimitExceeded
โ โโ DDoSProtection
โโ ExchangeError (non-recoverable - don't retry)
โโ AuthenticationError
โโ InsufficientFunds
โโ InvalidOrder
โโ NotSupported
Basic Error Handling
<?php
try {
$ticker = $exchange->fetch_ticker('BTC/USDT');
} catch (\ccxt\NetworkError $e) {
echo 'Network error - retry: ' . $e->getMessage();
} catch (\ccxt\ExchangeError $e) {
echo 'Exchange error - do not retry: ' . $e->getMessage();
} catch (\Exception $e) {
echo 'Unknown error: ' . $e->getMessage();
}
Specific Exception Handling
<?php
try {
$order = $exchange->create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000);
} catch (\ccxt\InsufficientFunds $e) {
echo 'Not enough balance';
} catch (\ccxt\InvalidOrder $e) {
echo 'Invalid order parameters';
} catch (\ccxt\RateLimitExceeded $e) {
echo 'Rate limit hit - wait before retrying';
sleep(1); // Wait 1 second
} catch (\ccxt\AuthenticationError $e) {
echo 'Check your API credentials';
}
Retry Logic for Network Errors
<?php
function fetch_with_retry($exchange, $max_retries = 3) {
for ($i = 0; $i < $max_retries; $i++) {
try {
return $exchange->fetch_ticker('BTC/USDT');
} catch (\ccxt\NetworkError $e) {
if ($i < $max_retries - 1) {
echo "Retry " . ($i + 1) . "/$max_retries\n";
sleep(1 * ($i + 1)); // Exponential backoff
} else {
throw $e;
}
}
}
}
Rate Limiting
Built-in Rate Limiter (Recommended)
$exchange = new \ccxt\binance([
'enableRateLimit' => true // Automatically throttles requests
]);
Manual Delays
$exchange->fetch_ticker('BTC/USDT');
usleep($exchange->rateLimit * 1000); // Convert ms to microseconds
$exchange->fetch_ticker('ETH/USDT');
Checking Rate Limit
print_r($exchange->rateLimit); // Milliseconds between requests
Common Pitfalls
Forgetting Timezone Setting
// Wrong - will cause errors
<?php
require_once 'vendor/autoload.php';
$exchange = new \ccxt\binance(); // ERROR!
// Correct
<?php
date_default_timezone_set('UTC'); // Required!
require_once 'vendor/autoload.php';
$exchange = new \ccxt\binance();
Wrong Namespace Format
// Wrong - missing leading backslash
$exchange = new ccxt\binance(); // May fail!
// Correct
$exchange = new \ccxt\binance(); // Leading backslash!
Using REST for Real-time Monitoring
// Wrong - wastes rate limits
while (true) {
$ticker = $exchange->fetch_ticker('BTC/USDT'); // REST
print_r($ticker['last']);
sleep(1);
}
// Correct - use WebSocket
use function React\Async\await;
$exchange = new \ccxt\pro\binance();
while (true) {
$ticker = await($exchange->watch_ticker('BTC/USDT')); // WebSocket
print_r($ticker['last']);
}
Not Closing WebSocket Connections
// Wrong - memory leak
$exchange = new \ccxt\pro\binance();
$ticker = await($exchange->watch_ticker('BTC/USDT'));
// Forgot to close!
// Correct
$exchange = new \ccxt\pro\binance();
try {
while (true) {
$ticker = await($exchange->watch_ticker('BTC/USDT'));
}
} finally {
await($exchange->close());
}
Not Checking PHP Extensions
// Check required extensions before running
<?php
$required = ['curl', 'mbstring', 'iconv', 'gmp'];
foreach ($required as $ext) {
if (!extension_loaded($ext)) {
die("Error: $ext extension is not loaded\n");
}
}
Troubleshooting
Common Issues
1. "date_default_timezone_get(): Invalid date.timezone"
- Solution: Add
date_default_timezone_set('UTC');at the top
2. "Class 'ccxt\binance' not found"
- Solution: Run
composer require ccxt/ccxt - Check you're using
\ccxt\binancewith leading backslash
3. "RateLimitExceeded"
- Solution: Enable rate limiter:
'enableRateLimit' => true
4. "AuthenticationError"
- Solution: Check API key and secret
- Verify API key permissions on exchange
- Check system clock is synced
5. "InvalidNonce"
- Solution: Sync system clock
- Use only one exchange instance per API key
6. Missing PHP extensions
- Solution: Install required extensions:
- Ubuntu/Debian:
apt-get install php-curl php-mbstring php-gmp - macOS: Usually pre-installed
- Windows: Enable in php.ini
- Ubuntu/Debian:
Debugging
// Enable verbose logging
$exchange->verbose = true;
// Check exchange capabilities
print_r($exchange->has);
// Array(
// 'fetchTicker' => true,
// 'fetchOrderBook' => true,
// 'createOrder' => true,
// ...
// )
// Check market information
print_r($exchange->markets['BTC/USDT']);
// Check last request/response
print_r($exchange->last_http_response);
print_r($exchange->last_json_response);
Prediction Markets
CCXT supports prediction-market exchanges (Polymarket, Kalshi, Limitless, Myriad, Hyperliquid) under a dedicated \ccxt\prediction namespace (async-only, ReactPHP โ \ccxt\prediction\<id> IS the async class). They use the same unified API, but prices are quoted 0โ1 (USDC per outcome share) and the tradeable unit is an outcome (e.g. a market's YES/NO token), not a regular market symbol.
use React\Async;
// async-only (ReactPHP)
$exchange = new \ccxt\prediction\polymarket();
Async\await($exchange->load_markets());
// discover events -> markets -> outcomes
$events = Async\await($exchange->fetch_events(['query' => 'Trump']));
$outcome = $events[0]['markets'][0]['outcomes'][0];
// each outcome has: outcome (handle, e.g. 'TRUMP_OUT_PRESIDENT_2027:YES'),
// outcomeId, market, label ('YES'/'NO')
$handle = $outcome['outcome'];
$ticker = Async\await($exchange->fetch_ticker($handle));
$book = Async\await($exchange->fetch_order_book($handle));
// limit buy 5 YES shares @ 0.40 USDC (price is 0..1 per share)
$order = Async\await($exchange->create_order($handle, 'limit', 'buy', 5, 0.40));
Async\await($exchange->cancel_order($order['id'], $handle));
- Price/trade methods (
fetch_ticker,fetch_order_book,fetch_ohlcv,fetch_trades,create_order,cancel_order, โฆ) take an outcome handle or outcomeId (theoutcome/outcomesparameter), notsymbol. - Check support with
$exchange->has['prediction']; discover markets viafetch_events/fetch_event(orload_markets).
Learn More
Frequently asked questions about CCXT for PHP
Similar skills
WinMD API Search
Easily find and explore Windows desktop APIs.
WebMCPify
Transform any web app into an agent-ready platform.
Phoenix Tracing
Instrument LLM applications with OpenInference tracing.
Foundry Hosted Agent CopilotKit
Guidance for developing agentic web apps on Azure.
Power Automate Foundation
Connect AI agents to Power Automate seamlessly.
Power Automate Flow Builder
Efficiently build and deploy Power Automate flows programmatically.
